use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::error::HttpError;
use crate::response::{RawResponse, Response};
#[derive(Debug)]
pub struct RequestBuilder {
inner: reqwest::RequestBuilder,
}
impl RequestBuilder {
pub(crate) fn new(inner: reqwest::RequestBuilder) -> Self {
Self { inner }
}
pub fn header(self, key: impl AsRef<str>, value: impl AsRef<str>) -> Self {
Self {
inner: self.inner.header(key.as_ref(), value.as_ref()),
}
}
pub fn json<T: Serialize + ?Sized>(self, body: &T) -> Self {
Self {
inner: self.inner.json(body),
}
}
pub fn form<T: Serialize + ?Sized>(self, body: &T) -> Self {
Self {
inner: self.inner.form(body),
}
}
pub async fn send(self) -> Response<RawResponse> {
let response = self.inner.send().await?;
Ok(RawResponse::new(response))
}
pub async fn send_json<R: DeserializeOwned>(self) -> Response<R> {
let response = self.inner.send().await?;
let status = response.status();
if !status.is_success() {
let message = response.text().await.unwrap_or_default();
return Err(HttpError::Status {
status: status.as_u16(),
message,
});
}
response.json().await.map_err(HttpError::from)
}
}