1use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
11pub struct LoopingAllOf {
12 #[serde(flatten)]
13 pub image: Image,
14 #[serde(flatten)]
18 pub value: serde_json::Value,
19}
20
21#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
23pub struct Images {
24 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub downsized: Option<LoopingAllOf>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub downsized_large: Option<LoopingAllOf>,
34 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub downsized_medium: Option<LoopingAllOf>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub downsized_small: Option<LoopingAllOf>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub downsized_still: Option<LoopingAllOf>,
49 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub fixed_height: Option<LoopingAllOf>,
54 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub fixed_height_downsampled: Option<LoopingAllOf>,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub fixed_height_small: Option<LoopingAllOf>,
64 #[serde(default, skip_serializing_if = "Option::is_none")]
68 pub fixed_height_small_still: Option<LoopingAllOf>,
69 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub fixed_height_still: Option<LoopingAllOf>,
74 #[serde(default, skip_serializing_if = "Option::is_none")]
78 pub fixed_width: Option<LoopingAllOf>,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub fixed_width_downsampled: Option<LoopingAllOf>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub fixed_width_small: Option<LoopingAllOf>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub fixed_width_small_still: Option<LoopingAllOf>,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
98 pub fixed_width_still: Option<LoopingAllOf>,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub looping: Option<LoopingAllOf>,
104 #[serde(default, skip_serializing_if = "Option::is_none")]
108 pub original: Option<LoopingAllOf>,
109 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub original_still: Option<LoopingAllOf>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
118 pub preview: Option<LoopingAllOf>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
123 pub preview_gif: Option<LoopingAllOf>,
124}
125
126#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema, Default)]
130pub enum Type {
131 #[serde(rename = "gif")]
132 #[default]
133 Gif,
134 #[serde(other)]
135 FallthroughString,
136}
137
138impl std::fmt::Display for Type {
139 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
140 match self {
141 Type::Gif => "gif",
142 Type::FallthroughString => "*",
143 }
144 .fmt(f)
145 }
146}
147
148#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
149pub struct Gif {
150 #[serde(
154 default,
155 skip_serializing_if = "String::is_empty",
156 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
157 )]
158 pub bitly_url: String,
159 #[serde(
163 default,
164 skip_serializing_if = "String::is_empty",
165 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
166 )]
167 pub content_url: String,
168 #[serde(
172 default,
173 skip_serializing_if = "Option::is_none",
174 deserialize_with = "crate::utils::date_time_format::deserialize"
175 )]
176 pub create_datetime: Option<chrono::DateTime<chrono::Utc>>,
177 #[serde(
181 default,
182 skip_serializing_if = "String::is_empty",
183 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
184 )]
185 pub embded_url: String,
186 #[serde(
191 default,
192 skip_serializing_if = "Vec::is_empty",
193 deserialize_with = "crate::utils::deserialize_null_vector::deserialize"
194 )]
195 pub featured_tags: Vec<String>,
196 #[serde(
200 default,
201 skip_serializing_if = "String::is_empty",
202 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
203 )]
204 pub id: String,
205 #[serde(default, skip_serializing_if = "Option::is_none")]
209 pub images: Option<Images>,
210 #[serde(
214 default,
215 skip_serializing_if = "Option::is_none",
216 deserialize_with = "crate::utils::date_time_format::deserialize"
217 )]
218 pub import_datetime: Option<chrono::DateTime<chrono::Utc>>,
219 #[serde(
223 default,
224 skip_serializing_if = "String::is_empty",
225 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
226 )]
227 pub rating: String,
228 #[serde(
232 default,
233 skip_serializing_if = "String::is_empty",
234 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
235 )]
236 pub slug: String,
237 #[serde(
241 default,
242 skip_serializing_if = "String::is_empty",
243 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
244 )]
245 pub source: String,
246 #[serde(
250 default,
251 skip_serializing_if = "String::is_empty",
252 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
253 )]
254 pub source_post_url: String,
255 #[serde(
259 default,
260 skip_serializing_if = "String::is_empty",
261 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
262 )]
263 pub source_tld: String,
264 #[serde(
269 default,
270 skip_serializing_if = "Vec::is_empty",
271 deserialize_with = "crate::utils::deserialize_null_vector::deserialize"
272 )]
273 pub tags: Vec<String>,
274 #[serde(
278 default,
279 skip_serializing_if = "Option::is_none",
280 deserialize_with = "crate::utils::date_time_format::deserialize"
281 )]
282 pub trending_datetime: Option<chrono::DateTime<chrono::Utc>>,
283 #[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
287 pub type_: Option<Type>,
288 #[serde(
292 default,
293 skip_serializing_if = "Option::is_none",
294 deserialize_with = "crate::utils::date_time_format::deserialize"
295 )]
296 pub update_datetime: Option<chrono::DateTime<chrono::Utc>>,
297 #[serde(
301 default,
302 skip_serializing_if = "String::is_empty",
303 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
304 )]
305 pub url: String,
306 #[serde(default, skip_serializing_if = "Option::is_none")]
310 pub user: Option<User>,
311 #[serde(
315 default,
316 skip_serializing_if = "String::is_empty",
317 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
318 )]
319 pub username: String,
320}
321
322#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
323pub struct Image {
324 #[serde(
328 default,
329 skip_serializing_if = "String::is_empty",
330 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
331 )]
332 pub frames: String,
333 #[serde(
337 default,
338 skip_serializing_if = "String::is_empty",
339 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
340 )]
341 pub height: String,
342 #[serde(
346 default,
347 skip_serializing_if = "String::is_empty",
348 deserialize_with = "crate::utils::deserialize_null_string::deserialize",
349 rename = "mp4"
350 )]
351 pub mp_4: String,
352 #[serde(
356 default,
357 skip_serializing_if = "String::is_empty",
358 deserialize_with = "crate::utils::deserialize_null_string::deserialize",
359 rename = "mp4_size"
360 )]
361 pub mp_4_size: String,
362 #[serde(
366 default,
367 skip_serializing_if = "String::is_empty",
368 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
369 )]
370 pub size: String,
371 #[serde(
375 default,
376 skip_serializing_if = "String::is_empty",
377 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
378 )]
379 pub url: String,
380 #[serde(
384 default,
385 skip_serializing_if = "String::is_empty",
386 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
387 )]
388 pub webp: String,
389 #[serde(
393 default,
394 skip_serializing_if = "String::is_empty",
395 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
396 )]
397 pub webp_size: String,
398 #[serde(
402 default,
403 skip_serializing_if = "String::is_empty",
404 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
405 )]
406 pub width: String,
407}
408
409#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
412pub struct Meta {
413 #[serde(
418 default,
419 skip_serializing_if = "String::is_empty",
420 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
421 )]
422 pub msg: String,
423 #[serde(
428 default,
429 skip_serializing_if = "String::is_empty",
430 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
431 )]
432 pub response_id: String,
433 #[serde(
438 default,
439 skip_serializing_if = "crate::utils::zero_i64",
440 deserialize_with = "crate::utils::deserialize_null_i64::deserialize"
441 )]
442 pub status: i64,
443}
444
445#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
448pub struct Pagination {
449 #[serde(
454 default,
455 skip_serializing_if = "crate::utils::zero_i64",
456 deserialize_with = "crate::utils::deserialize_null_i64::deserialize"
457 )]
458 pub count: i64,
459 #[serde(
464 default,
465 skip_serializing_if = "crate::utils::zero_i64",
466 deserialize_with = "crate::utils::deserialize_null_i64::deserialize"
467 )]
468 pub offset: i64,
469 #[serde(
474 default,
475 skip_serializing_if = "crate::utils::zero_i64",
476 deserialize_with = "crate::utils::deserialize_null_i64::deserialize"
477 )]
478 pub total_count: i64,
479}
480
481#[derive(Serialize, Default, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
483pub struct User {
484 #[serde(
488 default,
489 skip_serializing_if = "String::is_empty",
490 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
491 )]
492 pub avatar_url: String,
493 #[serde(
497 default,
498 skip_serializing_if = "String::is_empty",
499 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
500 )]
501 pub banner_url: String,
502 #[serde(
506 default,
507 skip_serializing_if = "String::is_empty",
508 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
509 )]
510 pub display_name: String,
511 #[serde(
515 default,
516 skip_serializing_if = "String::is_empty",
517 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
518 )]
519 pub profile_url: String,
520 #[serde(
524 default,
525 skip_serializing_if = "String::is_empty",
526 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
527 )]
528 pub twitter: String,
529 #[serde(
533 default,
534 skip_serializing_if = "String::is_empty",
535 deserialize_with = "crate::utils::deserialize_null_string::deserialize"
536 )]
537 pub username: String,
538}
539
540#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
541pub struct GetGifsByResponse {
542 #[serde(
543 default,
544 skip_serializing_if = "Vec::is_empty",
545 deserialize_with = "crate::utils::deserialize_null_vector::deserialize"
546 )]
547 pub data: Vec<Gif>,
548 #[serde(default, skip_serializing_if = "Option::is_none")]
553 pub meta: Option<Meta>,
554 #[serde(default, skip_serializing_if = "Option::is_none")]
559 pub pagination: Option<Pagination>,
560}
561
562#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, JsonSchema)]
563pub struct RandomGifResponse {
564 #[serde(default, skip_serializing_if = "Option::is_none")]
565 pub data: Option<Gif>,
566 #[serde(default, skip_serializing_if = "Option::is_none")]
571 pub meta: Option<Meta>,
572}