use crate::error::{ApiErr, ApiResult};
pub use api_req_derive::{ApiCaller, Payload};
use reqwest::{Method, RequestBuilder, header::HeaderMap};
use serde::{Serialize, de::DeserializeOwned};
pub trait Payload: Send + Sync + Serialize + 'static {
const METHOD: Method;
fn headers(&self) -> Option<HeaderMap> {
None
}
fn path(&self) -> Option<String> {
None
}
fn req_option(&self, mut req: RequestBuilder) -> RequestBuilder {
if let Some(headers) = self.headers() {
req = req.headers(headers);
}
match Self::METHOD {
Method::GET => req.query(self),
Method::POST => req.json(self),
_ => unimplemented!(),
}
}
fn before_deserialize() -> Option<fn(String) -> ApiResult<String>> {
None
}
fn deserialize<O: DeserializeOwned>(input: String) -> ApiResult<O> {
serde_json::from_str(&input).map_err(|e| ApiErr::UnDeserializeable(e.to_string()))
}
}