1use crate::Error;
2use serde::{Deserialize, Serialize};
3use std::{fmt, str::FromStr};
4
5#[derive(Debug, Copy, Clone, Serialize, Deserialize, Ord, PartialOrd, Eq, PartialEq, Hash)]
7#[serde(rename_all = "SCREAMING-KEBAB-CASE")]
8pub enum Lang {
9 Ar,
11 Bg,
13 Cs,
15 Da,
17 De,
19 El,
21 En,
23 EnGb,
25 EnUs,
27 Es,
29 Et,
31 Fi,
33 Fr,
35 Hu,
37 Id,
39 It,
41 Ja,
43 Ko,
45 Lt,
47 Lv,
49 Nb,
51 Nl,
53 Pl,
55 Pt,
57 PtBr,
59 PtPt,
61 Ro,
63 Ru,
65 Sk,
67 Sl,
69 Sv,
71 Tr,
73 Uk,
75 Zh,
77}
78
79impl fmt::Display for Lang {
80 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
81 write!(
82 f,
83 "{}",
84 match self {
85 Self::Ar => "AR",
86 Self::Bg => "BG",
87 Self::Cs => "CS",
88 Self::Da => "DA",
89 Self::De => "DE",
90 Self::El => "EL",
91 Self::En => "EN",
92 Self::EnGb => "EN-GB",
93 Self::EnUs => "EN-US",
94 Self::Es => "ES",
95 Self::Et => "ET",
96 Self::Fi => "FI",
97 Self::Fr => "FR",
98 Self::Hu => "HU",
99 Self::Id => "ID",
100 Self::It => "IT",
101 Self::Ja => "JA",
102 Self::Ko => "KO",
103 Self::Lt => "LT",
104 Self::Lv => "LV",
105 Self::Nb => "NB",
106 Self::Nl => "NL",
107 Self::Pl => "PL",
108 Self::Pt => "PT",
109 Self::PtBr => "PT-BR",
110 Self::PtPt => "PT-PT",
111 Self::Ro => "RO",
112 Self::Ru => "RU",
113 Self::Sk => "SK",
114 Self::Sl => "SL",
115 Self::Sv => "SV",
116 Self::Tr => "TR",
117 Self::Uk => "UK",
118 Self::Zh => "ZH",
119 }
120 )
121 }
122}
123
124impl FromStr for Lang {
125 type Err = Error;
126
127 fn from_str(s: &str) -> Result<Self, Self::Err> {
128 Ok(match s {
129 "AR" | "ar" => Self::Ar,
130 "BG" | "bg" => Self::Bg,
131 "CS" | "cs" => Self::Cs,
132 "DA" | "da" => Self::Da,
133 "DE" | "de" => Self::De,
134 "EL" | "el" => Self::El,
135 "EN" | "en" => Self::En,
136 "EN-GB" | "en-gb" => Self::EnGb,
137 "EN-US" | "en-us" => Self::EnUs,
138 "ES" | "es" => Self::Es,
139 "ET" | "et" => Self::Et,
140 "FI" | "fi" => Self::Fi,
141 "FR" | "fr" => Self::Fr,
142 "HU" | "hu" => Self::Hu,
143 "ID" | "id" => Self::Id,
144 "IT" | "it" => Self::It,
145 "JA" | "ja" => Self::Ja,
146 "KO" | "ko" => Self::Ko,
147 "LT" | "lt" => Self::Lt,
148 "LV" | "lv" => Self::Lv,
149 "NB" | "nb" => Self::Nb,
150 "NL" | "nl" => Self::Nl,
151 "PL" | "pl" => Self::Pl,
152 "PT" | "pt" => Self::Pt,
153 "PT-BR" | "pt-br" => Self::PtBr,
154 "PT-PT" | "pt-pt" => Self::PtPt,
155 "RO" | "ro" => Self::Ro,
156 "RU" | "ru" => Self::Ru,
157 "SK" | "sk" => Self::Sk,
158 "SL" | "sl" => Self::Sl,
159 "SV" | "sv" => Self::Sv,
160 "TR" | "tr" => Self::Tr,
161 "UK" | "uk" => Self::Uk,
162 "ZH" | "zh" => Self::Zh,
163 _ => {
164 return Err(Error::InvalidLang(s.to_string()));
165 }
166 })
167 }
168}