1use std::borrow::Cow;
2
3use serde::Serialize;
4
5pub mod from_response;
6
7pub trait UrlSerdeQS {
8 fn query_qs<T: Serialize>(self, query: &T) -> Self;
9}
10
11impl UrlSerdeQS for url::Url {
12 fn query_qs<T: Serialize>(mut self, query: &T) -> Self {
13 self.set_query(Some(
14 &serde_qs::to_string(query).expect("failed to encode query string"),
15 ));
16 self
17 }
18}
19
20pub trait FromResponse: Sized {
21 type Response;
22
23 fn from_response(res: Self::Response) -> Self;
24}
25
26pub trait Endpoint {
27 type Query: Serialize;
28 type Body: Serialize;
29 type Response: FromResponse;
30
31 fn method(&self) -> reqwest::Method {
32 reqwest::Method::GET
33 }
34
35 fn path(&'_ self) -> Cow<'_, str>;
36
37 fn require_auth(&self) -> bool {
38 false
39 }
40
41 fn query(&self) -> Option<&Self::Query> {
42 None
43 }
44
45 fn body(&self) -> Option<&Self::Body> {
46 None
47 }
48
49 fn multipart(&self) -> Option<reqwest::multipart::Form> {
50 None
51 }
52}
53
54pub(crate) mod bool_serde {
55 use serde::Serializer;
56
57 pub fn option_bool_ser<S: Serializer>(
58 value: &Option<bool>,
59 serializer: S,
60 ) -> Result<S::Ok, S::Error> {
61 match value {
62 Some(bool_) => bool_ser(bool_, serializer),
63 None => serializer.serialize_none(),
64 }
65 }
66 pub fn bool_ser<S: Serializer>(value: &bool, serializer: S) -> Result<S::Ok, S::Error> {
67 match value {
68 true => serializer.serialize_i8(1),
69 false => serializer.serialize_i8(0),
70 }
71 }
72}