1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::manga::MangaRelation;
10use super::{Error, Result};
11
12use std::collections::HashMap;
13
14pub 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#[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}