countries_tools/
countries.rs

1use parse_display::{Display, FromStr};
2
3use super::Country;
4
5use CountryAlpha2::*;
6use CountryAlpha3::*;
7
8struct CountriesList<const SIZE: usize> {
9    countries: [Country; SIZE],
10}
11
12impl<const SIZE: usize> CountriesList<SIZE> {
13    #[inline]
14    const fn new(countries: [Country; SIZE]) -> Self {
15        Self { countries }
16    }
17
18    #[inline]
19    pub const fn country_by_numeric(&self, numeric: u16) -> Option<Country> {
20        let mut low = 0;
21        let mut high = self.countries.len() - 1;
22
23        while low <= high {
24            let mid = (low + high) / 2;
25            let mid_country = self.countries[mid];
26
27            if mid_country.numeric() < numeric {
28                low = mid + 1;
29            } else if mid_country.numeric() > numeric {
30                high = mid - 1;
31            } else {
32                return Some(mid_country);
33            }
34        }
35
36        None
37    }
38
39    #[inline]
40    pub const fn country_by_alpha2(&self, alpha2: CountryAlpha2) -> Country {
41        self.countries[alpha2.internal_offset()]
42    }
43
44    #[inline]
45    pub const fn country_by_alpha3(&self, alpha3: CountryAlpha3) -> Country {
46        self.countries[alpha3.internal_offset()]
47    }
48}
49
50// NOTE: This is static as that reduces the size of the binary and makes it faster.
51//       Order is important, as it is used for binary search by the `Country` numeric.
52//       Also, alpha 2 and alpha 3 codes are sorted alphabetically but the values are
53//       offsets into the array for fast lookup from the `CountryAlpha2` and `CountryAlpha3`
54//       enums.
55static COUNTRIES: CountriesList<249> = CountriesList::new([
56    Country::new(AF, AFG, 004),
57    Country::new(AL, ALB, 008),
58    Country::new(AQ, ATA, 010),
59    Country::new(DZ, DZA, 012),
60    Country::new(AS, ASM, 016),
61    Country::new(AD, AND, 020),
62    Country::new(AO, AGO, 024),
63    Country::new(AG, ATG, 028),
64    Country::new(AZ, AZE, 031),
65    Country::new(AR, ARG, 032),
66    Country::new(AU, AUS, 036),
67    Country::new(AT, AUT, 040),
68    Country::new(BS, BHS, 044),
69    Country::new(BH, BHR, 048),
70    Country::new(BD, BGD, 050),
71    Country::new(AM, ARM, 051),
72    Country::new(BB, BRB, 052),
73    Country::new(BE, BEL, 056),
74    Country::new(BM, BMU, 060),
75    Country::new(BT, BTN, 064),
76    Country::new(BO, BOL, 068),
77    Country::new(BA, BIH, 070),
78    Country::new(BW, BWA, 072),
79    Country::new(BV, BVT, 074),
80    Country::new(BR, BRA, 076),
81    Country::new(BZ, BLZ, 084),
82    Country::new(IO, IOT, 086),
83    Country::new(SB, SLB, 090),
84    Country::new(VG, VGB, 092),
85    Country::new(BN, BRN, 096),
86    Country::new(BG, BGR, 100),
87    Country::new(MM, MMR, 104),
88    Country::new(BI, BDI, 108),
89    Country::new(BY, BLR, 112),
90    Country::new(KH, KHM, 116),
91    Country::new(CM, CMR, 120),
92    Country::new(CA, CAN, 124),
93    Country::new(CV, CPV, 132),
94    Country::new(KY, CYM, 136),
95    Country::new(CF, CAF, 140),
96    Country::new(LK, LKA, 144),
97    Country::new(TD, TCD, 148),
98    Country::new(CL, CHL, 152),
99    Country::new(CN, CHN, 156),
100    Country::new(TW, TWN, 158),
101    Country::new(CX, CXR, 162),
102    Country::new(CC, CCK, 166),
103    Country::new(CO, COL, 170),
104    Country::new(KM, COM, 174),
105    Country::new(YT, MYT, 175),
106    Country::new(CG, COG, 178),
107    Country::new(CD, COD, 180),
108    Country::new(CK, COK, 184),
109    Country::new(CR, CRI, 188),
110    Country::new(HR, HRV, 191),
111    Country::new(CU, CUB, 192),
112    Country::new(CY, CYP, 196),
113    Country::new(CZ, CZE, 203),
114    Country::new(BJ, BEN, 204),
115    Country::new(DK, DNK, 208),
116    Country::new(DM, DMA, 212),
117    Country::new(DO, DOM, 214),
118    Country::new(EC, ECU, 218),
119    Country::new(SV, SLV, 222),
120    Country::new(GQ, GNQ, 226),
121    Country::new(ER, ERI, 232),
122    Country::new(ET, ETH, 231),
123    Country::new(EE, EST, 233),
124    Country::new(FO, FRO, 234),
125    Country::new(FK, FLK, 238),
126    Country::new(GS, SGS, 239),
127    Country::new(FJ, FJI, 242),
128    Country::new(FI, FIN, 246),
129    Country::new(AX, ALA, 248),
130    Country::new(FR, FRA, 250),
131    Country::new(GF, GUF, 254),
132    Country::new(PF, PYF, 258),
133    Country::new(TF, ATF, 260),
134    Country::new(DJ, DJI, 262),
135    Country::new(GA, GAB, 266),
136    Country::new(GE, GEO, 268),
137    Country::new(GM, GMB, 270),
138    Country::new(PS, PSE, 275),
139    Country::new(DE, DEU, 276),
140    Country::new(GH, GHA, 288),
141    Country::new(GI, GIB, 292),
142    Country::new(KI, KIR, 296),
143    Country::new(GR, GRC, 300),
144    Country::new(GL, GRL, 304),
145    Country::new(GD, GRD, 308),
146    Country::new(GP, GLP, 312),
147    Country::new(GU, GUM, 316),
148    Country::new(GT, GTM, 320),
149    Country::new(GN, GIN, 324),
150    Country::new(GY, GUY, 328),
151    Country::new(HT, HTI, 332),
152    Country::new(HM, HMD, 334),
153    Country::new(VA, VAT, 336),
154    Country::new(HN, HND, 340),
155    Country::new(HK, HKG, 344),
156    Country::new(HU, HUN, 348),
157    Country::new(IS, ISL, 352),
158    Country::new(IN, IND, 356),
159    Country::new(ID, IDN, 360),
160    Country::new(IR, IRN, 364),
161    Country::new(IQ, IRQ, 368),
162    Country::new(IE, IRL, 372),
163    Country::new(IL, ISR, 376),
164    Country::new(IT, ITA, 380),
165    Country::new(CI, CIV, 384),
166    Country::new(JM, JAM, 388),
167    Country::new(JP, JPN, 392),
168    Country::new(KZ, KAZ, 398),
169    Country::new(JO, JOR, 400),
170    Country::new(KE, KEN, 404),
171    Country::new(KP, PRK, 408),
172    Country::new(KR, KOR, 410),
173    Country::new(KW, KWT, 414),
174    Country::new(KG, KGZ, 417),
175    Country::new(LA, LAO, 418),
176    Country::new(LB, LBN, 422),
177    Country::new(LS, LSO, 426),
178    Country::new(LV, LVA, 428),
179    Country::new(LR, LBR, 430),
180    Country::new(LY, LBY, 434),
181    Country::new(LI, LIE, 438),
182    Country::new(LT, LTU, 440),
183    Country::new(LU, LUX, 442),
184    Country::new(MO, MAC, 446),
185    Country::new(MG, MDG, 450),
186    Country::new(MW, MWI, 454),
187    Country::new(MY, MYS, 458),
188    Country::new(MV, MDV, 462),
189    Country::new(ML, MLI, 466),
190    Country::new(MT, MLT, 470),
191    Country::new(MQ, MTQ, 474),
192    Country::new(MR, MRT, 478),
193    Country::new(MU, MUS, 480),
194    Country::new(MX, MEX, 484),
195    Country::new(MC, MCO, 492),
196    Country::new(MN, MNG, 496),
197    Country::new(MD, MDA, 498),
198    Country::new(ME, MNE, 499),
199    Country::new(MS, MSR, 500),
200    Country::new(MA, MAR, 504),
201    Country::new(MZ, MOZ, 508),
202    Country::new(OM, OMN, 512),
203    Country::new(NA, NAM, 516),
204    Country::new(NR, NRU, 520),
205    Country::new(NP, NPL, 524),
206    Country::new(NL, NLD, 528),
207    Country::new(CW, CUW, 531),
208    Country::new(AW, ABW, 533),
209    Country::new(SX, SXM, 534),
210    Country::new(BQ, BES, 535),
211    Country::new(NC, NCL, 540),
212    Country::new(VU, VUT, 548),
213    Country::new(NZ, NZL, 554),
214    Country::new(NI, NIC, 558),
215    Country::new(NE, NER, 562),
216    Country::new(NG, NGA, 566),
217    Country::new(NU, NIU, 570),
218    Country::new(NF, NFK, 574),
219    Country::new(NO, NOR, 578),
220    Country::new(MP, MNP, 580),
221    Country::new(UM, UMI, 581),
222    Country::new(FM, FSM, 583),
223    Country::new(MH, MHL, 584),
224    Country::new(PW, PLW, 585),
225    Country::new(PK, PAK, 586),
226    Country::new(PA, PAN, 591),
227    Country::new(PG, PNG, 598),
228    Country::new(PY, PRY, 600),
229    Country::new(PE, PER, 604),
230    Country::new(PH, PHL, 608),
231    Country::new(PN, PCN, 612),
232    Country::new(PL, POL, 616),
233    Country::new(PT, PRT, 620),
234    Country::new(GW, GNB, 624),
235    Country::new(TL, TLS, 626),
236    Country::new(PR, PRI, 630),
237    Country::new(QA, QAT, 634),
238    Country::new(RE, REU, 638),
239    Country::new(RO, ROU, 642),
240    Country::new(RU, RUS, 643),
241    Country::new(RW, RWA, 646),
242    Country::new(BL, BLM, 652),
243    Country::new(SH, SHN, 654),
244    Country::new(KN, KNA, 659),
245    Country::new(LC, LCA, 662),
246    Country::new(AI, AIA, 660),
247    Country::new(MF, MAF, 663),
248    Country::new(PM, SPM, 666),
249    Country::new(VC, VCT, 670),
250    Country::new(SM, SMR, 674),
251    Country::new(ST, STP, 678),
252    Country::new(SA, SAU, 682),
253    Country::new(SN, SEN, 686),
254    Country::new(RS, SRB, 688),
255    Country::new(SC, SYC, 690),
256    Country::new(SL, SLE, 694),
257    Country::new(SG, SGP, 702),
258    Country::new(SK, SVK, 703),
259    Country::new(VN, VNM, 704),
260    Country::new(SI, SVN, 705),
261    Country::new(SO, SOM, 706),
262    Country::new(ZA, ZAF, 710),
263    Country::new(ZW, ZWE, 716),
264    Country::new(ES, ESP, 724),
265    Country::new(SS, SSD, 728),
266    Country::new(SD, SDN, 729),
267    Country::new(EH, ESH, 732),
268    Country::new(SR, SUR, 740),
269    Country::new(SJ, SJM, 744),
270    Country::new(SZ, SWZ, 748),
271    Country::new(SE, SWE, 752),
272    Country::new(CH, CHE, 756),
273    Country::new(SY, SYR, 760),
274    Country::new(TJ, TJK, 762),
275    Country::new(TH, THA, 764),
276    Country::new(TG, TGO, 768),
277    Country::new(TK, TKL, 772),
278    Country::new(TO, TON, 776),
279    Country::new(AE, ARE, 784),
280    Country::new(TN, TUN, 788),
281    Country::new(TT, TTO, 780),
282    Country::new(TR, TUR, 792),
283    Country::new(TM, TKM, 795),
284    Country::new(TC, TCA, 796),
285    Country::new(TV, TUV, 798),
286    Country::new(UG, UGA, 800),
287    Country::new(UA, UKR, 804),
288    Country::new(MK, MKD, 807),
289    Country::new(EG, EGY, 818),
290    Country::new(GB, GBR, 826),
291    Country::new(GG, GGY, 831),
292    Country::new(JE, JEY, 832),
293    Country::new(IM, IMN, 833),
294    Country::new(TZ, TZA, 834),
295    Country::new(US, USA, 840),
296    Country::new(VI, VIR, 850),
297    Country::new(BF, BFA, 854),
298    Country::new(UY, URY, 858),
299    Country::new(UZ, UZB, 860),
300    Country::new(VE, VEN, 862),
301    Country::new(WF, WLF, 876),
302    Country::new(WS, WSM, 882),
303    Country::new(YE, YEM, 887),
304    Country::new(ZM, ZMB, 894),
305]);
306
307impl From<CountryAlpha2> for Country {
308    #[inline]
309    fn from(value: CountryAlpha2) -> Self {
310        COUNTRIES.country_by_alpha2(value)
311    }
312}
313
314impl From<CountryAlpha3> for Country {
315    #[inline]
316    fn from(value: CountryAlpha3) -> Self {
317        COUNTRIES.country_by_alpha3(value)
318    }
319}
320
321impl TryFrom<u16> for Country {
322    type Error = ();
323
324    #[inline]
325    fn try_from(value: u16) -> Result<Self, Self::Error> {
326        COUNTRIES.country_by_numeric(value).ok_or(())
327    }
328}
329
330#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display, FromStr)]
331pub enum CountryAlpha2 {
332    AF = 0,
333    AL = 1,
334    AQ = 2,
335    DZ = 3,
336    AS = 4,
337    AD = 5,
338    AO = 6,
339    AG = 7,
340    AZ = 8,
341    AR = 9,
342    AU = 10,
343    AT = 11,
344    BS = 12,
345    BH = 13,
346    BD = 14,
347    AM = 15,
348    BB = 16,
349    BE = 17,
350    BM = 18,
351    BT = 19,
352    BO = 20,
353    BA = 21,
354    BW = 22,
355    BV = 23,
356    BR = 24,
357    BZ = 25,
358    IO = 26,
359    SB = 27,
360    VG = 28,
361    BN = 29,
362    BG = 30,
363    MM = 31,
364    BI = 32,
365    BY = 33,
366    KH = 34,
367    CM = 35,
368    CA = 36,
369    CV = 37,
370    KY = 38,
371    CF = 39,
372    LK = 40,
373    TD = 41,
374    CL = 42,
375    CN = 43,
376    TW = 44,
377    CX = 45,
378    CC = 46,
379    CO = 47,
380    KM = 48,
381    YT = 49,
382    CG = 50,
383    CD = 51,
384    CK = 52,
385    CR = 53,
386    HR = 54,
387    CU = 55,
388    CY = 56,
389    CZ = 57,
390    BJ = 58,
391    DK = 59,
392    DM = 60,
393    DO = 61,
394    EC = 62,
395    SV = 63,
396    GQ = 64,
397    ER = 65,
398    ET = 66,
399    EE = 67,
400    FO = 68,
401    FK = 69,
402    GS = 70,
403    FJ = 71,
404    FI = 72,
405    AX = 73,
406    FR = 74,
407    GF = 75,
408    PF = 76,
409    TF = 77,
410    DJ = 78,
411    GA = 79,
412    GE = 80,
413    GM = 81,
414    PS = 82,
415    DE = 83,
416    GH = 84,
417    GI = 85,
418    KI = 86,
419    GR = 87,
420    GL = 88,
421    GD = 89,
422    GP = 90,
423    GU = 91,
424    GT = 92,
425    GN = 93,
426    GY = 94,
427    HT = 95,
428    HM = 96,
429    VA = 97,
430    HN = 98,
431    HK = 99,
432    HU = 100,
433    IS = 101,
434    IN = 102,
435    ID = 103,
436    IR = 104,
437    IQ = 105,
438    IE = 106,
439    IL = 107,
440    IT = 108,
441    CI = 109,
442    JM = 110,
443    JP = 111,
444    KZ = 112,
445    JO = 113,
446    KE = 114,
447    KP = 115,
448    KR = 116,
449    KW = 117,
450    KG = 118,
451    LA = 119,
452    LB = 120,
453    LS = 121,
454    LV = 122,
455    LR = 123,
456    LY = 124,
457    LI = 125,
458    LT = 126,
459    LU = 127,
460    MO = 128,
461    MG = 129,
462    MW = 130,
463    MY = 131,
464    MV = 132,
465    ML = 133,
466    MT = 134,
467    MQ = 135,
468    MR = 136,
469    MU = 137,
470    MX = 138,
471    MC = 139,
472    MN = 140,
473    MD = 141,
474    ME = 142,
475    MS = 143,
476    MA = 144,
477    MZ = 145,
478    OM = 146,
479    NA = 147,
480    NR = 148,
481    NP = 149,
482    NL = 150,
483    CW = 151,
484    AW = 152,
485    SX = 153,
486    BQ = 154,
487    NC = 155,
488    VU = 156,
489    NZ = 157,
490    NI = 158,
491    NE = 159,
492    NG = 160,
493    NU = 161,
494    NF = 162,
495    NO = 163,
496    MP = 164,
497    UM = 165,
498    FM = 166,
499    MH = 167,
500    PW = 168,
501    PK = 169,
502    PA = 170,
503    PG = 171,
504    PY = 172,
505    PE = 173,
506    PH = 174,
507    PN = 175,
508    PL = 176,
509    PT = 177,
510    GW = 178,
511    TL = 179,
512    PR = 180,
513    QA = 181,
514    RE = 182,
515    RO = 183,
516    RU = 184,
517    RW = 185,
518    BL = 186,
519    SH = 187,
520    KN = 188,
521    LC = 189,
522    AI = 190,
523    MF = 191,
524    PM = 192,
525    VC = 193,
526    SM = 194,
527    ST = 195,
528    SA = 196,
529    SN = 197,
530    RS = 198,
531    SC = 199,
532    SL = 200,
533    SG = 201,
534    SK = 202,
535    VN = 203,
536    SI = 204,
537    SO = 205,
538    ZA = 206,
539    ZW = 207,
540    ES = 208,
541    SS = 209,
542    SD = 210,
543    EH = 211,
544    SR = 212,
545    SJ = 213,
546    SZ = 214,
547    SE = 215,
548    CH = 216,
549    SY = 217,
550    TJ = 218,
551    TH = 219,
552    TG = 220,
553    TK = 221,
554    TO = 222,
555    AE = 223,
556    TN = 224,
557    TT = 225,
558    TR = 226,
559    TM = 227,
560    TC = 228,
561    TV = 229,
562    UG = 230,
563    UA = 231,
564    MK = 232,
565    EG = 233,
566    GB = 234,
567    GG = 235,
568    JE = 236,
569    IM = 237,
570    TZ = 238,
571    US = 239,
572    VI = 240,
573    BF = 241,
574    UY = 242,
575    UZ = 243,
576    VE = 244,
577    WF = 245,
578    WS = 246,
579    YE = 247,
580    ZM = 248,
581}
582
583impl CountryAlpha2 {
584    #[inline]
585    pub(crate) const fn internal_offset(&self) -> usize {
586        *self as usize
587    }
588}
589
590impl From<CountryAlpha3> for CountryAlpha2 {
591    #[inline]
592    fn from(value: CountryAlpha3) -> Self {
593        COUNTRIES.country_by_alpha3(value).alpha2()
594    }
595}
596
597impl From<CountryAlpha2> for u16 {
598    #[inline]
599    fn from(value: CountryAlpha2) -> Self {
600        COUNTRIES.country_by_alpha2(value).numeric()
601    }
602}
603
604impl TryFrom<u16> for CountryAlpha2 {
605    type Error = ();
606
607    #[inline]
608    fn try_from(value: u16) -> Result<Self, Self::Error> {
609        COUNTRIES.country_by_numeric(value)
610        .map(|country| country.alpha2())
611        .ok_or(())
612    }
613}
614
615#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display, FromStr)]
616pub enum CountryAlpha3 {
617    AFG = 0,
618    ALB = 1,
619    ATA = 2,
620    DZA = 3,
621    ASM = 4,
622    AND = 5,
623    AGO = 6,
624    ATG = 7,
625    AZE = 8,
626    ARG = 9,
627    AUS = 10,
628    AUT = 11,
629    BHS = 12,
630    BHR = 13,
631    BGD = 14,
632    ARM = 15,
633    BRB = 16,
634    BEL = 17,
635    BMU = 18,
636    BTN = 19,
637    BOL = 20,
638    BIH = 21,
639    BWA = 22,
640    BVT = 23,
641    BRA = 24,
642    BLZ = 25,
643    IOT = 26,
644    SLB = 27,
645    VGB = 28,
646    BRN = 29,
647    BGR = 30,
648    MMR = 31,
649    BDI = 32,
650    BLR = 33,
651    KHM = 34,
652    CMR = 35,
653    CAN = 36,
654    CPV = 37,
655    CYM = 38,
656    CAF = 39,
657    LKA = 40,
658    TCD = 41,
659    CHL = 42,
660    CHN = 43,
661    TWN = 44,
662    CXR = 45,
663    CCK = 46,
664    COL = 47,
665    COM = 48,
666    MYT = 49,
667    COG = 50,
668    COD = 51,
669    COK = 52,
670    CRI = 53,
671    HRV = 54,
672    CUB = 55,
673    CYP = 56,
674    CZE = 57,
675    BEN = 58,
676    DNK = 59,
677    DMA = 60,
678    DOM = 61,
679    ECU = 62,
680    SLV = 63,
681    GNQ = 64,
682    ERI = 65,
683    ETH = 66,
684    EST = 67,
685    FRO = 68,
686    FLK = 69,
687    SGS = 70,
688    FJI = 71,
689    FIN = 72,
690    ALA = 73,
691    FRA = 74,
692    GUF = 75,
693    PYF = 76,
694    ATF = 77,
695    DJI = 78,
696    GAB = 79,
697    GEO = 80,
698    GMB = 81,
699    PSE = 82,
700    DEU = 83,
701    GHA = 84,
702    GIB = 85,
703    KIR = 86,
704    GRC = 87,
705    GRL = 88,
706    GRD = 89,
707    GLP = 90,
708    GUM = 91,
709    GTM = 92,
710    GIN = 93,
711    GUY = 94,
712    HTI = 95,
713    HMD = 96,
714    VAT = 97,
715    HND = 98,
716    HKG = 99,
717    HUN = 100,
718    ISL = 101,
719    IND = 102,
720    IDN = 103,
721    IRN = 104,
722    IRQ = 105,
723    IRL = 106,
724    ISR = 107,
725    ITA = 108,
726    CIV = 109,
727    JAM = 110,
728    JPN = 111,
729    KAZ = 112,
730    JOR = 113,
731    KEN = 114,
732    PRK = 115,
733    KOR = 116,
734    KWT = 117,
735    KGZ = 118,
736    LAO = 119,
737    LBN = 120,
738    LSO = 121,
739    LVA = 122,
740    LBR = 123,
741    LBY = 124,
742    LIE = 125,
743    LTU = 126,
744    LUX = 127,
745    MAC = 128,
746    MDG = 129,
747    MWI = 130,
748    MYS = 131,
749    MDV = 132,
750    MLI = 133,
751    MLT = 134,
752    MTQ = 135,
753    MRT = 136,
754    MUS = 137,
755    MEX = 138,
756    MCO = 139,
757    MNG = 140,
758    MDA = 141,
759    MNE = 142,
760    MSR = 143,
761    MAR = 144,
762    MOZ = 145,
763    OMN = 146,
764    NAM = 147,
765    NRU = 148,
766    NPL = 149,
767    NLD = 150,
768    CUW = 151,
769    ABW = 152,
770    SXM = 153,
771    BES = 154,
772    NCL = 155,
773    VUT = 156,
774    NZL = 157,
775    NIC = 158,
776    NER = 159,
777    NGA = 160,
778    NIU = 161,
779    NFK = 162,
780    NOR = 163,
781    MNP = 164,
782    UMI = 165,
783    FSM = 166,
784    MHL = 167,
785    PLW = 168,
786    PAK = 169,
787    PAN = 170,
788    PNG = 171,
789    PRY = 172,
790    PER = 173,
791    PHL = 174,
792    PCN = 175,
793    POL = 176,
794    PRT = 177,
795    GNB = 178,
796    TLS = 179,
797    PRI = 180,
798    QAT = 181,
799    REU = 182,
800    ROU = 183,
801    RUS = 184,
802    RWA = 185,
803    BLM = 186,
804    SHN = 187,
805    KNA = 188,
806    LCA = 189,
807    AIA = 190,
808    MAF = 191,
809    SPM = 192,
810    VCT = 193,
811    SMR = 194,
812    STP = 195,
813    SAU = 196,
814    SEN = 197,
815    SRB = 198,
816    SYC = 199,
817    SLE = 200,
818    SGP = 201,
819    SVK = 202,
820    VNM = 203,
821    SVN = 204,
822    SOM = 205,
823    ZAF = 206,
824    ZWE = 207,
825    ESP = 208,
826    SSD = 209,
827    SDN = 210,
828    ESH = 211,
829    SUR = 212,
830    SJM = 213,
831    SWZ = 214,
832    SWE = 215,
833    CHE = 216,
834    SYR = 217,
835    TJK = 218,
836    THA = 219,
837    TGO = 220,
838    TKL = 221,
839    TON = 222,
840    ARE = 223,
841    TUN = 224,
842    TTO = 225,
843    TUR = 226,
844    TKM = 227,
845    TCA = 228,
846    TUV = 229,
847    UGA = 230,
848    UKR = 231,
849    MKD = 232,
850    EGY = 233,
851    GBR = 234,
852    GGY = 235,
853    JEY = 236,
854    IMN = 237,
855    TZA = 238,
856    USA = 239,
857    VIR = 240,
858    BFA = 241,
859    URY = 242,
860    UZB = 243,
861    VEN = 244,
862    WLF = 245,
863    WSM = 246,
864    YEM = 247,
865    ZMB = 248,
866}
867
868impl CountryAlpha3 {
869    #[inline]
870    pub(crate) const fn internal_offset(&self) -> usize {
871        *self as usize
872    }
873}
874
875impl From<CountryAlpha2> for CountryAlpha3 {
876    #[inline]
877    fn from(value: CountryAlpha2) -> Self {
878        COUNTRIES.country_by_alpha2(value).alpha3()
879    }
880}
881
882impl From<CountryAlpha3> for u16 {
883    #[inline]
884    fn from(value: CountryAlpha3) -> Self {
885        COUNTRIES.country_by_alpha3(value).numeric()
886    }
887}
888
889impl TryFrom<u16> for CountryAlpha3 {
890    type Error = ();
891
892    #[inline]
893    fn try_from(value: u16) -> Result<Self, Self::Error> {
894        COUNTRIES.country_by_numeric(value)
895        .map(|country| country.alpha3())
896        .ok_or(())
897    }
898}
899
900#[cfg(test)]
901mod test {
902    use super::*;
903
904    extern crate alloc;
905    use alloc::string::ToString;
906
907    use core::str::FromStr;
908
909    #[test]
910    fn test_alpha2_from_alpha3() {
911        let alpha3 = CountryAlpha3::AND;
912        let alpha2 = CountryAlpha2::from(alpha3);
913        assert_eq!(alpha2, CountryAlpha2::AD);
914    }
915
916    #[test]
917    fn test_alpha2_from_numeric() {
918        let alpha2 = CountryAlpha2::AD;
919        let numeric = Country::from(alpha2).numeric();
920        let alpha2_from_numeric = CountryAlpha2::try_from(numeric).unwrap();
921        assert_eq!(alpha2, alpha2_from_numeric);
922    }
923
924    #[test]
925    fn test_alpha3_from_alpha2() {
926        let alpha2 = CountryAlpha2::AD;
927        let alpha3 = CountryAlpha3::from(alpha2);
928        assert_eq!(alpha3, CountryAlpha3::AND);
929    }
930
931    #[test]
932    fn test_alpha3_from_numeric() {
933        let alpha3 = CountryAlpha3::AND;
934        let numeric = Country::from(alpha3).numeric();
935        let alpha3_from_numeric = CountryAlpha3::try_from(numeric).unwrap();
936        assert_eq!(alpha3, alpha3_from_numeric);
937    }
938
939    #[test]
940    fn test_numeric_from_alpha2() {
941        let alpha2 = CountryAlpha2::AD;
942        let numeric = u16::from(alpha2);
943        assert_eq!(numeric, 020);
944    }
945
946    #[test]
947    fn test_numeric_from_alpha3() {
948        let alpha3 = CountryAlpha3::AND;
949        let numeric = u16::from(alpha3);
950        assert_eq!(numeric, 020);
951    }
952
953    #[test]
954    fn test_country_from_alpha2() {
955        let alpha2 = CountryAlpha2::AD;
956        let country = Country::from(alpha2);
957        assert_eq!(country.alpha2(), alpha2);
958    }
959
960    #[test]
961    fn test_country_from_alpha3() {
962        let alpha3 = CountryAlpha3::AND;
963        let country = Country::from(alpha3);
964        assert_eq!(country.alpha3(), alpha3);
965    }
966
967    #[test]
968    fn test_country_from_numeric() {
969        let numeric = 020;
970        let country = Country::try_from(numeric).unwrap();
971        assert_eq!(country.numeric(), numeric);
972    }
973
974    #[test]
975    fn test_alpha2_from_str() {
976        let alpha2 = CountryAlpha2::AD;
977        let alpha2_from_str = CountryAlpha2::from_str("AD").unwrap();
978        assert_eq!(alpha2, alpha2_from_str);
979    }
980
981    #[test]
982    fn test_alpha3_from_str() {
983        let alpha3 = CountryAlpha3::AND;
984        let alpha3_from_str = CountryAlpha3::from_str("AND").unwrap();
985        assert_eq!(alpha3, alpha3_from_str);
986    }
987
988    #[test]
989    fn test_alpha2_to_string() {
990        let alpha2 = CountryAlpha2::AD;
991        let alpha2_string = alpha2.to_string();
992        assert_eq!(alpha2_string, "AD");
993    }
994
995    #[test]
996    fn test_alpha3_to_string() {
997        let alpha3 = CountryAlpha3::AND;
998        let alpha3_string = alpha3.to_string();
999        assert_eq!(alpha3_string, "AND");
1000    }
1001}