added timestamp options to url builder
This commit is contained in:
parent
eade8d6967
commit
7cfb715e0c
|
@ -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]"]
|
||||||
|
|
|
@ -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=×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