use std::{
cmp::Ordering,
fmt,
hash::{Hash, Hasher},
io::{self, Error, ErrorKind},
};
pub const LANG_CODES: &[Lang] = &[
Lang { name: "Abkhazian", native_name: "аҧсуа бызшәа, аҧсшәа", v1: "ab", v2t: "abk", v2b: "abk" },
Lang { name: "Afar", native_name: "Afaraf", v1: "aa", v2t: "aar", v2b: "aar" },
Lang { name: "Afrikaans", native_name: "Afrikaans", v1: "af", v2t: "afr", v2b: "afr" },
Lang { name: "Akan", native_name: "Akan", v1: "ak", v2t: "aka", v2b: "aka" },
Lang { name: "Albanian", native_name: "Shqip", v1: "sq", v2t: "sqi", v2b: "alb" },
Lang { name: "Amharic", native_name: "አማርኛ", v1: "am", v2t: "amh", v2b: "amh" },
Lang { name: "Arabic", native_name: "العربية", v1: "ar", v2t: "ara", v2b: "ara" },
Lang { name: "Aragonese", native_name: "aragonés", v1: "an", v2t: "arg", v2b: "arg" },
Lang { name: "Armenian", native_name: "Հայերեն", v1: "hy", v2t: "hye", v2b: "arm" },
Lang { name: "Assamese", native_name: "অসমীয়া", v1: "as", v2t: "asm", v2b: "asm" },
Lang { name: "Avaric", native_name: "авар мацӀ, магӀарул мацӀ", v1: "av", v2t: "ava", v2b: "ava" },
Lang { name: "Avestan", native_name: "avesta", v1: "ae", v2t: "ave", v2b: "ave" },
Lang { name: "Aymara", native_name: "aymar aru", v1: "ay", v2t: "aym", v2b: "aym" },
Lang { name: "Azerbaijani", native_name: "azərbaycan dili", v1: "az", v2t: "aze", v2b: "aze" },
Lang { name: "Bambara", native_name: "bamanankan", v1: "bm", v2t: "bam", v2b: "bam" },
Lang { name: "Bashkir", native_name: "башҡорт теле", v1: "ba", v2t: "bak", v2b: "bak" },
Lang { name: "Basque", native_name: "euskara, euskera", v1: "eu", v2t: "eus", v2b: "baq" },
Lang { name: "Belarusian", native_name: "беларуская мова", v1: "be", v2t: "bel", v2b: "bel" },
Lang { name: "Bengali", native_name: "বাংলা", v1: "bn", v2t: "ben", v2b: "ben" },
Lang { name: "Bihari languages", native_name: "भोजपुरी", v1: "bh", v2t: "bih", v2b: "bih" },
Lang { name: "Bislama", native_name: "Bislama", v1: "bi", v2t: "bis", v2b: "bis" },
Lang { name: "Bosnian", native_name: "bosanski jezik", v1: "bs", v2t: "bos", v2b: "bos" },
Lang { name: "Breton", native_name: "brezhoneg", v1: "br", v2t: "bre", v2b: "bre" },
Lang { name: "Bulgarian", native_name: "български език", v1: "bg", v2t: "bul", v2b: "bul" },
Lang { name: "Burmese", native_name: "ဗမာစာ", v1: "my", v2t: "mya", v2b: "bur" },
Lang { name: "Catalan , Valencian", native_name: "català, valencià", v1: "ca", v2t: "cat", v2b: "cat" },
Lang { name: "Chamorro", native_name: "Chamoru", v1: "ch", v2t: "cha", v2b: "cha" },
Lang { name: "Chechen", native_name: "нохчийн мотт", v1: "ce", v2t: "che", v2b: "che" },
Lang { name: "Chichewa , Chewa, Nyanja", native_name: "chiCheŵa, chinyanja", v1: "ny", v2t: "nya", v2b: "nya" },
Lang { name: "Chinese", native_name: "中文 (Zhōngwén), 汉语 , 漢語", v1: "zh", v2t: "zho", v2b: "chi" },
Lang { name: "Chuvash", native_name: "чӑваш чӗлхи", v1: "cv", v2t: "chv", v2b: "chv" },
Lang { name: "Cornish", native_name: "Kernewek", v1: "kw", v2t: "cor", v2b: "cor" },
Lang { name: "Corsican", native_name: "corsu, lingua corsa", v1: "co", v2t: "cos", v2b: "cos" },
Lang { name: "Cree", native_name: "ᓀᐦᐃᔭᐍᐏᐣ", v1: "cr", v2t: "cre", v2b: "cre" },
Lang { name: "Croatian", native_name: "hrvatski jezik", v1: "hr", v2t: "hrv", v2b: "hrv" },
Lang { name: "Czech", native_name: "čeština, český jazyk", v1: "cs", v2t: "ces", v2b: "cze" },
Lang { name: "Danish", native_name: "dansk", v1: "da", v2t: "dan", v2b: "dan" },
Lang { name: "Divehi , Dhivehi, Maldivian", native_name: "ދިވެހި", v1: "dv", v2t: "div", v2b: "div" },
Lang { name: "Dutch , Flemish", native_name: "Nederlands, Vlaams", v1: "nl", v2t: "nld", v2b: "dut" },
Lang { name: "Dzongkha", native_name: "རྫོང་ཁ", v1: "dz", v2t: "dzo", v2b: "dzo" },
Lang { name: "English", native_name: "English", v1: "en", v2t: "eng", v2b: "eng" },
Lang { name: "Esperanto", native_name: "Esperanto", v1: "eo", v2t: "epo", v2b: "epo" },
Lang { name: "Estonian", native_name: "eesti, eesti keel", v1: "et", v2t: "est", v2b: "est" },
Lang { name: "Ewe", native_name: "Eʋegbe", v1: "ee", v2t: "ewe", v2b: "ewe" },
Lang { name: "Faroese", native_name: "føroyskt", v1: "fo", v2t: "fao", v2b: "fao" },
Lang { name: "Fijian", native_name: "vosa Vakaviti", v1: "fj", v2t: "fij", v2b: "fij" },
Lang { name: "Finnish", native_name: "suomi, suomen kieli", v1: "fi", v2t: "fin", v2b: "fin" },
Lang { name: "French", native_name: "français, langue française", v1: "fr", v2t: "fra", v2b: "fre" },
Lang { name: "Fulah", native_name: "Fulfulde, Pulaar, Pular", v1: "ff", v2t: "ful", v2b: "ful" },
Lang { name: "Galician", native_name: "Galego", v1: "gl", v2t: "glg", v2b: "glg" },
Lang { name: "Georgian", native_name: "ქართული", v1: "ka", v2t: "kat", v2b: "geo" },
Lang { name: "German", native_name: "Deutsch", v1: "de", v2t: "deu", v2b: "ger" },
Lang { name: "Greek , Modern (1453-)", native_name: "ελληνικά", v1: "el", v2t: "ell", v2b: "gre" },
Lang { name: "Guarani", native_name: "Avañe'ẽ", v1: "gn", v2t: "grn", v2b: "grn" },
Lang { name: "Gujarati", native_name: "ગુજરાતી", v1: "gu", v2t: "guj", v2b: "guj" },
Lang { name: "Haitian , Haitian Creole", native_name: "Kreyòl ayisyen", v1: "ht", v2t: "hat", v2b: "hat" },
Lang { name: "Hausa", native_name: "(Hausa) هَوُسَ", v1: "ha", v2t: "hau", v2b: "hau" },
Lang { name: "Hebrew", native_name: "עברית", v1: "he", v2t: "heb", v2b: "heb" },
Lang { name: "Herero", native_name: "Otjiherero", v1: "hz", v2t: "her", v2b: "her" },
Lang { name: "Hindi", native_name: "हिन्दी, हिंदी", v1: "hi", v2t: "hin", v2b: "hin" },
Lang { name: "Hiri Motu", native_name: "Hiri Motu", v1: "ho", v2t: "hmo", v2b: "hmo" },
Lang { name: "Hungarian", native_name: "magyar", v1: "hu", v2t: "hun", v2b: "hun" },
Lang { name: "Interlingua (International Auxiliary Language Association)", native_name: "Interlingua", v1: "ia", v2t: "ina", v2b: "ina" },
Lang { name: "Indonesian", native_name: "Bahasa Indonesia", v1: "id", v2t: "ind", v2b: "ind" },
Lang { name: "Interlingue , Occidental", native_name: "(originally:) Occidental , (after WWII:) Interlingue", v1: "ie", v2t: "ile", v2b: "ile" },
Lang { name: "Irish", native_name: "Gaeilge", v1: "ga", v2t: "gle", v2b: "gle" },
Lang { name: "Igbo", native_name: "Asụsụ Igbo", v1: "ig", v2t: "ibo", v2b: "ibo" },
Lang { name: "Inupiaq", native_name: "Iñupiaq, Iñupiatun", v1: "ik", v2t: "ipk", v2b: "ipk" },
Lang { name: "Ido", native_name: "Ido", v1: "io", v2t: "ido", v2b: "ido" },
Lang { name: "Icelandic", native_name: "Íslenska", v1: "is", v2t: "isl", v2b: "ice" },
Lang { name: "Italian", native_name: "Italiano", v1: "it", v2t: "ita", v2b: "ita" },
Lang { name: "Inuktitut", native_name: "ᐃᓄᒃᑎᑐᑦ", v1: "iu", v2t: "iku", v2b: "iku" },
Lang { name: "Japanese", native_name: "日本語 ( にほんご )", v1: "ja", v2t: "jpn", v2b: "jpn" },
Lang { name: "Javanese", native_name: "ꦧꦱꦗꦮ, Basa Jawa", v1: "jv", v2t: "jav", v2b: "jav" },
Lang { name: "Kalaallisut , Greenlandic", native_name: "kalaallisut, kalaallit oqaasii", v1: "kl", v2t: "kal", v2b: "kal" },
Lang { name: "Kannada", native_name: "ಕನ್ನಡ", v1: "kn", v2t: "kan", v2b: "kan" },
Lang { name: "Kanuri", native_name: "Kanuri", v1: "kr", v2t: "kau", v2b: "kau" },
Lang { name: "Kashmiri", native_name: "कश्मीरी , كشميري ‎", v1: "ks", v2t: "kas", v2b: "kas" },
Lang { name: "Kazakh", native_name: "қазақ тілі", v1: "kk", v2t: "kaz", v2b: "kaz" },
Lang { name: "Central Khmer", native_name: "ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ", v1: "km", v2t: "khm", v2b: "khm" },
Lang { name: "Kikuyu , Gikuyu", native_name: "Gĩkũyũ", v1: "ki", v2t: "kik", v2b: "kik" },
Lang { name: "Kinyarwanda", native_name: "Ikinyarwanda", v1: "rw", v2t: "kin", v2b: "kin" },
Lang { name: "Kirghiz , Kyrgyz", native_name: "Кыргызча, Кыргыз тили", v1: "ky", v2t: "kir", v2b: "kir" },
Lang { name: "Komi", native_name: "коми кыв", v1: "kv", v2t: "kom", v2b: "kom" },
Lang { name: "Kongo", native_name: "Kikongo", v1: "kg", v2t: "kon", v2b: "kon" },
Lang { name: "Korean", native_name: "한국어", v1: "ko", v2t: "kor", v2b: "kor" },
Lang { name: "Kurdish", native_name: "Kurdî , کوردی ‎", v1: "ku", v2t: "kur", v2b: "kur" },
Lang { name: "Kuanyama , Kwanyama", native_name: "Kuanyama", v1: "kj", v2t: "kua", v2b: "kua" },
Lang { name: "Latin", native_name: "latine, lingua latina", v1: "la", v2t: "lat", v2b: "lat" },
Lang { name: "Luxembourgish , Letzeburgesch", native_name: "Lëtzebuergesch", v1: "lb", v2t: "ltz", v2b: "ltz" },
Lang { name: "Ganda", native_name: "Luganda", v1: "lg", v2t: "lug", v2b: "lug" },
Lang { name: "Limburgan , Limburger, Limburgish", native_name: "Limburgs", v1: "li", v2t: "lim", v2b: "lim" },
Lang { name: "Lingala", native_name: "Lingála", v1: "ln", v2t: "lin", v2b: "lin" },
Lang { name: "Lao", native_name: "ພາສາລາວ", v1: "lo", v2t: "lao", v2b: "lao" },
Lang { name: "Lithuanian", native_name: "lietuvių kalba", v1: "lt", v2t: "lit", v2b: "lit" },
Lang { name: "Luba-Katanga", native_name: "Kiluba", v1: "lu", v2t: "lub", v2b: "lub" },
Lang { name: "Latvian", native_name: "latviešu valoda", v1: "lv", v2t: "lav", v2b: "lav" },
Lang { name: "Manx", native_name: "Gaelg, Gailck", v1: "gv", v2t: "glv", v2b: "glv" },
Lang { name: "Macedonian", native_name: "македонски јазик", v1: "mk", v2t: "mkd", v2b: "mac" },
Lang { name: "Malagasy", native_name: "fiteny malagasy", v1: "mg", v2t: "mlg", v2b: "mlg" },
Lang { name: "Malay", native_name: "Bahasa Melayu , بهاس ملايو ‎", v1: "ms", v2t: "msa", v2b: "may" },
Lang { name: "Malayalam", native_name: "മലയാളം", v1: "ml", v2t: "mal", v2b: "mal" },
Lang { name: "Maltese", native_name: "Malti", v1: "mt", v2t: "mlt", v2b: "mlt" },
Lang { name: "Maori", native_name: "te reo Māori", v1: "mi", v2t: "mri", v2b: "mao" },
Lang { name: "Marathi", native_name: "मराठी", v1: "mr", v2t: "mar", v2b: "mar" },
Lang { name: "Marshallese", native_name: "Kajin M̧ajeļ", v1: "mh", v2t: "mah", v2b: "mah" },
Lang { name: "Mongolian", native_name: "Монгол хэл", v1: "mn", v2t: "mon", v2b: "mon" },
Lang { name: "Nauru", native_name: "Dorerin Naoero", v1: "na", v2t: "nau", v2b: "nau" },
Lang { name: "Navajo , Navaho", native_name: "Diné bizaad", v1: "nv", v2t: "nav", v2b: "nav" },
Lang { name: "North Ndebele", native_name: "isiNdebele", v1: "nd", v2t: "nde", v2b: "nde" },
Lang { name: "Nepali", native_name: "नेपाली", v1: "ne", v2t: "nep", v2b: "nep" },
Lang { name: "Ndonga", native_name: "Owambo", v1: "ng", v2t: "ndo", v2b: "ndo" },
Lang { name: "Norwegian Bokmål", native_name: "Norsk Bokmål", v1: "nb", v2t: "nob", v2b: "nob" },
Lang { name: "Norwegian Nynorsk", native_name: "Norsk Nynorsk", v1: "nn", v2t: "nno", v2b: "nno" },
Lang { name: "Norwegian", native_name: "Norsk", v1: "no", v2t: "nor", v2b: "nor" },
Lang { name: "Sichuan Yi , Nuosu", native_name: "ꆈꌠ꒿ Nuosuhxop", v1: "ii", v2t: "iii", v2b: "iii" },
Lang { name: "South Ndebele", native_name: "isiNdebele", v1: "nr", v2t: "nbl", v2b: "nbl" },
Lang { name: "Occitan", native_name: "occitan, lenga d'òc", v1: "oc", v2t: "oci", v2b: "oci" },
Lang { name: "Ojibwa", native_name: "ᐊᓂᔑᓈᐯᒧᐎᓐ", v1: "oj", v2t: "oji", v2b: "oji" },
Lang { name: "Church Slavic , Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic", native_name: "ѩзыкъ словѣньскъ", v1: "cu", v2t: "chu", v2b: "chu" },
Lang { name: "Oromo", native_name: "Afaan Oromoo", v1: "om", v2t: "orm", v2b: "orm" },
Lang { name: "Oriya", native_name: "ଓଡ଼ିଆ", v1: "or", v2t: "ori", v2b: "ori" },
Lang { name: "Ossetian , Ossetic", native_name: "ирон æвзаг", v1: "os", v2t: "oss", v2b: "oss" },
Lang { name: "Panjabi , Punjabi", native_name: "ਪੰਜਾਬੀ", v1: "pa", v2t: "pan", v2b: "pan" },
Lang { name: "Pali", native_name: "पालि, पाळि", v1: "pi", v2t: "pli", v2b: "pli" },
Lang { name: "Persian", native_name: "فارسی", v1: "fa", v2t: "fas", v2b: "per" },
Lang { name: "Polish", native_name: "język polski, polszczyzna", v1: "pl", v2t: "pol", v2b: "pol" },
Lang { name: "Pashto , Pushto", native_name: "پښتو", v1: "ps", v2t: "pus", v2b: "pus" },
Lang { name: "Portuguese", native_name: "Português", v1: "pt", v2t: "por", v2b: "por" },
Lang { name: "Quechua", native_name: "Runa Simi, Kichwa", v1: "qu", v2t: "que", v2b: "que" },
Lang { name: "Romansh", native_name: "Rumantsch Grischun", v1: "rm", v2t: "roh", v2b: "roh" },
Lang { name: "Rundi", native_name: "Ikirundi", v1: "rn", v2t: "run", v2b: "run" },
Lang { name: "Romanian , Moldavian, Moldovan", native_name: "Română", v1: "ro", v2t: "ron", v2b: "rum" },
Lang { name: "Russian", native_name: "русский", v1: "ru", v2t: "rus", v2b: "rus" },
Lang { name: "Sanskrit", native_name: "संस्कृतम्", v1: "sa", v2t: "san", v2b: "san" },
Lang { name: "Sardinian", native_name: "sardu", v1: "sc", v2t: "srd", v2b: "srd" },
Lang { name: "Sindhi", native_name: "सिन्धी , سنڌي، سندھی ‎", v1: "sd", v2t: "snd", v2b: "snd" },
Lang { name: "Northern Sami", native_name: "Davvisámegiella", v1: "se", v2t: "sme", v2b: "sme" },
Lang { name: "Samoan", native_name: "gagana fa'a Samoa", v1: "sm", v2t: "smo", v2b: "smo" },
Lang { name: "Sango", native_name: "yângâ tî sängö", v1: "sg", v2t: "sag", v2b: "sag" },
Lang { name: "Serbian", native_name: "српски језик", v1: "sr", v2t: "srp", v2b: "srp" },
Lang { name: "Gaelic , Scottish Gaelic", native_name: "Gàidhlig", v1: "gd", v2t: "gla", v2b: "gla" },
Lang { name: "Shona", native_name: "chiShona", v1: "sn", v2t: "sna", v2b: "sna" },
Lang { name: "Sinhala , Sinhalese", native_name: "සිංහල", v1: "si", v2t: "sin", v2b: "sin" },
Lang { name: "Slovak", native_name: "Slovenčina, Slovenský Jazyk", v1: "sk", v2t: "slk", v2b: "slo" },
Lang { name: "Slovenian", native_name: "Slovenski Jezik, Slovenščina", v1: "sl", v2t: "slv", v2b: "slv" },
Lang { name: "Somali", native_name: "Soomaaliga, af Soomaali", v1: "so", v2t: "som", v2b: "som" },
Lang { name: "Southern Sotho", native_name: "Sesotho", v1: "st", v2t: "sot", v2b: "sot" },
Lang { name: "Spanish , Castilian", native_name: "Español", v1: "es", v2t: "spa", v2b: "spa" },
Lang { name: "Sundanese", native_name: "Basa Sunda", v1: "su", v2t: "sun", v2b: "sun" },
Lang { name: "Swahili", native_name: "Kiswahili", v1: "sw", v2t: "swa", v2b: "swa" },
Lang { name: "Swati", native_name: "SiSwati", v1: "ss", v2t: "ssw", v2b: "ssw" },
Lang { name: "Swedish", native_name: "Svenska", v1: "sv", v2t: "swe", v2b: "swe" },
Lang { name: "Tamil", native_name: "தமிழ்", v1: "ta", v2t: "tam", v2b: "tam" },
Lang { name: "Telugu", native_name: "తెలుగు", v1: "te", v2t: "tel", v2b: "tel" },
Lang { name: "Tajik", native_name: "тоҷикӣ , toçikī , تاجیکی ‎", v1: "tg", v2t: "tgk", v2b: "tgk" },
Lang { name: "Thai", native_name: "ไทย", v1: "th", v2t: "tha", v2b: "tha" },
Lang { name: "Tigrinya", native_name: "ትግርኛ", v1: "ti", v2t: "tir", v2b: "tir" },
Lang { name: "Tibetan", native_name: "བོད་ཡིག", v1: "bo", v2t: "bod", v2b: "tib" },
Lang { name: "Turkmen", native_name: "Türkmen, Түркмен", v1: "tk", v2t: "tuk", v2b: "tuk" },
Lang { name: "Tagalog", native_name: "Wikang Tagalog", v1: "tl", v2t: "tgl", v2b: "tgl" },
Lang { name: "Tswana", native_name: "Setswana", v1: "tn", v2t: "tsn", v2b: "tsn" },
Lang { name: "Tonga (Tonga Islands)", native_name: "Faka Tonga", v1: "to", v2t: "ton", v2b: "ton" },
Lang { name: "Turkish", native_name: "Türkçe", v1: "tr", v2t: "tur", v2b: "tur" },
Lang { name: "Tsonga", native_name: "Xitsonga", v1: "ts", v2t: "tso", v2b: "tso" },
Lang { name: "Tatar", native_name: "татар теле , tatar tele", v1: "tt", v2t: "tat", v2b: "tat" },
Lang { name: "Twi", native_name: "Twi", v1: "tw", v2t: "twi", v2b: "twi" },
Lang { name: "Tahitian", native_name: "Reo Tahiti", v1: "ty", v2t: "tah", v2b: "tah" },
Lang { name: "Uighur , Uyghur", native_name: "ئۇيغۇرچە ‎, Uyghurche", v1: "ug", v2t: "uig", v2b: "uig" },
Lang { name: "Ukrainian", native_name: "Українська", v1: "uk", v2t: "ukr", v2b: "ukr" },
Lang { name: "Urdu", native_name: "اردو", v1: "ur", v2t: "urd", v2b: "urd" },
Lang { name: "Uzbek", native_name: "Oʻzbek , Ўзбек , أۇزبېك ‎", v1: "uz", v2t: "uzb", v2b: "uzb" },
Lang { name: "Venda", native_name: "Tshivenḓa", v1: "ve", v2t: "ven", v2b: "ven" },
Lang { name: "Vietnamese", native_name: "Tiếng Việt", v1: "vi", v2t: "vie", v2b: "vie" },
Lang { name: "Volapük", native_name: "Volapük", v1: "vo", v2t: "vol", v2b: "vol" },
Lang { name: "Walloon", native_name: "Walon", v1: "wa", v2t: "wln", v2b: "wln" },
Lang { name: "Welsh", native_name: "Cymraeg", v1: "cy", v2t: "cym", v2b: "wel" },
Lang { name: "Wolof", native_name: "Wollof", v1: "wo", v2t: "wol", v2b: "wol" },
Lang { name: "Western Frisian", native_name: "Frysk", v1: "fy", v2t: "fry", v2b: "fry" },
Lang { name: "Xhosa", native_name: "isiXhosa", v1: "xh", v2t: "xho", v2b: "xho" },
Lang { name: "Yiddish", native_name: "ייִדיש", v1: "yi", v2t: "yid", v2b: "yid" },
Lang { name: "Yoruba", native_name: "Yorùbá", v1: "yo", v2t: "yor", v2b: "yor" },
Lang { name: "Zhuang , Chuang", native_name: "Saɯ cueŋƅ, Saw cuengh", v1: "za", v2t: "zha", v2b: "zha" },
Lang { name: "Zulu", native_name: "isiZulu", v1: "zu", v2t: "zul", v2b: "zul" },
];
#[derive(Debug, Eq)]
pub struct Lang<'a> {
name: &'a str,
native_name: &'a str,
v1: &'a str,
v2t: &'a str,
v2b: &'a str,
}
impl<'a> Lang<'a> {
pub fn make(name: &'a str, native_name: &'a str, v1: &'a str, v2t: &'a str, v2b: &'a str) -> io::Result<Self> {
for (i, c) in [v1, v2t, v2b].iter().enumerate() {
let bytes = c.as_bytes();
let expected_byte_len = match i {
0 => 2,
_ => 3,
};
if bytes.len() != expected_byte_len || bytes.into_iter().any(|b| b < &b'a' || b > &b'z') {
return Err(Error::new(ErrorKind::InvalidInput, format!("Invalid ISO 639 language code: {:?}", c)));
}
}
Ok(Self { name, native_name, v1, v2t, v2b })
}
pub const fn name(&self) -> &str {
self.name
}
pub const fn native_name(&self) -> &str {
self.native_name
}
pub const fn v1(&self) -> &str {
self.v1
}
pub const fn v2t(&self) -> &str {
self.v2t
}
pub const fn v2b(&self) -> &str {
self.v2b
}
pub fn is_english(&self) -> bool {
const CODE: &str = "eng";
self.v1 == &CODE[..2] && self.v2t == CODE && self.v2b == CODE
}
}
impl PartialEq for Lang<'_> {
fn eq(&self, other: &Self) -> bool {
self.v1.eq(other.v1) && self.v2t.eq(other.v2t) && self.v2b.eq(other.v2b)
}
}
impl Ord for Lang<'_> {
fn cmp(&self, other: &Self) -> Ordering {
self.name.to_lowercase().cmp(&other.name.to_lowercase())
}
}
impl PartialOrd for Lang<'_> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Hash for Lang<'_> {
fn hash<H>(&self, h: &mut H) where H: Hasher {
self.v1.hash(h);
self.v2t.hash(h);
self.v2b.hash(h);
}
}
impl fmt::Display for Lang<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "{} ({})", self.name, self.native_name)
}
}
#[test]
fn test_lang() {
Lang::make("", "", "00", "aaa", "bbb").unwrap_err();
Lang::make("", "", "aa", "000", "bbb").unwrap_err();
Lang::make("", "", "aa", "aaa", "000").unwrap_err();
Lang::make("", "", "aaa", "bbb", "ccc").unwrap_err();
Lang::make("", "", "aa", "bb", "ccc").unwrap_err();
Lang::make("", "", "aa", "bbb", "cc").unwrap_err();
let lang = Lang::make("", "", "aa", "bbb", "ccc").unwrap();
assert_eq!(lang.v1, lang.v1());
assert_ne!(lang.v1, lang.v2t());
assert_ne!(lang.v1, lang.v2b());
assert_eq!(lang.v2t, lang.v2t());
assert_ne!(lang.v2t, lang.v1());
assert_ne!(lang.v2t, lang.v2b());
assert_eq!(lang.v2b, lang.v2b());
assert_ne!(lang.v2b, lang.v1());
assert_ne!(lang.v2b, lang.v2t());
for l in LANG_CODES {
assert_eq!(l, &Lang::make(l.name, l.native_name, l.v1, l.v2t, l.v2b).unwrap());
}
assert_eq!(LANG_CODES.iter().filter(|l| l.is_english()).count(), 1);
}