use crate::client::ResponseExt;
use super::*;
pub(crate) mod client_ext;
#[cfg(feature = "unsupported")]
mod custom;
#[doc(inline)]
pub use client_ext::ClientExtError;
#[cfg(feature = "client")]
impl<C: crate::HttpClient + crate::client::ClientDefault<'static>> Default
for HelixClient<'static, C>
{
fn default() -> Self { Self::new() }
}
#[cfg(feature = "helix")] pub struct HelixClient<'a, C: 'a> {
pub(crate) client: C,
pub(crate) _pd: std::marker::PhantomData<&'a ()>, }
#[cfg(feature = "helix")]
impl<'a, C> Clone for HelixClient<'a, C>
where C: crate::HttpClient + Clone + 'a
{
fn clone(&self) -> Self {
Self {
client: self.client.clone(),
_pd: self._pd,
}
}
}
impl<'a, C: crate::HttpClient + 'a> HelixClient<'a, C> {
pub const fn with_client(client: C) -> Self {
HelixClient {
client,
_pd: std::marker::PhantomData,
}
}
pub fn new() -> Self
where C: crate::client::ClientDefault<'a> {
let client = C::default_client();
HelixClient::with_client(client)
}
pub fn clone_client(&self) -> C
where C: Clone {
self.client.clone()
}
pub const fn get_client(&self) -> &C { &self.client }
pub async fn req_get<R, D, T>(
&'a self,
request: R,
token: &T,
) -> Result<Response<R, D>, ClientRequestError<<C as crate::HttpClient>::Error>>
where
R: Request<Response = D> + Request + RequestGet,
D: serde::de::DeserializeOwned + PartialEq,
T: TwitchToken + ?Sized,
C: Send,
{
let req = request.create_request(token.token().secret(), token.client_id().as_str())?;
let uri = req.uri().clone();
let response = self
.client
.req(req)
.await
.map_err(ClientRequestError::RequestError)?
.into_response_vec();
<R>::parse_response(Some(request), &uri, response).map_err(Into::into)
}
pub async fn req_post<R, B, D, T>(
&'a self,
request: R,
body: B,
token: &T,
) -> Result<Response<R, D>, ClientRequestError<<C as crate::HttpClient>::Error>>
where
R: Request<Response = D> + Request + RequestPost<Body = B>,
B: HelixRequestBody,
D: serde::de::DeserializeOwned + PartialEq,
T: TwitchToken + ?Sized,
{
let req =
request.create_request(body, token.token().secret(), token.client_id().as_str())?;
let uri = req.uri().clone();
let response = self
.client
.req(req)
.await
.map_err(ClientRequestError::RequestError)?
.into_response_vec();
<R>::parse_response(Some(request), &uri, response).map_err(Into::into)
}
pub async fn req_patch<R, B, D, T>(
&'a self,
request: R,
body: B,
token: &T,
) -> Result<Response<R, D>, ClientRequestError<<C as crate::HttpClient>::Error>>
where
R: Request<Response = D> + Request + RequestPatch<Body = B>,
B: HelixRequestBody,
D: serde::de::DeserializeOwned + PartialEq,
T: TwitchToken + ?Sized,
{
let req =
request.create_request(body, token.token().secret(), token.client_id().as_str())?;
let uri = req.uri().clone();
let response = self
.client
.req(req)
.await
.map_err(ClientRequestError::RequestError)?
.into_response_vec();
<R>::parse_response(Some(request), &uri, response).map_err(Into::into)
}
pub async fn req_delete<R, D, T>(
&'a self,
request: R,
token: &T,
) -> Result<Response<R, D>, ClientRequestError<<C as crate::HttpClient>::Error>>
where
R: Request<Response = D> + Request + RequestDelete,
D: serde::de::DeserializeOwned + PartialEq,
T: TwitchToken + ?Sized,
{
let req = request.create_request(token.token().secret(), token.client_id().as_str())?;
let uri = req.uri().clone();
let response = self
.client
.req(req)
.await
.map_err(ClientRequestError::RequestError)?
.into_response_vec();
<R>::parse_response(Some(request), &uri, response).map_err(Into::into)
}
pub async fn req_put<R, B, D, T>(
&'a self,
request: R,
body: B,
token: &T,
) -> Result<Response<R, D>, ClientRequestError<<C as crate::HttpClient>::Error>>
where
R: Request<Response = D> + Request + RequestPut<Body = B>,
B: HelixRequestBody,
D: serde::de::DeserializeOwned + PartialEq,
T: TwitchToken + ?Sized,
{
let req =
request.create_request(body, token.token().secret(), token.client_id().as_str())?;
let uri = req.uri().clone();
let response = self
.client
.req(req)
.await
.map_err(ClientRequestError::RequestError)?
.into_response_vec();
<R>::parse_response(Some(request), &uri, response).map_err(Into::into)
}
}