added timestamp options to url builder
This commit is contained in:
parent
a103b1323f
commit
c6b3051887
|
@ -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]"]
|
||||
|
|
|
@ -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=×tamp=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=×tamp=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×tamp=12345",
|
||||
url
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue