#[cfg(feature = "reqwest")]
pub(crate) mod dep_reqwest;
use std::fmt;
use url::Url;
use crate::error::HttpError;
#[derive(Clone)]
#[non_exhaustive]
pub enum HttpClient {
#[cfg(feature = "reqwest")]
Reqwest(reqwest::Client),
}
#[cfg(feature = "reqwest")]
impl HttpClient {
pub fn default_reqwest() -> Self {
HttpClient::Reqwest(dep_reqwest::default_client())
}
}
#[cfg(feature = "reqwest")]
impl From<reqwest::Client> for HttpClient {
fn from(client: reqwest::Client) -> Self {
HttpClient::Reqwest(client)
}
}
impl fmt::Debug for HttpClient {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let _ = f;
match *self {
#[cfg(feature = "reqwest")]
HttpClient::Reqwest(_) => f.write_str("HttpClient::Reqwest(..)"),
}
}
}
pub(crate) struct FormResponse {
pub(crate) status: u16,
pub(crate) content_type: Option<String>,
pub(crate) body: Vec<u8>,
}
pub struct HttpResponse {
pub status: u16,
pub body: Vec<u8>,
}
impl HttpResponse {
pub fn is_success(&self) -> bool {
(200..300).contains(&self.status)
}
}
impl HttpClient {
#[cfg_attr(not(feature = "reqwest"), allow(unused_variables))]
pub(crate) async fn post_form(
&self,
url: &Url,
form: &[(&str, &str)],
authorization: Option<&str>,
) -> Result<FormResponse, HttpError> {
match *self {
#[cfg(feature = "reqwest")]
HttpClient::Reqwest(ref client) => {
dep_reqwest::post_form(client, url, form, authorization).await
}
}
}
#[cfg_attr(not(feature = "reqwest"), allow(unused_variables))]
pub async fn get(&self, url: &Url) -> Result<HttpResponse, HttpError> {
match *self {
#[cfg(feature = "reqwest")]
HttpClient::Reqwest(ref client) => dep_reqwest::get(client, url).await,
}
}
}