use reqwest::{header::HeaderMap, Method, RequestBuilder};
use serde::{Deserialize, Deserializer, Serialize};
use std::borrow::Cow;
pub enum RequestData<T> {
Empty,
Form(T),
Json(T),
Query(T),
}
impl<T> Default for RequestData<T> {
fn default() -> Self {
RequestData::Empty
}
}
pub trait Request {
type Data: Serialize;
type Response: for<'de> Deserialize<'de> + Unpin;
const METHOD: Method = Method::GET;
fn endpoint(&self) -> Cow<str>;
fn headers(&self) -> HeaderMap {
Default::default()
}
fn data(&self) -> RequestData<&Self::Data> {
Default::default()
}
}
#[derive(Debug)]
pub struct EmptyResponse;
impl<'de> Deserialize<'de> for EmptyResponse {
fn deserialize<D>(_deserializer: D) -> Result<EmptyResponse, D::Error>
where
D: Deserializer<'de>,
{
Ok(EmptyResponse {})
}
}
pub(crate) trait RequestBuilderExt: Sized {
fn request_data<T: Serialize>(self, body: RequestData<T>) -> Self;
}
impl RequestBuilderExt for RequestBuilder {
fn request_data<T: Serialize>(self, body: RequestData<T>) -> Self {
match body {
RequestData::Empty => self,
RequestData::Form(value) => self.form(&value),
RequestData::Json(value) => self.json(&value),
RequestData::Query(value) => self.query(&value),
}
}
}