#![allow(unused)]
use reqwest::{IntoUrl, Method, Response};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use crate::error::{Error, Result};
#[derive(Clone, Debug, Default)]
pub(crate) struct HttpClient {
inner: reqwest::Client,
}
pub(crate) struct HttpRequest {
inner: reqwest::RequestBuilder,
}
impl From<reqwest::RequestBuilder> for HttpRequest {
fn from(value: reqwest::RequestBuilder) -> Self {
Self { inner: value }
}
}
impl HttpRequest {
pub(crate) fn headers<'a>(
self,
headers: impl IntoIterator<Item = &'a (&'a str, &'a str)>,
) -> Self {
headers
.into_iter()
.fold(self.inner, |request, (k, v)| request.header(*k, *v))
.into()
}
pub(crate) fn query(self, query: impl Serialize) -> Self {
self.inner.query(&query).into()
}
pub(crate) async fn send<T: DeserializeOwned>(self) -> reqwest::Result<T> {
self.inner.send().await?.json().await
}
pub(crate) async fn send_and_get_string(self) -> reqwest::Result<String> {
self.inner.send().await?.text().await
}
}
impl HttpClient {
pub(crate) fn with_timeout(timeout: std::time::Duration) -> Result<Self> {
let inner = reqwest::Client::builder()
.timeout(timeout)
.build()
.map_err(|e| Error::internal(format!("error initializing http client: {e}")))?;
Ok(Self { inner })
}
pub(crate) fn get(&self, uri: impl IntoUrl) -> HttpRequest {
self.inner.request(Method::GET, uri).into()
}
pub(crate) fn put(&self, uri: impl IntoUrl) -> HttpRequest {
self.inner.request(Method::PUT, uri).into()
}
}