Skip to main content

wanisabi_model/
subject.rs

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}