rocket_lang/
lib.rs

1#![doc=include_str!("../README.md")]
2
3#[macro_use]
4extern crate thiserror;
5
6
7pub use config::Config;
8pub use error::Error;
9use rocket::{
10    request::{FromRequest, Outcome},
11    Request,
12};
13use std::{fmt::Display, hash::Hash, str::FromStr};
14mod accept_language;
15mod config;
16mod error;
17mod url;
18
19macro_rules! language_impls {
20    ($($upper:ident | $lower:ident | $english_name:literal | $native_name:literal )*) => {
21        ///  code | enum variant | English name | Native name
22        ///  ----|----|---|----
23        $(#[doc = stringify!($lower | $upper | $english_name | $native_name)])*
24        #[non_exhaustive]
25        #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
26        pub enum LangCode {$(
27            #[doc=stringify!($english_name)]
28            $upper
29        ),+}
30        pub use LangCode::*;
31
32        impl LangCode {
33            /// A collection with all the values to
34            /// iterate through them easily.
35            pub const ALL_CODES: &'static [Self] = &[$(Self::$upper,)*];
36            
37            /// transforms the enum value to its lower case string representation.
38            /// ```rust
39            /// let spanish = Es.as_str();
40            /// assert!(spanish == "es");
41            /// ```
42            ///
43            pub fn as_str(self) -> &'static str {
44                match self {
45                    $(Self::$upper => stringify!($lower)),*
46                }
47            }
48            /// Returns the name of the language in
49            /// english
50            /// ```rust
51            /// let fr = Fr.english_name();
52            /// assert!(fr == "French");
53            /// ```
54            pub fn english_name(self) -> &'static str {
55                match self {
56                    $(Self::$upper => $english_name,)*
57                }
58            }
59            /// Returns the name of the language in
60            /// its native name.
61            /// ```rust
62            /// let german = De.native_name();
63            /// assert!(german == "Deutsch");
64            ///
65            /// ```
66            pub fn native_name(self) -> &'static str {
67                match self {
68                    $(Self::$upper => $native_name,)*
69                }
70            }
71        }
72
73        impl FromStr for LangCode {
74            type Err = Error;
75            fn from_str(input: &str) -> Result<LangCode, Error> {
76                match input {
77                    $(stringify!($lower) => Ok(Self::$upper),)*
78                    _ => Err(Error::NotAcceptable),
79                }
80            }
81        }
82
83        impl Display for LangCode {
84            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85                write!(f, "{}", self.as_str())
86            }
87        }
88
89
90    }
91}
92impl TryFrom<&Request<'_>> for LangCode {
93    type Error = Error;
94    fn try_from(req: &Request) -> Result<LangCode, Error> {
95        req.local_cache(|| Ok::<_, Error>(En))
96            .clone()
97    }
98}
99
100/// The language code value gets cached on construction,
101/// so it is ok to construct it multiple times.
102#[rocket::async_trait]
103impl<'r> FromRequest<'r> for LangCode {
104    type Error = Error;
105    /// if there is a config struct set, then
106    /// the local_cache already has a closure for creating the value,
107    /// so this one will get ignored.
108    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
109        match request
110            .local_cache(|| Ok::<_, Error>(En))
111            .clone()
112        {
113            Ok(lang) => Outcome::Success(lang),
114            Err(err) => Outcome::Failure((err.status(), err)),
115        }
116    }
117}
118
119
120
121language_impls! {
122Aa | aa  | "Afar"                | "Afaraf"
123Ab | ab  | "Abkhaz"              | "аҧсуа бызшәа"
124Af | af  | "Afrikaans"           | "Afrikaans"
125Ak | ak  | "Akan"                | "Akan"
126Sq | sq  | "Albanian"            | "Shqip"
127Am | am  | "Amharic"             | "አማርኛ"
128Ar | ar  | "Arabic"              | "العربية"
129An | an  | "Aragonese"           | "aragonés"
130Hy | hy  | "Armenian"            | "Հայերեն"
131As | as  | "Assamese"            | "অসমীয়া"
132Av | av  | "Avaric"              | "авар мацӀ"
133Ae | ae  | "Avestan"             | "avesta"
134Ay | ay  | "Aymara"              | "aymar aru"
135Az | az  | "Azerbaijani"         | "azərbaycan dili"
136Bm | bm  | "Bambara"             | "bamanankan"
137Ba | ba  | "Bashkir"             | "башҡорт теле"
138Eu | eu  | "Basque"              | "euskara"
139Be | be  | "Belarusian"          | "беларуская мова"
140Bn | bn  | "Bengali"             | "বাংলা"
141Bh | bh  | "Bihari"              | "भोजपुरी"
142Bi | bi  | "Bislama"             | "Bislama"
143Bs | bs  | "Bosnian"             | "bosanski jezik"
144Br | br  | "Breton"              | "brezhoneg"
145Bg | bg  | "Bulgarian"           | "български език"
146My | my  | "Burmese"             | "ဗမာစာ"
147Ca | ca  | "Catalan"             | "català"
148Ch | ch  | "Chamorro"            | "Chamoru"
149Ce | ce  | "Chechen"             | "нохчийн мотт"
150Ny | ny  | "Chichewa"            | "chiCheŵa"
151Zh | zh  | "Chinese"             | "中文"
152Cv | cv  | "Chuvash"             | "чӑваш чӗлхи"
153Kw | kw  | "Cornish"             | "Kernewek"
154Co | co  | "Corsican"            | "corsu"
155Cr | cr  | "Cree"                | "ᓀᐦᐃᔭᐍᐏᐣ"
156Hr | hr  | "Croatian"            | "hrvatski jezik"
157Cs | cs  | "Czech"               | "čeština"
158Da | da  | "Danish"              | "dansk"
159Dv | dv  | "Divehi"              | "ދިވެހި"
160Nl | nl  | "Dutch"               | "Nederlands"
161Dz | dz  | "Dzongkha"            | "རྫོང་ཁ"
162En | en  | "English"             | "English"
163Eo | eo  | "Esperanto"           | "Esperanto"
164Et | et  | "Estonian"            | "eesti"
165Ee | ee  | "Ewe"                 | "Eʋegbe"
166Fo | fo  | "Faroese"             | "føroyskt"
167Fj | fj  | "Fijian"              | "vosa Vakaviti"
168Fi | fi  | "Finnish"             | "suomi"
169Fr | fr  | "French"              | "français"
170Ff | ff  | "Fula"                | "Fulfulde"
171Gl | gl  | "Galician"            | "galego"
172Ka | ka  | "Georgian"            | "ქართული"
173De | de  | "German"              | "Deutsch"
174El | el  | "Greek"               | "ελληνικά"
175Gn | gn  | "Guaraní"             | "Avañe'ẽ"
176Gu | gu  | "Gujarati"            | "ગુજરાતી"
177Ht | ht  | "Haitian"             | "Kreyòl ayisyen"
178Ha | ha  | "Hausa"               | "(Hausa) هَوُسَ"
179He | he  | "Hebrew"              | "עברית"
180Hz | hz  | "Herero"              | "Otjiherero"
181Hi | hi  | "Hindi"               | "हिन्दी"
182Ho | ho  | "Hiri Motu"           | "Hiri Motu"
183Hu | hu  | "Hungarian"           | "magyar"
184Ia | ia  | "Interlingua"         | "Interlingua"
185Id | id  | "Indonesian"          | "Bahasa Indonesia"
186Ie | ie  | "Interlingue"         | "Interlingue"
187Ga | ga  | "Irish"               | "Gaeilge"
188Ig | ig  | "Igbo"                | "Asụsụ Igbo"
189Ik | ik  | "Inupiaq"             | "Iñupiaq"
190Io | io  | "Ido"                 | "Ido"
191Is | is  | "Icelandic"           | "Íslenska"
192It | it  | "Italian"             | "Italiano"
193Iu | iu  | "Inuktitut"           | "ᐃᓄᒃᑎᑐᑦ"
194Ja | ja  | "Japanese"            | "日本語 (にほんご)"
195Jv | jv  | "Javanese"            | "ꦧꦱꦗꦮ"
196Kl | kl  | "Kalaallisut"         | "kalaallisut"
197Kn | kn  | "Kannada"             | "ಕನ್ನಡ"
198Kr | kr  | "Kanuri"              | "Kanuri"
199Ks | ks  | "Kashmiri"            | "कश्मीरी"
200Kk | kk  | "Kazakh"              | "қазақ тілі"
201Km | km  | "Khmer"               | "ខ្មែរ"
202Ki | ki  | "Kikuyu"              | "Gĩkũyũ"
203Rw | rw  | "Kinyarwanda"         | "Ikinyarwanda"
204Ky | ky  | "Kyrgyz"              | "Кыргызча"
205Kv | kv  | "Komi"                | "коми кыв"
206Kg | kg  | "Kongo"               | "Kikongo"
207Ko | ko  | "Korean"              | "한국어"
208Ku | ku  | "Kurdish"             | "Kurdî"
209Kj | kj  | "Kwanyama"            | "Kuanyama"
210La | la  | "Latin"               | "lingua latina"
211Lb | lb  | "Luxembourgish"       | "Lëtzebuergesch"
212Lg | lg  | "Ganda"               | "Luganda"
213Li | li  | "Limburgish"          | "Limburgs"
214Ln | ln  | "Lingala"             | "Lingála"
215Lo | lo  | "Lao"                 | "ພາສາລາວ"
216Lt | lt  | "Lithuanian"          | "lietuvių kalba"
217Lu | lu  | "Luba-Katanga"        | "Tshiluba"
218Lv | lv  | "Latvian"             | "latviešu valoda"
219Gv | gv  | "Manx"                | "Gaelg"
220Mk | mk  | "Macedonian"          | "македонски јазик"
221Mg | mg  | "Malagasy"            | "fiteny malagasy"
222Ms | ms  | "Malay"               | "bahasa Melayu"
223Ml | ml  | "Malayalam"           | "മലയാളം"
224Mt | mt  | "Maltese"             | "Malti"
225Mi | mi  | "Māori"               | "te reo Māori"
226Mr | mr  | "Marathi"             | "मराठी"
227Mh | mh  | "Marshallese"         | "Kajin M̧ajeļ"
228Mn | mn  | "Mongolian"           | "Монгол хэл"
229Na | na  | "Nauruan"             | "Dorerin Naoero"
230Nv | nv  | "Navajo"              | "Diné bizaad"
231Nd | nd  | "Northern Ndebele"    | "isiNdebele"
232Ne | ne  | "Nepali"              | "नेपाली"
233Ng | ng  | "Ndonga"              | "Owambo"
234Nb | nb  | "Norwegian Bokmål"    | "Norsk bokmål"
235Nn | nn  | "Norwegian Nynorsk"   | "Norsk nynorsk"
236No | no  | "Norwegian"           | "Norsk"
237Ii | ii  | "Nuosu"               | "ꆈꌠ꒿ Nuosuhxop"
238Nr | nr  | "Southern Ndebele"    | "isiNdebele"
239Oc | oc  | "Occitan"             | "occitan"
240Oj | oj  | "Ojibwe"              | "ᐊᓂᔑᓈᐯᒧᐎᓐ"
241Cu | cu  | "Old Church Slavonic" | "ѩзыкъ словѣньскъ"
242Om | om  | "Oromo"               | "Afaan Oromoo"
243Or | or  | "Oriya"               | "ଓଡ଼ିଆ"
244Os | os  | "Ossetian"            | "ирон æвзаг"
245Pa | pa  | "Punjabi"             | "ਪੰਜਾਬੀ"
246Pi | pi  | "Pāli"                | "पाऴि"
247Fa | fa  | "Persian"             | "فارسی"
248Pl | pl  | "Polish"              | "język polski"
249Ps | ps  | "Pashto"              | "پښتو"
250Pt | pt  | "Portuguese"          | "Português"
251Qu | qu  | "Quechua"             | "Runa Simi"
252Rm | rm  | "Romansh"             | "rumantsch grischun"
253Rn | rn  | "Kirundi"             | "Ikirundi"
254Ro | ro  | "Romanian"            | "Română"
255Ru | ru  | "Russian"             | "Русский"
256Sa | sa  | "Sanskrit"            | "संस्कृतम्"
257Sc | sc  | "Sardinian"           | "sardu"
258Sd | sd  | "Sindhi"              | "सिन्धी"
259Se | se  | "Northern Sami"       | "Davvisámegiella"
260Sm | sm  | "Samoan"              | "gagana fa'a Samoa"
261Sg | sg  | "Sango"               | "yângâ tî sängö"
262Sr | sr  | "Serbian"             | "српски језик"
263Gd | gd  | "Gaelic"              | "Gàidhlig"
264Sn | sn  | "Shona"               | "chiShona"
265Si | si  | "Sinhalese"           | "සිංහල"
266Sk | sk  | "Slovak"              | "slovenčina"
267Sl | sl  | "Slovene"             | "slovenski jezik"
268So | so  | "Somali"              | "Soomaaliga"
269St | st  | "Southern Sotho"      | "Sesotho"
270Es | es  | "Spanish"             | "Español"
271Su | su  | "Sundanese"           | "Basa Sunda"
272Sw | sw  | "Swahili"             | "Kiswahili"
273Ss | ss  | "Swati"               | "SiSwati"
274Sv | sv  | "Swedish"             | "svenska"
275Ta | ta  | "Tamil"               | "தமிழ்"
276Te | te  | "Telugu"              | "తెలుగు"
277Tg | tg  | "Tajik"               | "тоҷикӣ"
278Th | th  | "Thai"                | "ไทย"
279Ti | ti  | "Tigrinya"            | "ትግርኛ"
280Bo | bo  | "Tibetan"             | "བོད་ཡིག"
281Tk | tk  | "Turkmen"             | "Türkmen"
282Tl | tl  | "Tagalog"             | "Wikang Tagalog"
283Tn | tn  | "Tswana"              | "Setswana"
284To | to  | "Tonga"               | "faka Tonga"
285Tr | tr  | "Turkish"             | "Türkçe"
286Ts | ts  | "Tsonga"              | "Xitsonga"
287Tt | tt  | "Tatar"               | "татар теле"
288Tw | tw  | "Twi"                 | "Twi"
289Ty | ty  | "Tahitian"            | "Reo Tahiti"
290Ug | ug  | "Uyghur"              | "ئۇيغۇرچە‎"
291Uk | uk  | "Ukrainian"           | "Українська"
292Ur | ur  | "Urdu"                | "اردو"
293Uz | uz  | "Uzbek"               | "Oʻzbek"
294Ve | ve  | "Venda"               | "Tshivenḓa"
295Vi | vi  | "Vietnamese"          | "Tiếng Việt"
296Vo | vo  | "Volapük"             | "Volapük"
297Wa | wa  | "Walloon"             | "walon"
298Cy | cy  | "Welsh"               | "Cymraeg"
299Wo | wo  | "Wolof"               | "Wollof"
300Fy | fy  | "Western Frisian"     | "Frysk"
301Xh | xh  | "Xhosa"               | "isiXhosa"
302Yi | yi  | "Yiddish"             | "ייִדיש"
303Yo | yo  | "Yoruba"              | "Yorùbá"
304Za | za  | "Zhuang"              | "Saɯ cueŋƅ"
305Zu | zu  | "Zulu"                | "isiZulu"
306}