1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Deserialize, PartialEq)]
6pub enum RankingType {
7 All,
8 Airing,
9 Upcoming,
10 TV,
11 OVA,
12 Movie,
13 Special,
14 ByPopularity,
15 Favorite,
16 None,
17}
18
19#[derive(Debug, Deserialize, PartialEq)]
20pub enum Season {
21 #[serde(rename = "winter")]
22 Winter,
23 #[serde(rename = "spring")]
24 Spring,
25 #[serde(rename = "summer")]
26 Summer,
27 #[serde(rename = "fall")]
28 Fall
29}
30
31#[derive(Debug, Deserialize, PartialEq)]
32pub enum Nsfw {
33 #[serde(rename = "white")]
34 White,
35 #[serde(rename = "gray")]
36 Gray,
37 #[serde(rename = "black")]
38 Black,
39}
40
41#[derive(Debug, Deserialize, PartialEq)]
42pub enum MediaType {
43 #[serde(rename = "unknown")]
44 Unknown,
45 #[serde(rename = "tv")]
46 TV,
47 #[serde(rename = "ova")]
48 OVA,
49 #[serde(rename = "movie")]
50 Movie,
51 #[serde(rename = "special")]
52 Special,
53 #[serde(rename = "ona")]
54 ONA,
55 #[serde(rename = "music")]
56 Music,
57}
58
59#[derive(Debug, Deserialize, PartialEq)]
60pub enum AiringStatus {
61 #[serde(rename = "finished_airing")]
62 FinishedAiring,
63 #[serde(rename = "currently_airing")]
64 CurrentlyAiring,
65 #[serde(rename = "not_yet_aired")]
66 NotYetAired,
67}
68
69#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
70pub enum Status {
71 #[serde(rename = "watching")]
72 Watching,
73 #[serde(rename = "completed")]
74 Completed,
75 #[serde(rename = "on_hold")]
76 OnHold,
77 #[serde(rename = "dropped")]
78 Dropped,
79 #[serde(rename = "plan_to_watch")]
80 PlanToWatch,
81}
82
83#[derive(Debug, Deserialize, PartialEq)]
84pub enum Source {
85 #[serde(rename = "other")]
86 Other,
87 #[serde(rename = "original")]
88 Original,
89 #[serde(rename = "manga")]
90 Manga,
91 #[serde(rename = "4_koma_manga")]
92 FourKomaManga,
93 #[serde(rename = "web_manga")]
94 WebManga,
95 #[serde(rename = "digital_manga")]
96 DigitalManga,
97 #[serde(rename = "novel")]
98 Novel,
99 #[serde(rename = "light_novel")]
100 LightNovel,
101 #[serde(rename = "visual_novel")]
102 VisualNovel,
103 #[serde(rename = "game")]
104 Game,
105 #[serde(rename = "card_game")]
106 CardGame,
107 #[serde(rename = "book")]
108 Book,
109 #[serde(rename = "picture_book")]
110 PictureBook,
111 #[serde(rename = "radio")]
112 Radio,
113 #[serde(rename = "music")]
114 Music,
115}
116
117#[derive(Debug, Deserialize, PartialEq)]
118pub enum Rating {
119 #[serde(rename = "g")]
120 G,
121 #[serde(rename = "pg")]
122 PG,
123 #[serde(rename = "pg_13")]
124 PG13,
125 #[serde(rename = "r")]
126 R,
127 #[serde(rename = "r+")]
128 RPlus,
129 #[serde(rename = "rx")]
130 RX,
131}
132
133#[derive(Debug, Deserialize, PartialEq)]
134pub enum Sort {
135 ListScore,
136 ListUpdatedAt,
137 AnimeTitle,
138 AnimeStartDate,
139 AnimeId
140}
141
142#[derive(Debug, Deserialize, Default, PartialEq)]
145pub struct MalAnimeData {
146 pub id: u32,
147 pub title: String,
148 pub main_picture: Picture,
149 pub alternative_titles: Option<AlternativeTitles>,
150 pub start_date: Option<String>,
151 pub end_date: Option<String>,
152 pub synopsis: Option<String>,
153 pub mean: Option<f32>,
154 pub rank: Option<u32>,
155 pub popularity: Option<u32>,
156 pub num_list_users: Option<u32>,
157 pub num_scoring_users: Option<u32>,
158 pub nsfw: Option<Nsfw>,
159 pub genres: Option<Vec<Genres>>,
160 pub created_at: Option<String>,
161 pub updated_at: Option<String>,
162 pub media_type: Option<MediaType>,
163 pub status: Option<AiringStatus>,
164 pub list_status: Option<ListStatus>,
165 pub num_episodes: Option<u32>,
166 pub start_season: Option<StartSeason>,
167 pub broadcast: Option<Broadcast>,
168 pub source: Option<Source>,
169 pub average_episode_duration: Option<u32>,
170 pub rating: Option<Rating>,
171 pub studios: Option<Vec<Studios>>,
172 pub pictures: Option<Vec<Picture>>,
173 pub background: Option<String>,
174 pub related_anime: Option<Vec<Related>>,
175 pub related_manga: Option<Vec<Related>>, pub recommendations: Option<Vec<Recommended>>,
177 pub statistics: Option<Statistics>,
178}
179
180#[derive(Debug, Deserialize, Default, PartialEq)]
181pub struct Picture {
182 pub large: String,
183 pub medium: String,
184}
185
186#[derive(Debug, Deserialize, PartialEq)]
187pub struct AlternativeTitles {
188 pub synonyms: Vec<String>,
189 pub en: String,
190 pub ja: String,
191}
192
193#[derive(Debug, Deserialize, PartialEq)]
194pub struct Genres {
195 pub id: u32,
196 pub name: String,
197}
198
199#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
200pub struct ListStatus {
201 pub status: Status,
202 pub score: u32,
203 pub num_episodes_watched: u32,
204 pub is_rewatching: bool,
205 pub start_date: Option<String>,
206 pub finish_date: Option<String>,
207 pub priority: Option<u32>,
208 pub num_times_rewatched: Option<u32>,
209 pub rewatch_value: Option<u32>,
210 pub tags: Option<Vec<String>>,
211 pub comments: Option<String>,
212 pub updated_at: String,
213}
214
215#[derive(Debug, Deserialize, PartialEq)]
216pub struct StartSeason {
217 pub year: u32,
218 pub season: Season,
219}
220
221#[derive(Debug, Deserialize, PartialEq)]
222pub struct Broadcast {
223 pub day_of_the_week: String, pub start_time: String,
225}
226
227#[derive(Debug, Deserialize, PartialEq)]
228pub struct Studios {
229 pub id: u32,
230 pub name: String,
231}
232
233#[derive(Debug, Deserialize, PartialEq)]
234pub struct Related {
235 pub node: MalAnimeData,
236 pub relation_type: String,
237}
238
239#[derive(Debug, Deserialize, PartialEq)]
240pub struct Recommended {
241 pub node: MalAnimeData,
242}
243
244#[derive(Debug, Deserialize, PartialEq)]
245pub struct Statistics {
246 pub num_list_users: u32,
247 pub status: StatisticsStatus,
248}
249
250#[derive(Debug, Deserialize, PartialEq)]
251pub struct StatisticsStatus {
252 pub watching: String,
253 pub completed: String,
254 pub on_hold: String,
255 pub dropped: String,
256 pub plan_to_watch: String,
257}
258
259#[derive(Debug)]
262pub struct MalAnimeSearch {
263 pub data: Vec<MalAnimeData>,
264}
265
266impl MalAnimeSearch {
267 pub fn new(data: Vec<MalAnimeData>) -> Self {
268 MalAnimeSearch {
269 data
270 }
271 }
272 pub fn to_titles(self) -> Vec<String> {
273 self.data.into_iter().map(|x| x.title).collect()
274 }
275 pub fn get<'a>(&'a self, index: usize) -> Option<&'a MalAnimeData> {
276 self.data.get(index)
277 }
278}