1use std::collections::HashMap;
2
3use chrono::{DateTime, NaiveDate, Utc};
4use serde::Deserialize;
5
6#[derive(Deserialize, Debug)]
7pub struct Response<T> {
8 pub data: Vec<ResponseData<T>>,
9 pub included: Option<Vec<Included>>,
10}
11
12#[derive(Deserialize, Debug)]
13pub struct ResponseData<T> {
14 pub attributes: T,
15}
16
17#[derive(Deserialize, Debug)]
18#[serde(tag = "type")]
19pub enum Included {
20 #[serde(rename = "genres")]
21 Genre { attributes: GenreInfo },
22 #[serde(rename = "characters")]
23 Character { attributes: CharacterInfo },
24 #[serde(rename = "streamingLinks")]
25 StreamingLink { attributes: StreamingLinkInfo },
26 #[serde(rename = "producers")]
27 Producer { attributes: ProducerInfo },
28 #[serde(rename = "episodes")]
29 Episode { attributes: EpisodeInfo },
30 #[serde(rename = "mediaCharacters")]
31 MediaCharacter,
32 #[serde(rename = "mediaProductions")]
33 MediaProduction,
34 #[serde(rename = "animeProductions")]
35 AnimeProduction,
36}
37
38#[derive(Deserialize, Debug)]
39pub struct GenreInfo {
40 pub name: String,
41}
42
43#[derive(Deserialize, Debug)]
44pub struct EpisodeInfo {
45 #[serde(rename = "canonicalTitle")]
46 pub title: Option<String>,
47 #[serde(rename = "relativeNumber")]
48 pub episode_no: Option<u32>,
49 #[serde(rename = "seasonNumber")]
50 pub season_no: Option<u32>,
51 pub length: Option<u32>,
52 #[serde(rename = "airdate")]
53 pub aired_on: Option<NaiveDate>,
54 pub thumbnail: Option<Image>,
55 pub synopsis: Option<String>,
56}
57
58#[derive(Deserialize, Debug)]
59pub struct CharacterInfo {
60 pub name: String,
61 pub description: Option<String>,
62 pub image: Image,
63}
64
65#[derive(Deserialize, Debug)]
66pub struct StreamingLinkInfo {
67 pub url: String,
68 pub subs: Option<Vec<String>>,
69 pub dubs: Option<Vec<String>>,
70}
71
72#[derive(Deserialize, Debug)]
73pub struct ProducerInfo {
74 pub name: String,
75}
76
77#[derive(Deserialize, Debug, Clone)]
78pub struct Image {
79 pub tiny: String,
80 pub small: String,
81 pub medium: String,
82 pub large: String,
83 pub original: String,
84}
85
86#[derive(Deserialize, Debug, Clone)]
87pub struct SearchResult {
88 pub slug: String,
89 pub subtype: String,
90 pub titles: HashMap<String, String>,
91 #[serde(rename(deserialize = "posterImage"))]
92 pub poster_image: Image,
93}
94
95#[derive(Deserialize, Debug, Clone)]
96pub struct AnimeInfo {
97 pub slug: String,
98 pub subtype: AnimeType,
99 pub status: AnimeStatus,
100 #[serde(rename = "canonicalTitle")]
101 pub canonical_title: String,
102 pub titles: HashMap<String, String>,
103 #[serde(rename = "updatedAt")]
104 pub last_updated: DateTime<Utc>,
105 #[serde(rename = "startDate")]
106 pub start_date: NaiveDate,
107 #[serde(rename = "endDate")]
108 pub end_date: NaiveDate,
109 pub synopsis: Option<String>,
110 #[serde(rename = "posterImage")]
111 pub poster_image: Image,
112 #[serde(rename = "ageRatingGuide")]
113 pub age_rating: Option<String>,
114 #[serde(rename = "youtubeVideoId")]
115 pub youtube_ref: Option<String>,
116 pub nsfw: bool,
117 #[serde(rename = "episodeLength")]
118 pub episode_length: Option<u32>,
119 #[serde(rename = "totalLength")]
120 pub total_length: Option<u32>,
121}
122
123pub type SearchResponse = Response<SearchResult>;
124pub type AnimeResponse = Response<AnimeInfo>;
125
126#[derive(Deserialize, Debug, Clone)]
127pub enum AnimeStatus {
128 #[serde(rename = "current")]
129 Current,
130 #[serde(rename = "finished")]
131 Finished,
132 #[serde(rename = "unreleased")]
133 Unreleased,
134 #[serde(rename = "upcoming")]
135 Upcoming,
136 #[serde(rename = "tba")]
137 ToBeAnnounced,
138}
139
140#[derive(Deserialize, Debug, Clone)]
141pub enum AnimeType {
142 #[serde(rename = "ona")]
143 OriginalNetAnimation,
144 #[serde(rename = "ova")]
145 OriginalVideoAnimation,
146 #[serde(rename = "tv")]
147 TelevisionShow,
148 #[serde(rename = "movie")]
149 Movie,
150 #[serde(rename = "music")]
151 Music,
152 #[serde(rename = "special")]
153 Special,
154}