revert part of the typings for single requests

This commit is contained in:
TotallyNot 2022-09-19 00:42:34 +02:00
parent 102d02d390
commit 77c50fac64
7 changed files with 97 additions and 72 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "torn-api" name = "torn-api"
version = "0.5.1" version = "0.5.2"
edition = "2021" edition = "2021"
authors = ["Pyrit [2111649]"] authors = ["Pyrit [2111649]"]
license = "MIT" license = "MIT"

View file

@ -47,7 +47,7 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.faction(None, |b| b.selections(&[Selection::Basic])) .faction(|b| b.selections(&[Selection::Basic]))
.await .await
.unwrap(); .unwrap();

View file

@ -180,18 +180,25 @@ where
A: ApiCategoryResponse, A: ApiCategoryResponse,
{ {
request: ApiRequest<A>, request: ApiRequest<A>,
id: Option<i64>,
}
impl<A> Default for ApiRequestBuilder<A>
where
A: ApiCategoryResponse,
{
fn default() -> Self {
Self {
request: Default::default(),
id: None,
}
}
} }
impl<A> ApiRequestBuilder<A> impl<A> ApiRequestBuilder<A>
where where
A: ApiCategoryResponse, A: ApiCategoryResponse,
{ {
pub(crate) fn new() -> Self {
Self {
request: ApiRequest::default(),
}
}
#[must_use] #[must_use]
pub fn selections(mut self, selections: &[A::Selection]) -> Self { pub fn selections(mut self, selections: &[A::Selection]) -> Self {
self.request self.request
@ -217,6 +224,15 @@ where
self.request.comment = Some(comment); self.request.comment = Some(comment);
self self
} }
#[must_use]
pub fn id<I>(mut self, id: I) -> Self
where
I: num_traits::AsPrimitive<i64>,
{
self.id = Some(id.as_());
self
}
} }
#[cfg(test)] #[cfg(test)]
@ -259,11 +275,7 @@ pub(crate) mod tests {
async fn reqwest() { async fn reqwest() {
let key = setup(); let key = setup();
Client::default() Client::default().torn_api(key).user(|b| b).await.unwrap();
.torn_api(key)
.user(None, |b| b)
.await
.unwrap();
} }
#[cfg(feature = "awc")] #[cfg(feature = "awc")]

View file

@ -7,54 +7,48 @@ use crate::{
ApiResponse, DirectExecutor, ApiResponse, DirectExecutor,
}; };
pub struct ApiProvider<'a, C, E, I = i32> pub struct ApiProvider<'a, C, E>
where where
C: ApiClient, C: ApiClient,
E: RequestExecutor<C>, E: RequestExecutor<C>,
I: num_traits::AsPrimitive<i64>,
{ {
client: &'a C, client: &'a C,
executor: E, executor: E,
_marker: std::marker::PhantomData<I>,
} }
impl<'a, C, E, I> ApiProvider<'a, C, E, I> impl<'a, C, E> ApiProvider<'a, C, E>
where where
C: ApiClient, C: ApiClient,
E: RequestExecutor<C>, E: RequestExecutor<C>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
{ {
pub fn new(client: &'a C, executor: E) -> ApiProvider<'a, C, E, I> { pub fn new(client: &'a C, executor: E) -> ApiProvider<'a, C, E> {
Self { Self { client, executor }
client,
executor,
_marker: Default::default(),
}
} }
pub async fn user<F>(&self, id: Option<I>, build: F) -> Result<user::Response, E::Error> pub async fn user<F>(&self, build: F) -> Result<user::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>, F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn users<F, L>( pub async fn users<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<user::Response, E::Error>> ) -> HashMap<I, Result<user::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>, F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
@ -69,28 +63,30 @@ where
.collect() .collect()
} }
pub async fn faction<F>(&self, id: Option<I>, build: F) -> Result<faction::Response, E::Error> pub async fn faction<F>(&self, build: F) -> Result<faction::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>, F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn factions<F, L>( pub async fn factions<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<faction::Response, E::Error>> ) -> HashMap<I, Result<faction::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>, F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
@ -105,28 +101,30 @@ where
.collect() .collect()
} }
pub async fn torn<F>(&self, id: Option<I>, build: F) -> Result<torn::Response, E::Error> pub async fn torn<F>(&self, build: F) -> Result<torn::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>, F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn torns<F, L>( pub async fn torns<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<torn::Response, E::Error>> ) -> HashMap<I, Result<torn::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>, F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor

View file

@ -7,54 +7,48 @@ use crate::{
ApiResponse, DirectExecutor, ApiResponse, DirectExecutor,
}; };
pub struct ApiProvider<'a, C, E, I = i32> pub struct ApiProvider<'a, C, E>
where where
C: ApiClient, C: ApiClient,
E: RequestExecutor<C>, E: RequestExecutor<C>,
I: num_traits::AsPrimitive<i64>,
{ {
client: &'a C, client: &'a C,
executor: E, executor: E,
_marker: std::marker::PhantomData<I>,
} }
impl<'a, C, E, I> ApiProvider<'a, C, E, I> impl<'a, C, E> ApiProvider<'a, C, E>
where where
C: ApiClient, C: ApiClient,
E: RequestExecutor<C>, E: RequestExecutor<C>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
{ {
pub fn new(client: &'a C, executor: E) -> ApiProvider<'a, C, E, I> { pub fn new(client: &'a C, executor: E) -> ApiProvider<'a, C, E> {
Self { Self { client, executor }
client,
executor,
_marker: Default::default(),
}
} }
pub async fn user<F>(&self, id: Option<I>, build: F) -> Result<user::Response, E::Error> pub async fn user<F>(&self, build: F) -> Result<user::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>, F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn users<F, L>( pub async fn users<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<user::Response, E::Error>> ) -> HashMap<I, Result<user::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>, F: FnOnce(ApiRequestBuilder<user::Response>) -> ApiRequestBuilder<user::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
@ -69,28 +63,30 @@ where
.collect() .collect()
} }
pub async fn faction<F>(&self, id: Option<I>, build: F) -> Result<faction::Response, E::Error> pub async fn faction<F>(&self, build: F) -> Result<faction::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>, F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn factions<F, L>( pub async fn factions<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<faction::Response, E::Error>> ) -> HashMap<I, Result<faction::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>, F: FnOnce(ApiRequestBuilder<faction::Response>) -> ApiRequestBuilder<faction::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
@ -105,28 +101,30 @@ where
.collect() .collect()
} }
pub async fn torn<F>(&self, id: Option<I>, build: F) -> Result<torn::Response, E::Error> pub async fn torn<F>(&self, build: F) -> Result<torn::Response, E::Error>
where where
F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>, F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor
.execute(self.client, builder.request, id.map(|i| i.as_())) .execute(self.client, builder.request, builder.id)
.await .await
} }
pub async fn torns<F, L>( pub async fn torns<F, L, I>(
&self, &self,
ids: L, ids: L,
build: F, build: F,
) -> HashMap<I, Result<torn::Response, E::Error>> ) -> HashMap<I, Result<torn::Response, E::Error>>
where where
F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>, F: FnOnce(ApiRequestBuilder<torn::Response>) -> ApiRequestBuilder<torn::Response>,
I: num_traits::AsPrimitive<i64> + std::hash::Hash + std::cmp::Eq,
i64: num_traits::AsPrimitive<I>,
L: IntoIterator<Item = I>, L: IntoIterator<Item = I>,
{ {
let mut builder = ApiRequestBuilder::new(); let mut builder = ApiRequestBuilder::default();
builder = build(builder); builder = build(builder);
self.executor self.executor

View file

@ -91,7 +91,7 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.torn(None, |b| b.selections(&[Selection::Competition])) .torn(|b| b.selections(&[Selection::Competition]))
.await .await
.unwrap(); .unwrap();

View file

@ -399,7 +399,7 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.user(None, |b| { .user(|b| {
b.selections(&[ b.selections(&[
Selection::Basic, Selection::Basic,
Selection::Discord, Selection::Discord,
@ -424,7 +424,7 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.user(Some(28), |b| b.selections(&[Selection::Profile])) .user(|b| b.id(28).selections(&[Selection::Profile]))
.await .await
.unwrap(); .unwrap();
@ -439,7 +439,7 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.user(None, |b| b.selections(&[Selection::Profile])) .user(|b| b.selections(&[Selection::Profile]))
.await .await
.unwrap(); .unwrap();
@ -453,10 +453,27 @@ mod tests {
let response = Client::default() let response = Client::default()
.torn_api(key) .torn_api(key)
.users([1, 2111649], |b| b.selections(&[Selection::Basic])) .users([1, 2111649, 374272176892674048i64], |b| {
b.selections(&[Selection::Basic])
})
.await; .await;
response.get(&1).as_ref().unwrap().as_ref().unwrap(); response.get(&1).as_ref().unwrap().as_ref().unwrap();
response.get(&2111649).as_ref().unwrap().as_ref().unwrap(); response.get(&2111649).as_ref().unwrap().as_ref().unwrap();
} }
#[async_test]
async fn discord() {
let key = setup();
let basic = Client::default()
.torn_api(key)
.user(|b| b.id(374272176892674048i64).selections(&[Selection::Basic]))
.await
.unwrap()
.basic()
.unwrap();
assert_eq!(basic.player_id, 2111649);
}
} }