use std::borrow::Cow;
use bytes::Bytes;
use http::{HeaderMap, Method, Response};
use serde::de::DeserializeOwned;
use crate::{BodyError, HeaderError, QueryParamPairs};
pub trait Endpoint {
fn ignore_errors(&self) -> bool {
false
}
fn method(&self) -> Method {
Method::GET
}
fn path(&self) -> Cow<'static, str>;
fn headers(&self) -> Result<Option<HeaderMap>, HeaderError> {
Ok(None)
}
fn query_params(&self) -> Option<QueryParamPairs> {
None
}
fn url(&self) -> String {
let mut path = self.path().to_string();
if let Some(query) = self.query_params() {
let mut serializer = ::url::form_urlencoded::Serializer::new(String::new());
for pair in query.iter() {
serializer.append_pair(&pair.key, &pair.value);
}
let encoded = serializer.finish();
if !encoded.is_empty() {
path.push('?');
path.push_str(&encoded);
}
}
path
}
fn body(&self) -> Result<Option<(Cow<'static, str>, Vec<u8>)>, BodyError> {
Ok(None)
}
fn deserialize<T: DeserializeOwned>(&self, response: Response<Bytes>) -> Result<T, BodyError> {
Ok(serde_json::from_slice(response.body())?)
}
}