added timestamp options to url builder

This commit is contained in:
TotallyNot 2024-03-09 20:01:07 +01:00
parent a103b1323f
commit c6b3051887
2 changed files with 128 additions and 15 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "torn-api" name = "torn-api"
version = "0.6.5" version = "0.6.6"
edition = "2021" edition = "2021"
rust-version = "1.75.0" rust-version = "1.75.0"
authors = ["Pyrit [2111649]"] authors = ["Pyrit [2111649]"]

View file

@ -167,8 +167,7 @@ where
A: ApiSelection, A: ApiSelection,
{ {
pub selections: Vec<&'static str>, pub selections: Vec<&'static str>,
pub from: Option<i64>, pub query_items: Vec<(&'static str, String)>,
pub to: Option<i64>,
pub comment: Option<String>, pub comment: Option<String>,
phantom: std::marker::PhantomData<A>, phantom: std::marker::PhantomData<A>,
} }
@ -180,8 +179,7 @@ where
fn default() -> Self { fn default() -> Self {
Self { Self {
selections: Vec::default(), selections: Vec::default(),
from: None, query_items: Vec::default(),
to: None,
comment: None, comment: None,
phantom: Default::default(), phantom: Default::default(),
} }
@ -192,6 +190,14 @@ impl<A> ApiRequest<A>
where where
A: ApiSelection, A: ApiSelection,
{ {
fn add_query_item(&mut self, name: &'static str, value: impl ToString) {
if let Some((_, old)) = self.query_items.iter_mut().find(|(n, _)| *n == name) {
*old = value.to_string();
} else {
self.query_items.push((name, value.to_string()));
}
}
pub fn url(&self, key: &str, id: Option<&str>) -> String { pub fn url(&self, key: &str, id: Option<&str>) -> String {
let mut url = format!("https://api.torn.com/{}/", A::category()); let mut url = format!("https://api.torn.com/{}/", A::category());
@ -201,12 +207,8 @@ where
write!(url, "?selections={}&key={}", self.selections.join(","), key).unwrap(); write!(url, "?selections={}&key={}", self.selections.join(","), key).unwrap();
if let Some(from) = self.from { for (name, value) in &self.query_items {
write!(url, "&from={}", from).unwrap(); write!(url, "&{name}={value}").unwrap();
}
if let Some(to) = self.to {
write!(url, "&to={}", to).unwrap();
} }
if let Some(comment) = &self.comment { if let Some(comment) = &self.comment {
@ -254,25 +256,37 @@ where
#[must_use] #[must_use]
pub fn from(mut self, from: DateTime<Utc>) -> Self { pub fn from(mut self, from: DateTime<Utc>) -> Self {
self.request.from = Some(from.timestamp()); self.request.add_query_item("from", from.timestamp());
self self
} }
#[must_use] #[must_use]
pub fn from_timestamp(mut self, from: i64) -> Self { pub fn from_timestamp(mut self, from: i64) -> Self {
self.request.from = Some(from); self.request.add_query_item("from", from);
self self
} }
#[must_use] #[must_use]
pub fn to(mut self, to: DateTime<Utc>) -> Self { pub fn to(mut self, to: DateTime<Utc>) -> Self {
self.request.to = Some(to.timestamp()); self.request.add_query_item("to", to.timestamp());
self self
} }
#[must_use] #[must_use]
pub fn to_timestamp(mut self, to: i64) -> Self { pub fn to_timestamp(mut self, to: i64) -> Self {
self.request.to = Some(to); self.request.add_query_item("to", to);
self
}
#[must_use]
pub fn stats_timestamp(mut self, ts: i64) -> Self {
self.request.add_query_item("timestamp", ts);
self
}
#[must_use]
pub fn stats_datetime(mut self, dt: DateTime<Utc>) -> Self {
self.request.add_query_item("timestamp", dt.timestamp());
self self
} }
@ -344,4 +358,103 @@ pub(crate) mod tests {
Client::default().torn_api(key).user(|b| b).await.unwrap(); Client::default().torn_api(key).user(|b| b).await.unwrap();
} }
#[test]
fn url_builder_from_dt() {
let url = ApiRequestBuilder::<user::Selection>::default()
.from(DateTime::default())
.request
.url("", None);
assert_eq!("https://api.torn.com/user/?selections=&key=&from=0", url);
}
#[test]
fn url_builder_from_ts() {
let url = ApiRequestBuilder::<user::Selection>::default()
.from_timestamp(12345)
.request
.url("", None);
assert_eq!(
"https://api.torn.com/user/?selections=&key=&from=12345",
url
);
}
#[test]
fn url_builder_to_dt() {
let url = ApiRequestBuilder::<user::Selection>::default()
.to(DateTime::default())
.request
.url("", None);
assert_eq!("https://api.torn.com/user/?selections=&key=&to=0", url);
}
#[test]
fn url_builder_to_ts() {
let url = ApiRequestBuilder::<user::Selection>::default()
.to_timestamp(12345)
.request
.url("", None);
assert_eq!("https://api.torn.com/user/?selections=&key=&to=12345", url);
}
#[test]
fn url_builder_timestamp_dt() {
let url = ApiRequestBuilder::<user::Selection>::default()
.stats_datetime(DateTime::default())
.request
.url("", None);
assert_eq!(
"https://api.torn.com/user/?selections=&key=&timestamp=0",
url
);
}
#[test]
fn url_builder_timestamp_ts() {
let url = ApiRequestBuilder::<user::Selection>::default()
.stats_timestamp(12345)
.request
.url("", None);
assert_eq!(
"https://api.torn.com/user/?selections=&key=&timestamp=12345",
url
);
}
#[test]
fn url_builder_duplicate() {
let url = ApiRequestBuilder::<user::Selection>::default()
.from(DateTime::default())
.from_timestamp(12345)
.request
.url("", None);
assert_eq!(
"https://api.torn.com/user/?selections=&key=&from=12345",
url
);
}
#[test]
fn url_builder_many_options() {
let url = ApiRequestBuilder::<user::Selection>::default()
.from(DateTime::default())
.to_timestamp(60)
.stats_timestamp(12345)
.selections([user::Selection::PersonalStats])
.request
.url("KEY", Some("1"));
assert_eq!(
"https://api.torn.com/user/1?selections=personalstats&key=KEY&from=0&to=60&timestamp=12345",
url
);
}
} }