1use chrono::{prelude::DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, Clone)]
5#[serde(rename_all = "snake_case")]
6pub enum AuxiliaryMeaningType {
7 Whitelist,
8 Blacklist,
9}
10
11#[derive(Serialize, Deserialize, Debug, Clone)]
12pub struct AuxiliaryMeaning {
13 pub meaning: String,
14 #[serde(rename = "type")]
15 pub kind: AuxiliaryMeaningType,
16}
17
18#[derive(Serialize, Deserialize, Debug, Clone)]
19#[serde(rename_all = "snake_case")]
20pub enum ReadingType {
21 Kunyomi,
22 Nanori,
23 Onyomi,
24}
25
26#[derive(Serialize, Deserialize, Debug, Clone)]
27pub struct Meaning {
28 pub meaning: String,
29 pub primary: bool,
30 pub accepted_answer: bool,
31}
32
33#[derive(Serialize, Deserialize, Debug, Clone)]
34pub struct CharacterImageMetadata {
35 pub inline_styles: Option<bool>,
36 pub color: Option<String>,
37 pub dimensions: Option<String>,
38 pub style_name: Option<String>,
39}
40
41#[derive(Serialize, Deserialize, Debug, Clone)]
42pub struct CharacterImage {
43 pub url: String,
44 pub content_type: String,
45 pub metadata: CharacterImageMetadata,
46}
47
48#[derive(Serialize, Deserialize, Debug, Clone)]
49pub struct SubjectRadical {
50 pub auxiliary_meanings: Vec<AuxiliaryMeaning>,
51 pub characters: Option<String>,
52 pub created_at: DateTime<Utc>,
53 pub document_url: String,
54 pub hidden_at: Option<DateTime<Utc>>,
55 pub lesson_position: i64,
56 pub level: i64,
57 pub meaning_mnemonic: String,
58 pub meanings: Vec<Meaning>,
59 pub slug: String,
60 pub spaced_repetition_system_id: i64,
61 pub amalgamation_subject_ids: Vec<i64>,
62 pub character_images: Vec<CharacterImage>,
63}
64
65#[derive(Serialize, Deserialize, Debug, Clone)]
66pub struct Reading {
67 pub reading: String,
68 pub primary: bool,
69 pub accepted_answer: bool,
70 #[serde(rename = "type")]
71 pub kind: ReadingType,
72}
73
74#[derive(Serialize, Deserialize, Debug, Clone)]
75pub struct VocabularyReading {
76 pub reading: String,
77 pub primary: bool,
78 pub accepted_answer: bool,
79}
80
81#[derive(Serialize, Deserialize, Debug, Clone)]
82pub struct SubjectKanji {
83 pub auxiliary_meanings: Vec<AuxiliaryMeaning>,
84 pub characters: String,
85 pub created_at: DateTime<Utc>,
86 pub document_url: String,
87 pub hidden_at: Option<DateTime<Utc>>,
88 pub lesson_position: i64,
89 pub level: i64,
90 pub meaning_mnemonic: String,
91 pub meanings: Vec<Meaning>,
92 pub slug: String,
93 pub spaced_repetition_system_id: i64,
94 pub amalgamation_subject_ids: Vec<i64>,
95 pub component_subject_ids: Vec<i64>,
96 pub meaning_hint: Option<String>,
97 pub reading_hint: Option<String>,
98 pub reading_mnemonic: String,
99 pub readings: Vec<Reading>,
100 pub visually_similar_subject_ids: Vec<i64>,
101}
102
103#[derive(Serialize, Deserialize, Debug, Clone)]
104pub struct Sentence {
105 #[serde(rename = "en")]
106 english: String,
107 #[serde(rename = "ja")]
108 japanese: String,
109}
110
111#[derive(Serialize, Deserialize, Debug, Clone)]
112pub struct PronunciationAudioMetadata {
113 pub gender: String,
114 pub source_id: i64,
115 pub pronunciation: String,
116 pub voice_actor_id: i64,
117 pub voice_actor_name: String,
118 pub voice_description: String,
119}
120
121#[derive(Serialize, Deserialize, Debug, Clone)]
122pub struct PronunciationAudio {
123 pub url: String,
124 pub content_type: String,
125 pub metadata: PronunciationAudioMetadata,
126}
127
128#[derive(Serialize, Deserialize, Debug, Clone)]
129pub struct SubjectVocabulary {
130 pub auxiliary_meanings: Vec<AuxiliaryMeaning>,
131 pub characters: String,
132 pub created_at: DateTime<Utc>,
133 pub document_url: String,
134 pub hidden_at: Option<DateTime<Utc>>,
135 pub lesson_position: i64,
136 pub level: i64,
137 pub meaning_mnemonic: String,
138 pub meanings: Vec<Meaning>,
139 pub slug: String,
140 pub spaced_repetition_system_id: i64,
141 pub component_subject_ids: Vec<i64>,
142 pub context_sentences: Vec<Sentence>,
143 pub parts_of_speech: Vec<String>,
144 pub pronunciation_audios: Vec<PronunciationAudio>,
145 pub readings: Vec<VocabularyReading>,
146 pub reading_mnemonic: String,
147}
148
149#[derive(Serialize, Deserialize, Debug, Clone)]
150pub struct SubjectKanaVocabulary {
151 pub context_sentences: Vec<Sentence>,
152 pub meaning_mnemonic: String,
153 pub parts_of_speech: Vec<String>,
154 pub pronunciation_audios: Vec<PronunciationAudio>,
155 pub created_at: DateTime<Utc>,
156 pub level: i64,
157 pub slug: String,
158 pub hidden_at: Option<DateTime<Utc>>,
159 pub document_url: String,
160 pub characters: String,
161 pub meanings: Vec<Meaning>,
162 pub auxiliary_meanings: Vec<AuxiliaryMeaning>,
163 pub lesson_position: i64,
164 pub spaced_repetition_system_id: i64,
165}
166
167#[derive(Serialize, Deserialize, Debug, Clone)]
168#[serde(untagged)]
169pub enum Subject {
170 Radical(SubjectRadical),
171 Kanji(SubjectKanji),
172 Vocabulary(SubjectVocabulary),
173 KanaVocabulary(SubjectKanaVocabulary),
174}