1use std::borrow::Cow;
2use std::convert::TryFrom;
3use std::str::FromStr;
4
5decl_enum! {
6 ##[default = UnitedNations]
33 ##[base = u16]
34 pub enum FlagCode {
35 SyrianArabRepublic = 1,
36 Thailand = 2,
37 Turkmenistan = 3,
38 Tunisia = 4,
39 Turkey = 5,
40 TrinidadandTobago = 6,
41 Taiwan = 7,
42 Tanzania = 8,
43 Ukraine = 9,
44 UnitedNations = 10,
45 UnitedStates = 11,
46 Uruguay = 12,
47 Uzbekistan = 13,
48 Venezuela = 14,
49 VietNam = 15,
50 PuertoRico = 16,
51 Portugal = 17,
52 Paraguay = 18,
53 Qatar = 19,
54 Rainbow = 20,
55 Romania = 21,
56 Serbia = 22,
57 RussianFederation = 23,
58 SaudiArabia = 24,
59 Sweden = 25,
60 Singapore = 26,
61 Slovenia = 27,
62 Slovakia = 28,
63 SanMarino = 29,
64 Macedonia = 30,
65 Macao = 31,
66 Malta = 32,
67 Mexico = 33,
68 Malaysia = 34,
69 Nigeria = 35,
70 Netherlands = 36,
71 Norway = 37,
72 Nepal = 38,
73 NewZealand = 39,
74 Oman = 40,
75 Panama = 41,
76 Peru = 42,
77 Japan = 43,
78 DPRK = 44,
79 SouthKorea = 45,
80 Kuwait = 46,
81 Kazakhstan = 47,
82 Lebanon = 48,
83 Liechtenstein = 49,
84 SriLanka = 50,
85 Lithuania = 51,
86 Luxembourg = 52,
87 Latvia = 53,
88 Honduras = 54,
89 Croatia = 55,
90 Hungary = 56,
91 Indonesia = 57,
92 Ireland = 58,
93 Israel = 59,
94 IsleofMan = 60,
95 ImperialJapan = 61,
96 India = 62,
97 Iraq = 63,
98 Germany = 64,
99 Denmark = 65,
100 DominicanRepublic = 66,
101 Algeria = 67,
102 Ecuador = 68,
103 Estonia = 69,
104 Egypt = 70,
105 Spain = 71,
106 EuropeanUnion = 72,
107 Bahrain = 73,
108 Bolivia = 74,
109 Brazil = 75,
110 Bhutan = 76,
111 Belarus = 77,
112 Canada = 78,
113 Switzerland = 79,
114 Andorra = 80,
115 UnitedArabEmirates = 81,
116 Albania = 82,
117 Armenia = 83,
118 Chile = 84,
119 Antarctica = 85,
120 China = 86,
121 Argentina = 87,
122 Finland = 88,
123 Colombia = 89,
124 Austria = 90,
125 Iran = 91,
126 France = 92,
127 Communist = 93,
128 Australia = 94,
129 LibyanArabJamahiriya = 95,
130 Iceland = 96,
131 UnitedKingdom = 97,
132 Confederate = 98,
133 Azerbaijan = 99,
134 Morocco = 100,
135 Italy = 101,
136 Georgia = 102,
137 CostaRica = 103,
138 BosniaAndHerzegovina = 104,
139 Philippines = 105,
140 Monaco = 106,
141 Jamaica = 107,
142 Greece = 108,
143 Cuba = 109,
144 Bangladesh = 110,
145 Somalia = 111,
146 Pakistan = 112,
147 Moldova = 113,
148 Jordan = 114,
149 Guatemala = 115,
150 Cyprus = 116,
151 Belgium = 117,
152 SouthAfrica = 118,
153 ElSalvador = 119,
154 Poland = 120,
155 Montenegro = 121,
156 JollyRogers = 122,
157 HongKong = 123,
158 CzechRepublic = 124,
159 Bulgaria = 125,
160 }
161}
162
163impl<'a> TryFrom<&'a str> for FlagCode {
164 type Error = <Self as TryFrom<String>>::Error;
165
166 fn try_from(s: &'a str) -> Result<Self, Self::Error> {
167 Self::try_from(s.to_owned())
168 }
169}
170
171impl TryFrom<String> for FlagCode {
172 type Error = ();
173
174 fn try_from(mut s: String) -> Result<Self, ()> {
175 s.make_ascii_uppercase();
176
177 Ok(match &*s {
178 "SY" => FlagCode::SyrianArabRepublic,
179 "TH" => FlagCode::Thailand,
180 "TM" => FlagCode::Turkmenistan,
181 "TN" => FlagCode::Tunisia,
182 "TR" => FlagCode::Turkey,
183 "TT" => FlagCode::TrinidadandTobago,
184 "TW" => FlagCode::Taiwan,
185 "TZ" => FlagCode::Tanzania,
186 "UA" => FlagCode::Ukraine,
187 "UN" => FlagCode::UnitedNations,
188 "US" => FlagCode::UnitedStates,
189 "UY" => FlagCode::Uruguay,
190 "UZ" => FlagCode::Uzbekistan,
191 "VE" => FlagCode::Venezuela,
192 "VN" => FlagCode::VietNam,
193 "PR" => FlagCode::PuertoRico,
194 "PT" => FlagCode::Portugal,
195 "PY" => FlagCode::Paraguay,
196 "QA" => FlagCode::Qatar,
197 "RAINBOW" => FlagCode::Rainbow,
198 "RO" => FlagCode::Romania,
199 "RS" => FlagCode::Serbia,
200 "RU" => FlagCode::RussianFederation,
201 "SA" => FlagCode::SaudiArabia,
202 "SE" => FlagCode::Sweden,
203 "SG" => FlagCode::Singapore,
204 "SI" => FlagCode::Slovenia,
205 "SK" => FlagCode::Slovakia,
206 "SM" => FlagCode::SanMarino,
207 "MK" => FlagCode::Macedonia,
208 "MO" => FlagCode::Macao,
209 "MT" => FlagCode::Malta,
210 "MX" => FlagCode::Mexico,
211 "MY" => FlagCode::Malaysia,
212 "NG" => FlagCode::Nigeria,
213 "NL" => FlagCode::Netherlands,
214 "NO" => FlagCode::Norway,
215 "NP" => FlagCode::Nepal,
216 "NZ" => FlagCode::NewZealand,
217 "OM" => FlagCode::Oman,
218 "PA" => FlagCode::Panama,
219 "PE" => FlagCode::Peru,
220 "JP" => FlagCode::Japan,
221 "KP" => FlagCode::DPRK,
222 "KR" => FlagCode::SouthKorea,
223 "KW" => FlagCode::Kuwait,
224 "KZ" => FlagCode::Kazakhstan,
225 "LB" => FlagCode::Lebanon,
226 "LI" => FlagCode::Liechtenstein,
227 "LK" => FlagCode::SriLanka,
228 "LT" => FlagCode::Lithuania,
229 "LU" => FlagCode::Luxembourg,
230 "LV" => FlagCode::Latvia,
231 "HN" => FlagCode::Honduras,
232 "HR" => FlagCode::Croatia,
233 "HU" => FlagCode::Hungary,
234 "ID" => FlagCode::Indonesia,
235 "IE" => FlagCode::Ireland,
236 "IL" => FlagCode::Israel,
237 "IM" => FlagCode::IsleofMan,
238 "IMPERIAL" => FlagCode::ImperialJapan,
239 "IN" => FlagCode::India,
240 "IQ" => FlagCode::Iraq,
241 "DE" => FlagCode::Germany,
242 "DK" => FlagCode::Denmark,
243 "DO" => FlagCode::DominicanRepublic,
244 "DZ" => FlagCode::Algeria,
245 "EC" => FlagCode::Ecuador,
246 "EE" => FlagCode::Estonia,
247 "EG" => FlagCode::Egypt,
248 "ES" => FlagCode::Spain,
249 "EU" => FlagCode::EuropeanUnion,
250 "BH" => FlagCode::Bahrain,
251 "BO" => FlagCode::Bolivia,
252 "BR" => FlagCode::Brazil,
253 "BT" => FlagCode::Bhutan,
254 "BY" => FlagCode::Belarus,
255 "CA" => FlagCode::Canada,
256 "CH" => FlagCode::Switzerland,
257 "AD" => FlagCode::Andorra,
258 "AE" => FlagCode::UnitedArabEmirates,
259 "AL" => FlagCode::Albania,
260 "AM" => FlagCode::Armenia,
261 "CL" => FlagCode::Chile,
262 "AQ" => FlagCode::Antarctica,
263 "CN" => FlagCode::China,
264 "AR" => FlagCode::Argentina,
265 "FI" => FlagCode::Finland,
266 "CO" => FlagCode::Colombia,
267 "AT" => FlagCode::Austria,
268 "IR" => FlagCode::Iran,
269 "FR" => FlagCode::France,
270 "COMMUNIST" => FlagCode::Communist,
271 "AU" => FlagCode::Australia,
272 "LY" => FlagCode::LibyanArabJamahiriya,
273 "IS" => FlagCode::Iceland,
274 "GB" => FlagCode::UnitedKingdom,
275 "CONFEDERATE" => FlagCode::Confederate,
276 "AZ" => FlagCode::Azerbaijan,
277 "MA" => FlagCode::Morocco,
278 "IT" => FlagCode::Italy,
279 "GE" => FlagCode::Georgia,
280 "CR" => FlagCode::CostaRica,
281 "BA" => FlagCode::BosniaAndHerzegovina,
282 "PH" => FlagCode::Philippines,
283 "MC" => FlagCode::Monaco,
284 "JM" => FlagCode::Jamaica,
285 "GR" => FlagCode::Greece,
286 "CU" => FlagCode::Cuba,
287 "BD" => FlagCode::Bangladesh,
288 "SO" => FlagCode::Somalia,
289 "PK" => FlagCode::Pakistan,
290 "MD" => FlagCode::Moldova,
291 "JO" => FlagCode::Jordan,
292 "GT" => FlagCode::Guatemala,
293 "CY" => FlagCode::Cyprus,
294 "BE" => FlagCode::Belgium,
295 "ZA" => FlagCode::SouthAfrica,
296 "SV" => FlagCode::ElSalvador,
297 "PL" => FlagCode::Poland,
298 "ME" => FlagCode::Montenegro,
299 "JOLLY" => FlagCode::JollyRogers,
300 "HK" => FlagCode::HongKong,
301 "CZ" => FlagCode::CzechRepublic,
302 "BG" => FlagCode::Bulgaria,
303 _ => return Err(()),
304 })
305 }
306}
307
308impl FromStr for FlagCode {
309 type Err = <Self as TryFrom<String>>::Error;
310
311 fn from_str(s: &str) -> Result<Self, Self::Err> {
312 Self::try_from(s)
313 }
314}
315
316impl<'a> From<FlagCode> for Cow<'a, str> {
317 fn from(code: FlagCode) -> Cow<'a, str> {
318 use self::FlagCode::*;
319
320 Cow::Borrowed(match code {
321 SyrianArabRepublic => "SY",
322 Thailand => "TH",
323 Turkmenistan => "TM",
324 Tunisia => "TN",
325 Turkey => "TR",
326 TrinidadandTobago => "TT",
327 Taiwan => "TW",
328 Tanzania => "TZ",
329 Ukraine => "UA",
330 UnitedNations => "UN",
331 UnitedStates => "US",
332 Uruguay => "UY",
333 Uzbekistan => "UZ",
334 Venezuela => "VE",
335 VietNam => "VN",
336 PuertoRico => "PR",
337 Portugal => "PT",
338 Paraguay => "PY",
339 Qatar => "QA",
340 Rainbow => "RAINBOW",
341 Romania => "RO",
342 Serbia => "RS",
343 RussianFederation => "RU",
344 SaudiArabia => "SA",
345 Sweden => "SE",
346 Singapore => "SG",
347 Slovenia => "SI",
348 Slovakia => "SK",
349 SanMarino => "SM",
350 Macedonia => "MK",
351 Macao => "MO",
352 Malta => "MT",
353 Mexico => "MX",
354 Malaysia => "MY",
355 Nigeria => "NG",
356 Netherlands => "NL",
357 Norway => "NO",
358 Nepal => "NP",
359 NewZealand => "NZ",
360 Oman => "OM",
361 Panama => "PA",
362 Peru => "PE",
363 Japan => "JP",
364 DPRK => "KP",
365 SouthKorea => "KR",
366 Kuwait => "KW",
367 Kazakhstan => "KZ",
368 Lebanon => "LB",
369 Liechtenstein => "LI",
370 SriLanka => "LK",
371 Lithuania => "LT",
372 Luxembourg => "LU",
373 Latvia => "LV",
374 Honduras => "HN",
375 Croatia => "HR",
376 Hungary => "HU",
377 Indonesia => "ID",
378 Ireland => "IE",
379 Israel => "IL",
380 IsleofMan => "IM",
381 ImperialJapan => "IMPERIAL",
382 India => "IN",
383 Iraq => "IQ",
384 Germany => "DE",
385 Denmark => "DK",
386 DominicanRepublic => "DO",
387 Algeria => "DZ",
388 Ecuador => "EC",
389 Estonia => "EE",
390 Egypt => "EG",
391 Spain => "ES",
392 EuropeanUnion => "EU",
393 Bahrain => "BH",
394 Bolivia => "BO",
395 Brazil => "BR",
396 Bhutan => "BT",
397 Belarus => "BY",
398 Canada => "CA",
399 Switzerland => "CH",
400 Andorra => "AD",
401 UnitedArabEmirates => "AE",
402 Albania => "AL",
403 Armenia => "AM",
404 Chile => "CL",
405 Antarctica => "AQ",
406 China => "CN",
407 Argentina => "AR",
408 Finland => "FI",
409 Colombia => "CO",
410 Austria => "AT",
411 Iran => "IR",
412 France => "FR",
413 Communist => "COMMUNIST",
414 Australia => "AU",
415 LibyanArabJamahiriya => "LY",
416 Iceland => "IS",
417 UnitedKingdom => "GB",
418 Confederate => "CONFEDERATE",
419 Azerbaijan => "AZ",
420 Morocco => "MA",
421 Italy => "IT",
422 Georgia => "GE",
423 CostaRica => "CR",
424 BosniaAndHerzegovina => "BA",
425 Philippines => "PH",
426 Monaco => "MC",
427 Jamaica => "JM",
428 Greece => "GR",
429 Cuba => "CU",
430 Bangladesh => "BD",
431 Somalia => "SO",
432 Pakistan => "PK",
433 Moldova => "MD",
434 Jordan => "JO",
435 Guatemala => "GT",
436 Cyprus => "CY",
437 Belgium => "BE",
438 SouthAfrica => "ZA",
439 ElSalvador => "SV",
440 Poland => "PL",
441 Montenegro => "ME",
442 JollyRogers => "JOLLY",
443 HongKong => "HK",
444 CzechRepublic => "CZ",
445 Bulgaria => "BG",
446 Unknown(v) => return format!("UNKNOWN({})", v).into(),
447 })
448 }
449}
450
451impl From<FlagCode> for String {
452 fn from(code: FlagCode) -> String {
453 Cow::from(code).into_owned()
454 }
455}