airmash_protocol/enums/
flag_code.rs

1use std::borrow::Cow;
2use std::convert::TryFrom;
3use std::str::FromStr;
4
5decl_enum! {
6  /// All player flags currently available within
7  /// the game.
8  ///
9  /// This enum can be determined from a flag code
10  /// string using the [`FromStr`][0] or
11  /// [`TryFrom`][1] implementations. Usually the
12  /// server will parse invalid flag code strings
13  /// into the [`UnitedNations`][2] variant, but
14  /// this is left up to the user.
15  ///
16  /// # Restricted Flags
17  /// In the official server the following flags are
18  /// restricted to players level 4 and above:
19  /// - [`JollyRogers`](#variant.JollyRogers)
20  /// - [`Communist`](#variant.Communist)
21  /// - [`ImperialJapan`](#variant.ImperialJapan)
22  /// - [`Confederate`](#variant.Confederate)
23  /// - [`Rainbow`](#variant.Rainbow)
24  ///
25  /// Changing flags in-game are restricted to those
26  /// level 2 and above, although any (non-restricted)
27  /// flag can be chosen when logging in.
28  ///
29  /// [0]: https://doc.rust-lang.org/std/str/trait.FromStr.html
30  /// [1]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html
31  /// [2]: #variant.UnitedNations
32  ##[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}