use serde::{Deserialize, Serialize};
use std::{borrow::Cow, fmt::Debug};
use url::Url;
pub trait Endpoint {
type Response: for<'a> Deserialize<'a> + Debug;
fn method(&self) -> reqwest::Method;
fn path(&self) -> String;
#[inline]
fn query(&self) -> Option<String> {
None
}
#[inline]
fn headers(&self) -> Option<reqwest::header::HeaderMap> {
None
}
#[inline]
fn body(&self) -> Option<String> {
None
}
fn url(&self, base_url: &Url) -> Url {
let mut url = base_url.join(&self.path()).unwrap();
url.set_query(self.query().as_deref());
url
}
fn content_type(&self) -> Cow<'static, str> {
Cow::Borrowed("application/json")
}
}
#[inline]
pub fn serialize_query<Q: Serialize>(q: &Q) -> Option<String> {
serde_urlencoded::to_string(q).ok()
}