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
50static 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}