rust_anilist/models/
language.rs

1// SPDX-License-Identifier: MIT
2// Copyright (c) 2022-2025 Andriel Ferreira <https://github.com/AndrielFR>
3
4//! This module contains the `Language` enum.
5
6use serde::{Deserialize, Serialize};
7
8/// Represents a language with various options.
9///
10/// The `Language` enum defines a list of supported languages, each with
11/// an associated variant. The default language is Japanese.
12///
13/// # Variants
14///
15/// * `Japanese` - The Japanese language.
16/// * `English` - The English language.
17/// * `Korean` - The Korean language.
18/// * `Italian` - The Italian language.
19/// * `Spanish` - The Spanish language.
20/// * `Portuguese` - The Portuguese language.
21/// * `French` - The French language.
22/// * `German` - The German language.
23/// * `Hebrew` - The Hebrew language.
24/// * `Hungarian` - The Hungarian language.
25/// * `Chinese` - The Chinese language.
26/// * `Arabic` - The Arabic language.
27/// * `Filipino` - The Filipino language.
28/// * `Catalan` - The Catalan language.
29/// * `Finnish` - The Finnish language.
30/// * `Turkish` - The Turkish language.
31/// * `Dutch` - The Dutch language.
32/// * `Swedish` - The Swedish language.
33/// * `Thai` - The Thai language.
34/// * `Tagalog` - The Tagalog language.
35/// * `Malaysian` - The Malaysian language.
36/// * `Indonesian` - The Indonesian language.
37/// * `Vietnamese` - The Vietnamese language.
38/// * `Nepali` - The Nepali language.
39/// * `Hindi` - The Hindi language.
40/// * `Urdu` - The Urdu language.
41#[derive(Debug, Default, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
42#[serde(rename_all(deserialize = "PascalCase"))]
43pub enum Language {
44    /// The Japanese language.
45    #[default]
46    Japanese,
47    /// The English language.
48    English,
49    /// The Korean language.
50    Korean,
51    /// The Italian language.
52    Italian,
53    /// The Spanish language.
54    Spanish,
55    /// The Portuguese language.
56    Portuguese,
57    /// The French language.
58    French,
59    /// The German language.
60    German,
61    /// The Hebrew language.
62    Hebrew,
63    /// The Hungarian language.
64    Hungarian,
65    /// The Chinese language.
66    Chinese,
67    /// The Arabic language.
68    Arabic,
69    /// The Filipino language.
70    Filipino,
71    /// The Catalan language.
72    Catalan,
73    /// The Finnish language.
74    Finnish,
75    /// The Turkish language.
76    Turkish,
77    /// The Dutch language.
78    Dutch,
79    /// The Swedish language.
80    Swedish,
81    /// The Thai language.
82    Thai,
83    /// The Tagalog language.
84    Tagalog,
85    /// The Malaysian language.
86    Malaysian,
87    /// The Indonesian language.
88    Indonesian,
89    /// The Vietnamese language.
90    Vietnamese,
91    /// The Nepali language.
92    Nepali,
93    /// The Hindi language.
94    Hindi,
95    /// The Urdu language.
96    Urdu,
97}
98
99impl Language {
100    /// Returns the ISO 639-1 code of the language.
101    pub fn code(&self) -> &str {
102        match self {
103            Language::Japanese => "ja",
104            Language::English => "en",
105            Language::Korean => "ko",
106            Language::Italian => "it",
107            Language::Spanish => "es",
108            Language::Portuguese => "pt",
109            Language::French => "fr",
110            Language::German => "de",
111            Language::Hebrew => "he",
112            Language::Hungarian => "hu",
113            Language::Chinese => "zh",
114            Language::Arabic => "ar",
115            Language::Filipino => "fil",
116            Language::Catalan => "ca",
117            Language::Finnish => "fi",
118            Language::Turkish => "tr",
119            Language::Dutch => "nl",
120            Language::Swedish => "sv",
121            Language::Thai => "th",
122            Language::Tagalog => "tl",
123            Language::Malaysian => "ms",
124            Language::Indonesian => "id",
125            Language::Vietnamese => "vi",
126            Language::Nepali => "ne",
127            Language::Hindi => "hi",
128            Language::Urdu => "ur",
129        }
130    }
131
132    /// Returns the ISO 639-1 code of the language.
133    ///
134    /// Alias of `code`.
135    pub fn iso(&self) -> &str {
136        self.code()
137    }
138
139    /// Returns the name of the language in the native language.
140    pub fn native(&self) -> &str {
141        match self {
142            Language::Japanese => "日本語",
143            Language::English => "English",
144            Language::Korean => "한국어",
145            Language::Italian => "Italiano",
146            Language::Spanish => "Español",
147            Language::Portuguese => "Português",
148            Language::French => "Français",
149            Language::German => "Deutsch",
150            Language::Hebrew => "עברית",
151            Language::Hungarian => "Magyar",
152            Language::Chinese => "中文",
153            Language::Arabic => "العربية",
154            Language::Filipino => "Filipino",
155            Language::Catalan => "Català",
156            Language::Finnish => "Suomi",
157            Language::Turkish => "Türkçe",
158            Language::Dutch => "Nederlands",
159            Language::Swedish => "Svenska",
160            Language::Thai => "ไทย",
161            Language::Tagalog => "Tagalog",
162            Language::Malaysian => "Bahasa Melayu",
163            Language::Indonesian => "Bahasa Indonesia",
164            Language::Vietnamese => "Tiếng Việt",
165            Language::Nepali => "नेपाली",
166            Language::Hindi => "हिंदी",
167            Language::Urdu => "اردو",
168        }
169    }
170}
171
172impl From<&str> for Language {
173    fn from(value: &str) -> Self {
174        match value.trim().to_uppercase().as_str() {
175            "JA" | "JP" | "JAPANESE" => Language::Japanese,
176            "EN" | "UK" | "ENGLISH" => Language::English,
177            "KO" | "KOREAN" => Language::Korean,
178            "IT" | "ITALIAN" => Language::Italian,
179            "ES" | "SPANISH" => Language::Spanish,
180            "PT" | "PORTUGUESE" => Language::Portuguese,
181            "FR" | "FRENCH" => Language::French,
182            "DE" | "GERMAN" => Language::German,
183            "HE" | "HEBREW" => Language::Hebrew,
184            "HU" | "HUNGARIAN" => Language::Hungarian,
185            "ZH" | "CHINESE" => Language::Chinese,
186            "AR" | "ARABIC" => Language::Arabic,
187            "FIL" | "PHILIPPINE" => Language::Filipino,
188            "CA" | "CATALAN" => Language::Catalan,
189            "FI" | "FINNISH" => Language::Finnish,
190            "TR" | "TURKISH" => Language::Turkish,
191            "NL" | "DUTCH" => Language::Dutch,
192            "SV" | "SWEDISH" => Language::Swedish,
193            "TH" | "THAI" => Language::Thai,
194            "TL" | "TAGALOG" => Language::Tagalog,
195            "MS" | "MALAYSIAN" => Language::Malaysian,
196            "ID" | "INDONESIAN" => Language::Indonesian,
197            "VI" | "VIETNAMESE" => Language::Vietnamese,
198            "NE" | "NEPALI" => Language::Nepali,
199            "HI" | "HINDI" => Language::Hindi,
200            "UR" | "URDU" => Language::Urdu,
201            _ => Language::default(),
202        }
203    }
204}
205
206impl From<String> for Language {
207    fn from(value: String) -> Self {
208        Language::from(value.as_str())
209    }
210}
211
212impl std::fmt::Display for Language {
213    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
214        match self {
215            Language::Japanese => write!(f, "Japanese"),
216            Language::English => write!(f, "English"),
217            Language::Korean => write!(f, "Korean"),
218            Language::Italian => write!(f, "Italian"),
219            Language::Spanish => write!(f, "Spanish"),
220            Language::Portuguese => write!(f, "Portuguese"),
221            Language::French => write!(f, "French"),
222            Language::German => write!(f, "German"),
223            Language::Hebrew => write!(f, "Hebrew"),
224            Language::Hungarian => write!(f, "Hungarian"),
225            Language::Chinese => write!(f, "Chinese"),
226            Language::Arabic => write!(f, "Arabic"),
227            Language::Filipino => write!(f, "Filipino"),
228            Language::Catalan => write!(f, "Catalan"),
229            Language::Finnish => write!(f, "Finnish"),
230            Language::Turkish => write!(f, "Turkish"),
231            Language::Dutch => write!(f, "Dutch"),
232            Language::Swedish => write!(f, "Swedish"),
233            Language::Thai => write!(f, "Thai"),
234            Language::Tagalog => write!(f, "Tagalog"),
235            Language::Malaysian => write!(f, "Malaysian"),
236            Language::Indonesian => write!(f, "Indonesian"),
237            Language::Vietnamese => write!(f, "Vietnamese"),
238            Language::Nepali => write!(f, "Nepali"),
239            Language::Hindi => write!(f, "Hindi"),
240            Language::Urdu => write!(f, "Urdu"),
241        }
242    }
243}
244
245#[cfg(test)]
246mod tests {
247    use super::*;
248
249    #[test]
250    fn test_code() {
251        assert_eq!(Language::Japanese.code(), "ja");
252        assert_eq!(Language::English.code(), "en");
253        assert_eq!(Language::Korean.code(), "ko");
254        assert_eq!(Language::Italian.code(), "it");
255        assert_eq!(Language::Spanish.code(), "es");
256        assert_eq!(Language::Portuguese.code(), "pt");
257        assert_eq!(Language::French.code(), "fr");
258        assert_eq!(Language::German.code(), "de");
259        assert_eq!(Language::Hebrew.code(), "he");
260        assert_eq!(Language::Hungarian.code(), "hu");
261        assert_eq!(Language::Chinese.code(), "zh");
262        assert_eq!(Language::Arabic.code(), "ar");
263        assert_eq!(Language::Filipino.code(), "fil");
264        assert_eq!(Language::Catalan.code(), "ca");
265        assert_eq!(Language::Finnish.code(), "fi");
266        assert_eq!(Language::Turkish.code(), "tr");
267        assert_eq!(Language::Dutch.code(), "nl");
268        assert_eq!(Language::Swedish.code(), "sv");
269        assert_eq!(Language::Thai.code(), "th");
270        assert_eq!(Language::Tagalog.code(), "tl");
271        assert_eq!(Language::Malaysian.code(), "ms");
272        assert_eq!(Language::Indonesian.code(), "id");
273        assert_eq!(Language::Vietnamese.code(), "vi");
274        assert_eq!(Language::Nepali.code(), "ne");
275        assert_eq!(Language::Hindi.code(), "hi");
276        assert_eq!(Language::Urdu.code(), "ur");
277    }
278
279    #[test]
280    fn test_iso() {
281        assert_eq!(Language::Japanese.iso(), "ja");
282        assert_eq!(Language::English.iso(), "en");
283        assert_eq!(Language::Korean.iso(), "ko");
284        assert_eq!(Language::Italian.iso(), "it");
285        assert_eq!(Language::Spanish.iso(), "es");
286        assert_eq!(Language::Portuguese.iso(), "pt");
287        assert_eq!(Language::French.iso(), "fr");
288        assert_eq!(Language::German.iso(), "de");
289        assert_eq!(Language::Hebrew.iso(), "he");
290        assert_eq!(Language::Hungarian.iso(), "hu");
291        assert_eq!(Language::Chinese.iso(), "zh");
292        assert_eq!(Language::Arabic.iso(), "ar");
293        assert_eq!(Language::Filipino.iso(), "fil");
294        assert_eq!(Language::Catalan.iso(), "ca");
295        assert_eq!(Language::Finnish.iso(), "fi");
296        assert_eq!(Language::Turkish.iso(), "tr");
297        assert_eq!(Language::Dutch.iso(), "nl");
298        assert_eq!(Language::Swedish.iso(), "sv");
299        assert_eq!(Language::Thai.iso(), "th");
300        assert_eq!(Language::Tagalog.iso(), "tl");
301        assert_eq!(Language::Malaysian.iso(), "ms");
302        assert_eq!(Language::Indonesian.iso(), "id");
303        assert_eq!(Language::Vietnamese.iso(), "vi");
304        assert_eq!(Language::Nepali.iso(), "ne");
305        assert_eq!(Language::Hindi.iso(), "hi");
306        assert_eq!(Language::Urdu.iso(), "ur");
307    }
308
309    #[test]
310    fn test_native() {
311        assert_eq!(Language::Japanese.native(), "日本語");
312        assert_eq!(Language::English.native(), "English");
313        assert_eq!(Language::Korean.native(), "한국어");
314        assert_eq!(Language::Italian.native(), "Italiano");
315        assert_eq!(Language::Spanish.native(), "Español");
316        assert_eq!(Language::Portuguese.native(), "Português");
317        assert_eq!(Language::French.native(), "Français");
318        assert_eq!(Language::German.native(), "Deutsch");
319        assert_eq!(Language::Hebrew.native(), "עברית");
320        assert_eq!(Language::Hungarian.native(), "Magyar");
321        assert_eq!(Language::Chinese.native(), "中文");
322        assert_eq!(Language::Arabic.native(), "العربية");
323        assert_eq!(Language::Filipino.native(), "Filipino");
324        assert_eq!(Language::Catalan.native(), "Català");
325        assert_eq!(Language::Finnish.native(), "Suomi");
326        assert_eq!(Language::Turkish.native(), "Türkçe");
327        assert_eq!(Language::Dutch.native(), "Nederlands");
328        assert_eq!(Language::Swedish.native(), "Svenska");
329        assert_eq!(Language::Thai.native(), "ไทย");
330        assert_eq!(Language::Tagalog.native(), "Tagalog");
331        assert_eq!(Language::Malaysian.native(), "Bahasa Melayu");
332        assert_eq!(Language::Indonesian.native(), "Bahasa Indonesia");
333        assert_eq!(Language::Vietnamese.native(), "Tiếng Việt");
334        assert_eq!(Language::Nepali.native(), "नेपाली");
335        assert_eq!(Language::Hindi.native(), "हिंदी");
336        assert_eq!(Language::Urdu.native(), "اردو");
337    }
338
339    #[test]
340    fn test_from_str() {
341        assert_eq!(Language::from("ja"), Language::Japanese);
342        assert_eq!(Language::from("EN"), Language::English);
343        assert_eq!(Language::from("ko"), Language::Korean);
344        assert_eq!(Language::from("it"), Language::Italian);
345        assert_eq!(Language::from("es"), Language::Spanish);
346        assert_eq!(Language::from("pt"), Language::Portuguese);
347        assert_eq!(Language::from("fr"), Language::French);
348        assert_eq!(Language::from("de"), Language::German);
349        assert_eq!(Language::from("he"), Language::Hebrew);
350        assert_eq!(Language::from("hu"), Language::Hungarian);
351        assert_eq!(Language::from("zh"), Language::Chinese);
352        assert_eq!(Language::from("ar"), Language::Arabic);
353        assert_eq!(Language::from("fil"), Language::Filipino);
354        assert_eq!(Language::from("ca"), Language::Catalan);
355        assert_eq!(Language::from("fi"), Language::Finnish);
356        assert_eq!(Language::from("tr"), Language::Turkish);
357        assert_eq!(Language::from("nl"), Language::Dutch);
358        assert_eq!(Language::from("sv"), Language::Swedish);
359        assert_eq!(Language::from("th"), Language::Thai);
360        assert_eq!(Language::from("tl"), Language::Tagalog);
361        assert_eq!(Language::from("ms"), Language::Malaysian);
362        assert_eq!(Language::from("id"), Language::Indonesian);
363        assert_eq!(Language::from("vi"), Language::Vietnamese);
364        assert_eq!(Language::from("ne"), Language::Nepali);
365        assert_eq!(Language::from("hi"), Language::Hindi);
366        assert_eq!(Language::from("ur"), Language::Urdu);
367        assert_eq!(Language::from("unknown"), Language::Japanese); // Default case
368    }
369
370    #[test]
371    fn test_from_string() {
372        assert_eq!(Language::from("ja".to_string()), Language::Japanese);
373        assert_eq!(Language::from("EN".to_string()), Language::English);
374        assert_eq!(Language::from("ko".to_string()), Language::Korean);
375        assert_eq!(Language::from("it".to_string()), Language::Italian);
376        assert_eq!(Language::from("es".to_string()), Language::Spanish);
377        assert_eq!(Language::from("pt".to_string()), Language::Portuguese);
378        assert_eq!(Language::from("fr".to_string()), Language::French);
379        assert_eq!(Language::from("de".to_string()), Language::German);
380        assert_eq!(Language::from("he".to_string()), Language::Hebrew);
381        assert_eq!(Language::from("hu".to_string()), Language::Hungarian);
382        assert_eq!(Language::from("zh".to_string()), Language::Chinese);
383        assert_eq!(Language::from("ar".to_string()), Language::Arabic);
384        assert_eq!(Language::from("fil".to_string()), Language::Filipino);
385        assert_eq!(Language::from("ca".to_string()), Language::Catalan);
386        assert_eq!(Language::from("fi".to_string()), Language::Finnish);
387        assert_eq!(Language::from("tr".to_string()), Language::Turkish);
388        assert_eq!(Language::from("nl".to_string()), Language::Dutch);
389        assert_eq!(Language::from("sv".to_string()), Language::Swedish);
390        assert_eq!(Language::from("th".to_string()), Language::Thai);
391        assert_eq!(Language::from("tl".to_string()), Language::Tagalog);
392        assert_eq!(Language::from("ms".to_string()), Language::Malaysian);
393        assert_eq!(Language::from("id".to_string()), Language::Indonesian);
394        assert_eq!(Language::from("vi".to_string()), Language::Vietnamese);
395        assert_eq!(Language::from("ne".to_string()), Language::Nepali);
396        assert_eq!(Language::from("hi".to_string()), Language::Hindi);
397        assert_eq!(Language::from("ur".to_string()), Language::Urdu);
398        assert_eq!(Language::from("unknown".to_string()), Language::Japanese); // Default case
399    }
400}