use std::borrow::Cow;
use serde::{ Serialize, Deserialize };
use reqwest::{ Method, header::HeaderMap };
pub use submit::*;
pub use status::*;
pub use result::*;
pub mod submit;
pub mod status;
pub mod result;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum RequestBody<T> {
None,
Json(T),
Query(T),
Form(T),
Multipart(T),
}
impl<T> Default for RequestBody<T> {
fn default() -> Self {
RequestBody::None
}
}
pub trait Request {
type Body: Serialize;
type Response: for<'de> Deserialize<'de>;
const METHOD: Method = Method::GET;
fn endpoint(&self) -> Cow<str>;
fn headers(&self) -> HeaderMap {
Default::default()
}
fn body(&self) -> RequestBody<&Self::Body> {
Default::default()
}
}
impl<R: Request> Request for &R {
type Body = R::Body;
type Response = R::Response;
const METHOD: Method = R::METHOD;
fn endpoint(&self) -> Cow<str> {
(**self).endpoint()
}
fn headers(&self) -> HeaderMap {
(**self).headers()
}
fn body(&self) -> RequestBody<&Self::Body> {
(**self).body()
}
}
impl<R: Request> Request for &mut R {
type Body = R::Body;
type Response = R::Response;
const METHOD: Method = R::METHOD;
fn endpoint(&self) -> Cow<str> {
(**self).endpoint()
}
fn headers(&self) -> HeaderMap {
(**self).headers()
}
fn body(&self) -> RequestBody<&Self::Body> {
(**self).body()
}
}