use serde::{de::DeserializeOwned, Serialize};
#[derive(Clone)]
pub struct HttpClient {
inner: reqwest::Client,
}
impl HttpClient {
pub fn new() -> Self {
Self { inner: reqwest::Client::builder().use_rustls_tls().build().unwrap_or_else(|_| reqwest::Client::new()) }
}
pub async fn get<T: DeserializeOwned>(&self, url: &str) -> anyhow::Result<T> {
let resp = self.inner.get(url).send().await?.error_for_status()?;
Ok(resp.json::<T>().await?)
}
pub async fn post<T: DeserializeOwned, B: Serialize>(&self, url: &str, body: &B) -> anyhow::Result<T> {
let resp = self.inner.post(url).json(body).send().await?.error_for_status()?;
Ok(resp.json::<T>().await?)
}
pub async fn post_empty<B: Serialize>(&self, url: &str, body: &B) -> anyhow::Result<()> {
self.inner.post(url).json(body).send().await?.error_for_status()?;
Ok(())
}
}
impl Default for HttpClient {
fn default() -> Self { Self::new() }
}