kitsu_rs/
model.rs

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}