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]
name = "torn-api"
version = "0.6.5"
version = "0.6.6"
edition = "2021"
rust-version = "1.75.0"
authors = ["Pyrit [2111649]"]

View file

@ -167,8 +167,7 @@ where
A: ApiSelection,
{
pub selections: Vec<&'static str>,
pub from: Option<i64>,
pub to: Option<i64>,
pub query_items: Vec<(&'static str, String)>,
pub comment: Option<String>,
phantom: std::marker::PhantomData<A>,
}
@ -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<A> ApiRequest<A>
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<Utc>) -> 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<Utc>) -> 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<Utc>) -> 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::<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
);
}
}