From c6b305188793a4e6313ccc81964370c9e80f5445 Mon Sep 17 00:00:00 2001 From: TotallyNot <44345987+TotallyNot@users.noreply.github.com> Date: Sat, 9 Mar 2024 20:01:07 +0100 Subject: [PATCH] added timestamp options to url builder --- torn-api/Cargo.toml | 2 +- torn-api/src/lib.rs | 141 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 128 insertions(+), 15 deletions(-) diff --git a/torn-api/Cargo.toml b/torn-api/Cargo.toml index 10a1e82..187b0db 100644 --- a/torn-api/Cargo.toml +++ b/torn-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "torn-api" -version = "0.6.5" +version = "0.6.6" edition = "2021" rust-version = "1.75.0" authors = ["Pyrit [2111649]"] diff --git a/torn-api/src/lib.rs b/torn-api/src/lib.rs index fd0bbec..cec01e7 100644 --- a/torn-api/src/lib.rs +++ b/torn-api/src/lib.rs @@ -167,8 +167,7 @@ where A: ApiSelection, { pub selections: Vec<&'static str>, - pub from: Option, - pub to: Option, + pub query_items: Vec<(&'static str, String)>, pub comment: Option, phantom: std::marker::PhantomData, } @@ -180,8 +179,7 @@ where fn default() -> Self { Self { selections: Vec::default(), - from: None, - to: None, + query_items: Vec::default(), comment: None, phantom: Default::default(), } @@ -192,6 +190,14 @@ impl ApiRequest where 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 { let mut url = format!("https://api.torn.com/{}/", A::category()); @@ -201,12 +207,8 @@ where write!(url, "?selections={}&key={}", self.selections.join(","), key).unwrap(); - if let Some(from) = self.from { - write!(url, "&from={}", from).unwrap(); - } - - if let Some(to) = self.to { - write!(url, "&to={}", to).unwrap(); + for (name, value) in &self.query_items { + write!(url, "&{name}={value}").unwrap(); } if let Some(comment) = &self.comment { @@ -254,25 +256,37 @@ where #[must_use] pub fn from(mut self, from: DateTime) -> Self { - self.request.from = Some(from.timestamp()); + self.request.add_query_item("from", from.timestamp()); self } #[must_use] pub fn from_timestamp(mut self, from: i64) -> Self { - self.request.from = Some(from); + self.request.add_query_item("from", from); self } #[must_use] pub fn to(mut self, to: DateTime) -> Self { - self.request.to = Some(to.timestamp()); + self.request.add_query_item("to", to.timestamp()); self } #[must_use] 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) -> Self { + self.request.add_query_item("timestamp", dt.timestamp()); self } @@ -344,4 +358,103 @@ pub(crate) mod tests { Client::default().torn_api(key).user(|b| b).await.unwrap(); } + + #[test] + fn url_builder_from_dt() { + let url = ApiRequestBuilder::::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::::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::::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::::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::::default() + .stats_datetime(DateTime::default()) + .request + .url("", None); + + assert_eq!( + "https://api.torn.com/user/?selections=&key=×tamp=0", + url + ); + } + + #[test] + fn url_builder_timestamp_ts() { + let url = ApiRequestBuilder::::default() + .stats_timestamp(12345) + .request + .url("", None); + + assert_eq!( + "https://api.torn.com/user/?selections=&key=×tamp=12345", + url + ); + } + + #[test] + fn url_builder_duplicate() { + let url = ApiRequestBuilder::::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::::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×tamp=12345", + url + ); + } }