mango_api/requests/
query_utils.rs

1//! Structs and traits used by all queries related stuff.
2//!
3//! The usage of most of the structs encountered here can be clarified by
4//! <https://api.mangadex.org/docs/3-enumerations/#static-data>
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::manga::MangaRelation;
10use super::{Error, Result};
11
12use std::collections::HashMap;
13
14/// Trait used for marking structs that can represent queries
15pub trait Query: Serialize + std::fmt::Debug {}
16
17#[derive(Serialize, Deserialize, Debug, Clone, Default, Copy)]
18pub struct EmptyQuery {}
19impl Query for EmptyQuery {}
20
21#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, std::hash::Hash, Clone)]
22#[serde(rename_all = "kebab-case")]
23pub enum Locale {
24    Ab,
25    Aa,
26    Af,
27    Ak,
28    Sq,
29    Am,
30    Ar,
31    An,
32    Hy,
33    Av,
34    Ae,
35    Ay,
36    Az,
37    Bm,
38    Ba,
39    Eu,
40    Be,
41    Bn,
42    Bi,
43    Bs,
44    Br,
45    Bg,
46    My,
47    Ca,
48    Ch,
49    Ce,
50    Ny,
51    Zh,
52    Cu,
53    Cv,
54    Kw,
55    Co,
56    Cr,
57    Hr,
58    Cs,
59    Da,
60    Dv,
61    Dz,
62    En,
63    Eo,
64    Et,
65    Ee,
66    Fo,
67    Fj,
68    Fr,
69    Fi,
70    Fy,
71    Ff,
72    Gd,
73    Gl,
74    Lg,
75    Ka,
76    De,
77    El,
78    Kl,
79    Gn,
80    Gu,
81    Hu,
82    Ht,
83    Ha,
84    He,
85    Hi,
86    Ho,
87    Is,
88    Io,
89    Ig,
90    Id,
91    Ia,
92    Ie,
93    Iu,
94    Ik,
95    Ga,
96    It,
97    Ja,
98    Jv,
99    Kn,
100    Kr,
101    Ks,
102    Kk,
103    Km,
104    Ki,
105    Rw,
106    Ky,
107    Kv,
108    Kg,
109    Ko,
110    Kj,
111    Ku,
112    Lo,
113    La,
114    Lv,
115    Li,
116    Ln,
117    Lt,
118    Lu,
119    Lb,
120    Mk,
121    Mg,
122    Ms,
123    Ml,
124    Mt,
125    Gv,
126    Mi,
127    Mr,
128    Mh,
129    Mn,
130    Na,
131    Nv,
132    Nd,
133    Nr,
134    Ng,
135    Ne,
136    No,
137    Nb,
138    Nn,
139    Nl,
140    Oc,
141    Oj,
142    Or,
143    Om,
144    Os,
145    Pi,
146    Ps,
147    Fa,
148    Pl,
149    Pt,
150    Pa,
151    Qu,
152    Ro,
153    Rm,
154    Rn,
155    Ru,
156    Se,
157    Sm,
158    Sg,
159    Sa,
160    Sc,
161    Sr,
162    Sn,
163    Sd,
164    Si,
165    Sk,
166    Sl,
167    So,
168    St,
169    Es,
170    Su,
171    Sw,
172    Ss,
173    Sv,
174    Tl,
175    Ty,
176    Tg,
177    Ta,
178    Tt,
179    Te,
180    Th,
181    Bo,
182    Ti,
183    To,
184    Ts,
185    Tn,
186    Tr,
187    Tk,
188    Tw,
189    Ug,
190    Uk,
191    Ur,
192    Uz,
193    Ve,
194    Vi,
195    Vo,
196    Wa,
197    Cy,
198    Wo,
199    Xh,
200    Ii,
201    Yi,
202    Yo,
203    Za,
204    Zu,
205    As,
206    ZhHk,
207    PtBr,
208    EsLa,
209    JaRo,
210    KoRo,
211    ZhRo,
212}
213
214pub type LocalizedString = HashMap<Locale, String>;
215
216/// Enumeration of all entities that can be returned from server
217#[derive(Serialize, Deserialize, Debug, Clone)]
218#[serde(rename_all = "snake_case")]
219pub enum EntityType {
220    Manga,
221    CoverArt,
222    Chapter,
223    Author,
224    ApiClient,
225    ReportReason,
226    ScanlationGroup,
227    User,
228    Tag,
229    Artist,
230    Creator,
231}
232
233#[derive(Serialize, Deserialize, Clone, Debug)]
234pub struct Relationship {
235    pub id: String,
236    #[serde(rename = "type")]
237    pub entity_type: EntityType,
238    pub related: Option<MangaRelation>,
239    pub attributes: Option<Value>,
240}
241
242#[derive(Serialize, Deserialize, Debug, Clone)]
243#[serde(rename_all = "camelCase")]
244pub enum Order {
245    Asc,
246    Desc,
247}
248
249#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, std::hash::Hash)]
250#[serde(rename_all = "camelCase")]
251pub enum OrderOption {
252    Title,
253    Year,
254    CreatedAt,
255    UpdatedAt,
256    LatestUploadedChapter,
257    FollowedCount,
258    Relevance,
259    Chapter,
260}
261
262pub type SortingOptions = HashMap<OrderOption, Order>;
263
264#[derive(Serialize, Deserialize, Debug, Clone)]
265#[serde(rename_all = "snake_case")]
266pub enum ContentRating {
267    Safe,
268    Suggestive,
269    Erotica,
270    Pornographic,
271}
272
273#[derive(Serialize, Deserialize, Debug, Clone)]
274#[serde(rename_all = "snake_case")]
275pub enum PublicationDemographic {
276    Shounen,
277    Shoujo,
278    Josei,
279    Seinen,
280}
281
282pub(crate) trait ResponseResultOk {
283    fn response_result_ok(&self) -> Result<bool>;
284}
285
286impl ResponseResultOk for Value {
287    fn response_result_ok(&self) -> Result<bool> {
288        let result = match self.get("result") {
289            Some(status) => status,
290            None => return Err(Error::ParseError),
291        };
292
293        let responded_without_errors = if result.is_string() {
294            let result = result.as_str().expect("verified to be a string");
295
296            result == "ok"
297        } else {
298            return Err(Error::ParseError);
299        };
300
301        Ok(responded_without_errors)
302    }
303}