use super::builder::geo_enum;
impl Language {
#[must_use]
pub fn from_alpha3(code: &str) -> Option<Self> {
Self::ALL
.iter()
.find(|l| l.alpha3() == Some(code) || l.bibliographic() == Some(code))
.cloned()
}
}
geo_enum! {
meta LanguageMeta {
alpha3: Option<&'static str>,
bibliographic: Option<&'static str>,
}
pub enum Language / LanguageRef {
Afar => "aa", "Afar", { alpha3: Some("aar"), bibliographic: None },
Abkhazian => "ab", "Abkhazian", { alpha3: Some("abk"), bibliographic: None },
Avestan => "ae", "Avestan", { alpha3: Some("ave"), bibliographic: None },
Afrikaans => "af", "Afrikaans", { alpha3: Some("afr"), bibliographic: None },
Akan => "ak", "Akan", { alpha3: Some("aka"), bibliographic: None },
Amharic => "am", "Amharic", { alpha3: Some("amh"), bibliographic: None },
Aragonese => "an", "Aragonese", { alpha3: Some("arg"), bibliographic: None },
Arabic => "ar", "Arabic", { alpha3: Some("ara"), bibliographic: None },
Assamese => "as", "Assamese", { alpha3: Some("asm"), bibliographic: None },
Avaric => "av", "Avaric", { alpha3: Some("ava"), bibliographic: None },
Aymara => "ay", "Aymara", { alpha3: Some("aym"), bibliographic: None },
Azerbaijani => "az", "Azerbaijani", { alpha3: Some("aze"), bibliographic: None },
Bashkir => "ba", "Bashkir", { alpha3: Some("bak"), bibliographic: None },
Belarusian => "be", "Belarusian", { alpha3: Some("bel"), bibliographic: None },
Bulgarian => "bg", "Bulgarian", { alpha3: Some("bul"), bibliographic: None },
Bislama => "bi", "Bislama", { alpha3: Some("bis"), bibliographic: None },
Bambara => "bm", "Bambara", { alpha3: Some("bam"), bibliographic: None },
Bengali => "bn", "Bengali", { alpha3: Some("ben"), bibliographic: None },
Tibetan => "bo", "Tibetan", { alpha3: Some("bod"), bibliographic: Some("tib") },
Breton => "br", "Breton", { alpha3: Some("bre"), bibliographic: None },
Bosnian => "bs", "Bosnian", { alpha3: Some("bos"), bibliographic: None },
Catalan => "ca", "Catalan", { alpha3: Some("cat"), bibliographic: None },
Chechen => "ce", "Chechen", { alpha3: Some("che"), bibliographic: None },
Chamorro => "ch", "Chamorro", { alpha3: Some("cha"), bibliographic: None },
Corsican => "co", "Corsican", { alpha3: Some("cos"), bibliographic: None },
Cree => "cr", "Cree", { alpha3: Some("cre"), bibliographic: None },
Czech => "cs", "Czech", { alpha3: Some("ces"), bibliographic: Some("cze") },
ChurchSlavic => "cu", "Church Slavic", { alpha3: Some("chu"), bibliographic: None },
Chuvash => "cv", "Chuvash", { alpha3: Some("chv"), bibliographic: None },
Welsh => "cy", "Welsh", { alpha3: Some("cym"), bibliographic: Some("wel") },
Danish => "da", "Danish", { alpha3: Some("dan"), bibliographic: None },
German => "de", "German", { alpha3: Some("deu"), bibliographic: Some("ger") },
Divehi => "dv", "Divehi", { alpha3: Some("div"), bibliographic: None },
Dzongkha => "dz", "Dzongkha", { alpha3: Some("dzo"), bibliographic: None },
Ewe => "ee", "Ewe", { alpha3: Some("ewe"), bibliographic: None },
Greek => "el", "Greek", { alpha3: Some("ell"), bibliographic: Some("gre") },
English => "en", "English", { alpha3: Some("eng"), bibliographic: None },
Esperanto => "eo", "Esperanto", { alpha3: Some("epo"), bibliographic: None },
Spanish => "es", "Spanish", { alpha3: Some("spa"), bibliographic: None },
Estonian => "et", "Estonian", { alpha3: Some("est"), bibliographic: None },
Basque => "eu", "Basque", { alpha3: Some("eus"), bibliographic: Some("baq") },
Persian => "fa", "Persian", { alpha3: Some("fas"), bibliographic: Some("per") },
Fulah => "ff", "Fulah", { alpha3: Some("ful"), bibliographic: None },
Finnish => "fi", "Finnish", { alpha3: Some("fin"), bibliographic: None },
Fijian => "fj", "Fijian", { alpha3: Some("fij"), bibliographic: None },
Faroese => "fo", "Faroese", { alpha3: Some("fao"), bibliographic: None },
French => "fr", "French", { alpha3: Some("fra"), bibliographic: Some("fre") },
WesternFrisian => "fy", "Western Frisian", { alpha3: Some("fry"), bibliographic: None },
Irish => "ga", "Irish", { alpha3: Some("gle"), bibliographic: None },
Gaelic => "gd", "Gaelic", { alpha3: Some("gla"), bibliographic: None },
Galician => "gl", "Galician", { alpha3: Some("glg"), bibliographic: None },
Guarani => "gn", "Guarani", { alpha3: Some("grn"), bibliographic: None },
Gujarati => "gu", "Gujarati", { alpha3: Some("guj"), bibliographic: None },
Manx => "gv", "Manx", { alpha3: Some("glv"), bibliographic: None },
Hausa => "ha", "Hausa", { alpha3: Some("hau"), bibliographic: None },
Hebrew => "he", "Hebrew", { alpha3: Some("heb"), bibliographic: None },
Hindi => "hi", "Hindi", { alpha3: Some("hin"), bibliographic: None },
HiriMotu => "ho", "Hiri Motu", { alpha3: Some("hmo"), bibliographic: None },
Croatian => "hr", "Croatian", { alpha3: Some("hrv"), bibliographic: None },
Haitian => "ht", "Haitian", { alpha3: Some("hat"), bibliographic: None },
Hungarian => "hu", "Hungarian", { alpha3: Some("hun"), bibliographic: None },
Armenian => "hy", "Armenian", { alpha3: Some("hye"), bibliographic: Some("arm") },
Herero => "hz", "Herero", { alpha3: Some("her"), bibliographic: None },
Interlingua => "ia", "Interlingua", { alpha3: Some("ina"), bibliographic: None },
Indonesian => "id", "Indonesian", { alpha3: Some("ind"), bibliographic: None },
Interlingue => "ie", "Interlingue", { alpha3: Some("ile"), bibliographic: None },
Igbo => "ig", "Igbo", { alpha3: Some("ibo"), bibliographic: None },
SichuanYi => "ii", "Sichuan Yi", { alpha3: Some("iii"), bibliographic: None },
Inupiaq => "ik", "Inupiaq", { alpha3: Some("ipk"), bibliographic: None },
Ido => "io", "Ido", { alpha3: Some("ido"), bibliographic: None },
Icelandic => "is", "Icelandic", { alpha3: Some("isl"), bibliographic: Some("ice") },
Italian => "it", "Italian", { alpha3: Some("ita"), bibliographic: None },
Inuktitut => "iu", "Inuktitut", { alpha3: Some("iku"), bibliographic: None },
Japanese => "ja", "Japanese", { alpha3: Some("jpn"), bibliographic: None },
Javanese => "jv", "Javanese", { alpha3: Some("jav"), bibliographic: None },
Georgian => "ka", "Georgian", { alpha3: Some("kat"), bibliographic: Some("geo") },
Kongo => "kg", "Kongo", { alpha3: Some("kon"), bibliographic: None },
Kikuyu => "ki", "Kikuyu", { alpha3: Some("kik"), bibliographic: None },
Kuanyama => "kj", "Kuanyama", { alpha3: Some("kua"), bibliographic: None },
Kazakh => "kk", "Kazakh", { alpha3: Some("kaz"), bibliographic: None },
Kalaallisut => "kl", "Kalaallisut", { alpha3: Some("kal"), bibliographic: None },
CentralKhmer => "km", "Central Khmer", { alpha3: Some("khm"), bibliographic: None },
Kannada => "kn", "Kannada", { alpha3: Some("kan"), bibliographic: None },
Korean => "ko", "Korean", { alpha3: Some("kor"), bibliographic: None },
Kanuri => "kr", "Kanuri", { alpha3: Some("kau"), bibliographic: None },
Kashmiri => "ks", "Kashmiri", { alpha3: Some("kas"), bibliographic: None },
Kurdish => "ku", "Kurdish", { alpha3: Some("kur"), bibliographic: None },
Komi => "kv", "Komi", { alpha3: Some("kom"), bibliographic: None },
Cornish => "kw", "Cornish", { alpha3: Some("cor"), bibliographic: None },
Kirghiz => "ky", "Kirghiz", { alpha3: Some("kir"), bibliographic: None },
Latin => "la", "Latin", { alpha3: Some("lat"), bibliographic: None },
Luxembourgish => "lb", "Luxembourgish", { alpha3: Some("ltz"), bibliographic: None },
Ganda => "lg", "Ganda", { alpha3: Some("lug"), bibliographic: None },
Limburgan => "li", "Limburgan", { alpha3: Some("lim"), bibliographic: None },
Lingala => "ln", "Lingala", { alpha3: Some("lin"), bibliographic: None },
Lao => "lo", "Lao", { alpha3: Some("lao"), bibliographic: None },
Lithuanian => "lt", "Lithuanian", { alpha3: Some("lit"), bibliographic: None },
LubaKatanga => "lu", "Luba-Katanga", { alpha3: Some("lub"), bibliographic: None },
Latvian => "lv", "Latvian", { alpha3: Some("lav"), bibliographic: None },
Malagasy => "mg", "Malagasy", { alpha3: Some("mlg"), bibliographic: None },
Marshallese => "mh", "Marshallese", { alpha3: Some("mah"), bibliographic: None },
Maori => "mi", "Maori", { alpha3: Some("mri"), bibliographic: Some("mao") },
Macedonian => "mk", "Macedonian", { alpha3: Some("mkd"), bibliographic: Some("mac") },
Malayalam => "ml", "Malayalam", { alpha3: Some("mal"), bibliographic: None },
Mongolian => "mn", "Mongolian", { alpha3: Some("mon"), bibliographic: None },
Marathi => "mr", "Marathi", { alpha3: Some("mar"), bibliographic: None },
Malay => "ms", "Malay", { alpha3: Some("msa"), bibliographic: Some("may") },
Maltese => "mt", "Maltese", { alpha3: Some("mlt"), bibliographic: None },
Burmese => "my", "Burmese", { alpha3: Some("mya"), bibliographic: Some("bur") },
Nauru => "na", "Nauru", { alpha3: Some("nau"), bibliographic: None },
NorwegianBokmal => "nb", "Norwegian Bokmal", { alpha3: Some("nob"), bibliographic: None },
NorthNdebele => "nd", "North Ndebele", { alpha3: Some("nde"), bibliographic: None },
Nepali => "ne", "Nepali", { alpha3: Some("nep"), bibliographic: None },
Ndonga => "ng", "Ndonga", { alpha3: Some("ndo"), bibliographic: None },
Dutch => "nl", "Dutch", { alpha3: Some("nld"), bibliographic: Some("dut") },
NorwegianNynorsk => "nn", "Norwegian Nynorsk", { alpha3: Some("nno"), bibliographic: None },
Norwegian => "no", "Norwegian", { alpha3: Some("nor"), bibliographic: None },
SouthNdebele => "nr", "South Ndebele", { alpha3: Some("nbl"), bibliographic: None },
Navajo => "nv", "Navajo", { alpha3: Some("nav"), bibliographic: None },
Chichewa => "ny", "Chichewa", { alpha3: Some("nya"), bibliographic: None },
Occitan => "oc", "Occitan", { alpha3: Some("oci"), bibliographic: None },
Ojibwa => "oj", "Ojibwa", { alpha3: Some("oji"), bibliographic: None },
Oromo => "om", "Oromo", { alpha3: Some("orm"), bibliographic: None },
Oriya => "or", "Oriya", { alpha3: Some("ori"), bibliographic: None },
Ossetian => "os", "Ossetian", { alpha3: Some("oss"), bibliographic: None },
Panjabi => "pa", "Panjabi", { alpha3: Some("pan"), bibliographic: None },
Pali => "pi", "Pali", { alpha3: Some("pli"), bibliographic: None },
Polish => "pl", "Polish", { alpha3: Some("pol"), bibliographic: None },
Pushto => "ps", "Pushto", { alpha3: Some("pus"), bibliographic: None },
Portuguese => "pt", "Portuguese", { alpha3: Some("por"), bibliographic: None },
Quechua => "qu", "Quechua", { alpha3: Some("que"), bibliographic: None },
Romansh => "rm", "Romansh", { alpha3: Some("roh"), bibliographic: None },
Rundi => "rn", "Rundi", { alpha3: Some("run"), bibliographic: None },
Romanian => "ro", "Romanian", { alpha3: Some("ron"), bibliographic: Some("rum") },
Russian => "ru", "Russian", { alpha3: Some("rus"), bibliographic: None },
Kinyarwanda => "rw", "Kinyarwanda", { alpha3: Some("kin"), bibliographic: None },
Sanskrit => "sa", "Sanskrit", { alpha3: Some("san"), bibliographic: None },
Sardinian => "sc", "Sardinian", { alpha3: Some("srd"), bibliographic: None },
Sindhi => "sd", "Sindhi", { alpha3: Some("snd"), bibliographic: None },
NorthernSami => "se", "Northern Sami", { alpha3: Some("sme"), bibliographic: None },
Sango => "sg", "Sango", { alpha3: Some("sag"), bibliographic: None },
Sinhala => "si", "Sinhala", { alpha3: Some("sin"), bibliographic: None },
Slovak => "sk", "Slovak", { alpha3: Some("slk"), bibliographic: Some("slo") },
Slovenian => "sl", "Slovenian", { alpha3: Some("slv"), bibliographic: None },
Samoan => "sm", "Samoan", { alpha3: Some("smo"), bibliographic: None },
Shona => "sn", "Shona", { alpha3: Some("sna"), bibliographic: None },
Somali => "so", "Somali", { alpha3: Some("som"), bibliographic: None },
Albanian => "sq", "Albanian", { alpha3: Some("sqi"), bibliographic: Some("alb") },
Serbian => "sr", "Serbian", { alpha3: Some("srp"), bibliographic: None },
Swati => "ss", "Swati", { alpha3: Some("ssw"), bibliographic: None },
Sotho => "st", "Sotho", { alpha3: Some("sot"), bibliographic: None },
Sundanese => "su", "Sundanese", { alpha3: Some("sun"), bibliographic: None },
Swedish => "sv", "Swedish", { alpha3: Some("swe"), bibliographic: None },
Swahili => "sw", "Swahili", { alpha3: Some("swa"), bibliographic: None },
Tamil => "ta", "Tamil", { alpha3: Some("tam"), bibliographic: None },
Telugu => "te", "Telugu", { alpha3: Some("tel"), bibliographic: None },
Tajik => "tg", "Tajik", { alpha3: Some("tgk"), bibliographic: None },
Thai => "th", "Thai", { alpha3: Some("tha"), bibliographic: None },
Tigrinya => "ti", "Tigrinya", { alpha3: Some("tir"), bibliographic: None },
Turkmen => "tk", "Turkmen", { alpha3: Some("tuk"), bibliographic: None },
Tagalog => "tl", "Tagalog", { alpha3: Some("tgl"), bibliographic: None },
Tswana => "tn", "Tswana", { alpha3: Some("tsn"), bibliographic: None },
Tonga => "to", "Tonga", { alpha3: Some("ton"), bibliographic: None },
Turkish => "tr", "Turkish", { alpha3: Some("tur"), bibliographic: None },
Tsonga => "ts", "Tsonga", { alpha3: Some("tso"), bibliographic: None },
Tatar => "tt", "Tatar", { alpha3: Some("tat"), bibliographic: None },
Twi => "tw", "Twi", { alpha3: Some("twi"), bibliographic: None },
Tahitian => "ty", "Tahitian", { alpha3: Some("tah"), bibliographic: None },
Uighur => "ug", "Uighur", { alpha3: Some("uig"), bibliographic: None },
Ukrainian => "uk", "Ukrainian", { alpha3: Some("ukr"), bibliographic: None },
Urdu => "ur", "Urdu", { alpha3: Some("urd"), bibliographic: None },
Uzbek => "uz", "Uzbek", { alpha3: Some("uzb"), bibliographic: None },
Venda => "ve", "Venda", { alpha3: Some("ven"), bibliographic: None },
Vietnamese => "vi", "Vietnamese", { alpha3: Some("vie"), bibliographic: None },
Volapuk => "vo", "Volapuk", { alpha3: Some("vol"), bibliographic: None },
Walloon => "wa", "Walloon", { alpha3: Some("wln"), bibliographic: None },
Wolof => "wo", "Wolof", { alpha3: Some("wol"), bibliographic: None },
Xhosa => "xh", "Xhosa", { alpha3: Some("xho"), bibliographic: None },
Yiddish => "yi", "Yiddish", { alpha3: Some("yid"), bibliographic: None },
Yoruba => "yo", "Yoruba", { alpha3: Some("yor"), bibliographic: None },
Zhuang => "za", "Zhuang", { alpha3: Some("zha"), bibliographic: None },
Chinese => "zh", "Chinese", { alpha3: Some("zho"), bibliographic: Some("chi") },
Zulu => "zu", "Zulu", { alpha3: Some("zul"), bibliographic: None },
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn language_codes() {
assert_eq!(Language::from_code("pt"), Language::Portuguese);
assert_eq!(Language::Portuguese.name(), Some("Portuguese"));
assert_eq!(Language::from_code("xx"), Language::Unknown("xx".into()));
}
#[test]
fn alpha3_and_bibliographic() {
assert_eq!(Language::German.alpha3(), Some("deu"));
assert_eq!(Language::German.bibliographic(), Some("ger"));
assert_eq!(Language::English.alpha3(), Some("eng"));
assert_eq!(Language::English.bibliographic(), None);
assert_eq!(Language::from_code("xx").alpha3(), None);
assert_eq!(LanguageRef::German.bibliographic(), Some("ger"));
}
#[test]
fn reverse_lookup() {
assert_eq!(Language::from_alpha3("deu"), Some(Language::German));
assert_eq!(Language::from_alpha3("ger"), Some(Language::German));
assert_eq!(Language::from_alpha3("eng"), Some(Language::English));
assert_eq!(Language::from_alpha3("zzz"), None);
}
#[test]
fn all_codes_roundtrip() {
assert_eq!(Language::ALL.len(), 183);
for l in Language::ALL {
assert!(l.is_known());
assert_eq!(Language::from_code(l.code()), l.clone());
assert!(l.name().is_some());
assert!(l.alpha3().is_some(), "{l:?} missing alpha-3");
}
}
}