mal_query/myanimelist/
models.rs

1use serde::{Deserialize, Serialize};
2
3// -------- enums --------
4
5#[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// -------- MalAnimeDataDetailed --------
143
144#[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>>, // TODO: Add Manga Related
176    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, // enum?
224    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// -------- Functions --------
260
261#[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}