use bytes::Bytes;
use http::{Request, Response};
use crate::RestClient;
use crate::{APIError, AsyncClient};
#[cfg(feature = "reqwest")]
pub trait ReqwestAsyncClient: RestClient {
fn client(&self) -> &reqwest::Client;
}
#[cfg(feature = "reqwest")]
impl<C> AsyncClient for C
where
C: ReqwestAsyncClient + Sync,
{
async fn rest_async(
&self,
request: Request<Vec<u8>>,
) -> Result<Response<Bytes>, APIError<Self::Error>> {
let response = self.client().execute(request.try_into()?).await?;
#[allow(unused_mut)]
let mut http_response = Response::builder().status(response.status());
#[cfg(not(target_family = "wasm"))]
let mut http_response = http_response.version(response.version());
let headers = http_response.headers_mut().unwrap();
for (key, value) in response.headers() {
headers.append(key, value.clone());
}
Ok(http_response.body(response.bytes().await?)?)
}
}
#[cfg(feature = "reqwest_blocking")]
#[cfg(not(target_family = "wasm"))]
pub trait ReqwestClient: RestClient {
fn client(&self) -> &reqwest::blocking::Client;
}
#[cfg(feature = "reqwest_blocking")]
#[cfg(not(target_family = "wasm"))]
impl<C> crate::Client for C
where
C: RestClient + ReqwestClient,
{
fn rest(&self, request: Request<Vec<u8>>) -> Result<Response<Bytes>, APIError<Self::Error>> {
let response = self.client().execute(request.try_into()?)?;
let mut http_response = Response::builder()
.status(response.status())
.version(response.version());
let headers = http_response.headers_mut().unwrap();
for (key, value) in response.headers() {
headers.append(key, value.clone());
}
Ok(http_response.body(response.bytes()?)?)
}
}