1use crate::error::Error as GoogleMapsError;
6use phf::phf_map;
7use serde::{Deserialize, Deserializer, Serialize, Serializer};
8
9#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
61#[repr(u16)]
62#[non_exhaustive]
63pub enum Language {
64 Afrikaans = 0,
65 Albanian = 1,
66 Amharic = 2,
67 Arabic = 3,
68 Armenian = 4,
69 Azerbaijani = 5,
70 Basque = 6,
71 Belarusian = 7,
72 Bengali = 8,
73 Bosnian = 9,
74 Bulgarian = 10,
75 Burmese = 11,
76 Catalan = 12,
77 Chinese = 13,
78 ChineseHongKong = 14,
79 ChineseSimplified = 15,
80 ChineseTaiwan = 16,
81 ChineseTraditional = 17,
82 Croatian = 18,
83 Czech = 19,
84 Danish = 20,
85 Dutch = 21,
86 #[default]
87 English = 22,
88 EnglishAustralian = 23,
89 EnglishCanada = 24,
90 EnglishGreatBritain = 25,
91 EnglishUs = 26,
92 Estonian = 27,
93 Farsi = 28,
94 Finnish = 29,
95 Filipino = 30,
96 French = 31,
97 FrenchCanada = 32,
98 Galician = 33,
99 Georgian = 34,
100 German = 35,
101 Greek = 36,
102 Gujarati = 37,
103 Hebrew = 38,
104 Hindi = 39,
105 Hungarian = 40,
106 Icelandic = 41,
107 Indonesian = 42,
108 Italian = 43,
109 Japanese = 44,
110 Kannada = 45,
111 Kazakh = 46,
112 Khmer = 47,
113 Korean = 48,
114 Kyrgyz = 49,
115 Lao = 50,
116 Latvian = 51,
117 Lithuanian = 52,
118 Macedonian = 53,
119 Malay = 54,
120 Malayalam = 55,
121 Marathi = 56,
122 Mongolian = 57,
123 Nepali = 58,
124 Norwegian = 59,
125 Polish = 60,
126 Portuguese = 61,
127 PortugueseBrazil = 62,
128 PortuguesePortugal = 63,
129 Punjabi = 64,
130 Romanian = 65,
131 Russian = 66,
132 Serbian = 67,
133 Sinhalese = 68,
134 Slovak = 69,
135 Slovenian = 70,
136 Spanish = 71,
137 SpanishLatinAmerica = 72,
138 Swahili = 73,
139 Swedish = 74,
140 Tamil = 75,
141 Telugu = 76,
142 Thai = 77,
143 Turkish = 78,
144 Ukrainian = 79,
145 Urdu = 80,
146 Uzbek = 81,
147 Vietnamese = 82,
148 Zulu = 83,
149 Other = 84,
158} impl<'de> Deserialize<'de> for Language {
163 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
166 let string = String::deserialize(deserializer)?;
167 match Self::try_from(string.as_str()) {
168 Ok(variant) => Ok(variant),
169 Err(error) => Err(serde::de::Error::custom(error.to_string())),
170 } } } impl Serialize for Language {
177 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
179 where
180 S: Serializer,
181 {
182 serializer.serialize_str(std::convert::Into::<&str>::into(self))
183 } } impl std::convert::From<&Self> for Language {
189 fn from(language: &Self) -> Self {
192 *language
193 } } impl std::convert::From<&Language> for &str {
199 fn from(language: &Language) -> Self {
202 match language {
203 Language::Afrikaans => "af",
204 Language::Albanian => "sq",
205 Language::Amharic => "am",
206 Language::Arabic => "ar",
207 Language::Armenian => "hy",
208 Language::Azerbaijani => "az",
209 Language::Basque => "eu",
210 Language::Belarusian => "be",
211 Language::Bengali => "bn",
212 Language::Bosnian => "bs",
213 Language::Bulgarian => "bg",
214 Language::Burmese => "my",
215 Language::Catalan => "ca",
216 Language::Chinese => "zh",
217 Language::ChineseHongKong => "zh-HK",
218 Language::ChineseSimplified => "zh-CN",
219 Language::ChineseTaiwan => "zh-TW",
220 Language::ChineseTraditional => "zh-Hant",
221 Language::Croatian => "hr",
222 Language::Czech => "cs",
223 Language::Danish => "da",
224 Language::Dutch => "nl",
225 Language::English => "en",
226 Language::EnglishAustralian => "en-AU",
227 Language::EnglishCanada => "en-CA",
228 Language::EnglishGreatBritain => "en-GB",
229 Language::EnglishUs => "en-US",
230 Language::Estonian => "et",
231 Language::Farsi => "fa",
232 Language::Finnish => "fi",
233 Language::Filipino => "fil",
234 Language::French => "fr",
235 Language::FrenchCanada => "fr-CA",
236 Language::Galician => "gl",
237 Language::Georgian => "ka",
238 Language::German => "de",
239 Language::Greek => "el",
240 Language::Gujarati => "gu",
241 Language::Hebrew => "iw",
242 Language::Hindi => "hi",
243 Language::Hungarian => "hu",
244 Language::Icelandic => "is",
245 Language::Indonesian => "id",
246 Language::Italian => "it",
247 Language::Japanese => "ja",
248 Language::Kannada => "kn",
249 Language::Kazakh => "kk",
250 Language::Khmer => "km",
251 Language::Korean => "ko",
252 Language::Kyrgyz => "ky",
253 Language::Lao => "lo",
254 Language::Latvian => "lv",
255 Language::Lithuanian => "lt",
256 Language::Macedonian => "mk",
257 Language::Malay => "ms",
258 Language::Malayalam => "ml",
259 Language::Marathi => "mr",
260 Language::Mongolian => "mn",
261 Language::Nepali => "ne",
262 Language::Norwegian => "no",
263 Language::Polish => "pl",
264 Language::Portuguese => "pt",
265 Language::PortugueseBrazil => "pt-BR",
266 Language::PortuguesePortugal => "pt-PT",
267 Language::Punjabi => "pa",
268 Language::Romanian => "ro",
269 Language::Russian => "ru",
270 Language::Serbian => "sr",
271 Language::Sinhalese => "si",
272 Language::Slovak => "sk",
273 Language::Slovenian => "sl",
274 Language::Spanish => "es",
275 Language::SpanishLatinAmerica => "es-419",
276 Language::Swahili => "sw",
277 Language::Swedish => "sv",
278 Language::Tamil => "ta",
279 Language::Telugu => "te",
280 Language::Thai => "th",
281 Language::Turkish => "tr",
282 Language::Ukrainian => "uk",
283 Language::Urdu => "ur",
284 Language::Uzbek => "uz",
285 Language::Vietnamese => "vi",
286 Language::Zulu => "zu",
287 Language::Other => "xx",
288 } } } impl std::fmt::Display for Language {
295 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
298 write!(f, "{}", std::convert::Into::<&str>::into(self))
299 } } impl std::convert::From<&Language> for String {
305 fn from(language: &Language) -> Self {
308 std::convert::Into::<&str>::into(language).to_string()
309 } } static LANGUAGES_BY_CODE: phf::Map<&'static str, Language> = phf_map! {
315 "af" => Language::Afrikaans,
316 "sq" => Language::Albanian,
317 "am" => Language::Amharic,
318 "ar" => Language::Arabic,
319 "hy" => Language::Armenian,
320 "az" => Language::Azerbaijani,
321 "eu" => Language::Basque,
322 "be" => Language::Belarusian,
323 "bn" => Language::Bengali,
324 "bs" => Language::Bosnian,
325 "bg" => Language::Bulgarian,
326 "my" => Language::Burmese,
327 "ca" => Language::Catalan,
328 "zh" => Language::Chinese,
329 "zh-CN" => Language::ChineseSimplified,
330 "zh-Hant" => Language::ChineseTraditional,
331 "zh-HK" => Language::ChineseHongKong,
332 "zh-TW" => Language::ChineseTaiwan,
333 "hr" => Language::Croatian,
334 "cs" => Language::Czech,
335 "da" => Language::Danish,
336 "nl" => Language::Dutch,
337 "en" => Language::English,
338 "en-AU" => Language::EnglishAustralian,
339 "en-CA" => Language::EnglishCanada,
340 "en-GB" => Language::EnglishGreatBritain,
341 "en-US" => Language::EnglishUs,
342 "et" => Language::Estonian,
343 "fa" => Language::Farsi,
344 "fi" => Language::Finnish,
345 "fil" => Language::Filipino,
346 "fr" => Language::French,
347 "fr-CA" => Language::FrenchCanada,
348 "gl" => Language::Galician,
349 "ka" => Language::Georgian,
350 "de" => Language::German,
351 "el" => Language::Greek,
352 "gu" => Language::Gujarati,
353 "iw" => Language::Hebrew,
354 "hi" => Language::Hindi,
355 "hu" => Language::Hungarian,
356 "is" => Language::Icelandic,
357 "id" => Language::Indonesian,
358 "it" => Language::Italian,
359 "ja" => Language::Japanese,
360 "kn" => Language::Kannada,
361 "kk" => Language::Kazakh,
362 "km" => Language::Khmer,
363 "ko" => Language::Korean,
364 "ky" => Language::Kyrgyz,
365 "lo" => Language::Lao,
366 "lv" => Language::Latvian,
367 "lt" => Language::Lithuanian,
368 "mk" => Language::Macedonian,
369 "ms" => Language::Malay,
370 "ml" => Language::Malayalam,
371 "mr" => Language::Marathi,
372 "mn" => Language::Mongolian,
373 "ne" => Language::Nepali,
374 "no" => Language::Norwegian,
375 "pl" => Language::Polish,
376 "pt" => Language::Portuguese,
377 "pt-BR" => Language::PortugueseBrazil,
378 "pt-PT" => Language::PortuguesePortugal,
379 "pa" => Language::Punjabi,
380 "ro" => Language::Romanian,
381 "ru" => Language::Russian,
382 "sr" => Language::Serbian,
383 "si" => Language::Sinhalese,
384 "sk" => Language::Slovak,
385 "sl" => Language::Slovenian,
386 "es" => Language::Spanish,
387 "es-419" => Language::SpanishLatinAmerica,
388 "sw" => Language::Swahili,
389 "sv" => Language::Swedish,
390 "ta" => Language::Tamil,
391 "te" => Language::Telugu,
392 "th" => Language::Thai,
393 "tr" => Language::Turkish,
394 "uk" => Language::Ukrainian,
395 "ur" => Language::Urdu,
396 "uz" => Language::Uzbek,
397 "vi" => Language::Vietnamese,
398 "zu" => Language::Zulu,
399 "xx" => Language::Other,
400};
401
402impl std::convert::TryFrom<&str> for Language {
405 type Error = GoogleMapsError;
407 fn try_from(language_code: &str) -> Result<Self, Self::Error> {
410 Ok(LANGUAGES_BY_CODE
411 .get(language_code)
412 .copied()
413 .unwrap_or(Self::Other))
414 } } impl std::str::FromStr for Language {
420 type Err = GoogleMapsError;
422 fn from_str(language_code: &str) -> Result<Self, Self::Err> {
425 Ok(LANGUAGES_BY_CODE
426 .get(language_code)
427 .copied()
428 .unwrap_or(Self::Other))
429 } } impl Language {
435 #[must_use]
438 pub const fn display(&self) -> &str {
439 match self {
440 Self::Afrikaans => "Afrikaans",
441 Self::Albanian => "Albanian",
442 Self::Amharic => "Amharic",
443 Self::Arabic => "Arabic",
444 Self::Armenian => "Armenian",
445 Self::Azerbaijani => "Azerbaijani",
446 Self::Basque => "Basque",
447 Self::Belarusian => "Belarusian",
448 Self::Bengali => "Bengali",
449 Self::Bosnian => "Bosnian",
450 Self::Bulgarian => "Bulgarian",
451 Self::Burmese => "Burmese",
452 Self::Catalan => "Catalan",
453 Self::Chinese => "Chinese",
454 Self::ChineseHongKong => "Chinese (Hong Kong)",
455 Self::ChineseSimplified => "Chinese (Simplified)",
456 Self::ChineseTaiwan => "Chinese (Taiwan)",
457 Self::ChineseTraditional => "Chinese (Traditional)",
458 Self::Croatian => "Croatian",
459 Self::Czech => "Czech",
460 Self::Danish => "Danish",
461 Self::Dutch => "Dutch",
462 Self::English => "English",
463 Self::EnglishAustralian => "English (Australian)",
464 Self::EnglishCanada => "English (Canada)",
465 Self::EnglishGreatBritain => "English (Great Britain)",
466 Self::EnglishUs => "English (US)",
467 Self::Estonian => "Estonian",
468 Self::Farsi => "Farsi",
469 Self::Finnish => "Finnish",
470 Self::Filipino => "Filipino",
471 Self::French => "French",
472 Self::FrenchCanada => "French (Canada)",
473 Self::Galician => "Galician",
474 Self::Georgian => "Georgian",
475 Self::German => "German",
476 Self::Greek => "Greek",
477 Self::Gujarati => "Gujarati",
478 Self::Hebrew => "Hebrew",
479 Self::Hindi => "Hindi",
480 Self::Hungarian => "Hungarian",
481 Self::Icelandic => "Icelandic",
482 Self::Indonesian => "Indonesian",
483 Self::Italian => "Italian",
484 Self::Japanese => "Japanese",
485 Self::Kannada => "Kannada",
486 Self::Kazakh => "Kazakh",
487 Self::Khmer => "Khmer",
488 Self::Korean => "Korean",
489 Self::Kyrgyz => "Kyrgyz",
490 Self::Lao => "Lao",
491 Self::Latvian => "Latvian",
492 Self::Lithuanian => "Lithuanian",
493 Self::Macedonian => "Macedonian",
494 Self::Malay => "Malay",
495 Self::Malayalam => "Malayalam",
496 Self::Marathi => "Marathi",
497 Self::Mongolian => "Mongolian",
498 Self::Nepali => "Nepali",
499 Self::Norwegian => "Norwegian",
500 Self::Polish => "Polish",
501 Self::Portuguese => "Portuguese",
502 Self::PortugueseBrazil => "Portuguese (Brazil)",
503 Self::PortuguesePortugal => "Portuguese (Portugal)",
504 Self::Punjabi => "Punjabi",
505 Self::Romanian => "Romanian",
506 Self::Russian => "Russian",
507 Self::Serbian => "Serbian",
508 Self::Sinhalese => "Sinhalese",
509 Self::Slovak => "Slovak",
510 Self::Slovenian => "Slovenian",
511 Self::Spanish => "Spanish",
512 Self::SpanishLatinAmerica => "Spanish (Latin America)",
513 Self::Swahili => "Swahili",
514 Self::Swedish => "Swedish",
515 Self::Tamil => "Tamil",
516 Self::Telugu => "Telugu",
517 Self::Thai => "Thai",
518 Self::Turkish => "Turkish",
519 Self::Ukrainian => "Ukrainian",
520 Self::Urdu => "Urdu",
521 Self::Uzbek => "Uzbek",
522 Self::Vietnamese => "Vietnamese",
523 Self::Zulu => "Zulu",
524 Self::Other => "Other",
525 } } }