Skip to main content

isocountry/
lib.rs

1// MIT License
2//
3//Copyright (c) 2018 Brett Russell
4//
5//Permission is hereby granted, free of charge, to any person obtaining a copy
6//of this software and associated documentation files (the "Software"), to deal
7//in the Software without restriction, including without limitation the rights
8//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9//copies of the Software, and to permit persons to whom the Software is
10//furnished to do so, subject to the following conditions:
11//
12//The above copyright notice and this permission notice shall be included in all
13//copies or substantial portions of the Software.
14//
15//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21//SOFTWARE.
22
23
24use std::fmt::{self, Display};
25use serde::{Serialize, Serializer, Deserialize, Deserializer};
26use serde::de::{self, Visitor};
27use thiserror::Error;
28
29/// Two-character uppercase ISO 3166-1 strings for each country
30pub mod alpha2;
31/// Three-character uppercase ISO 3166-1 strings for each country
32pub mod alpha3;
33/// English short name ISO 3166-1 strings for each country
34pub mod full;
35/// Unsigned ISO 3166-1 integer IDs for each country
36pub mod numeric;
37
38mod sorted_arrays;
39
40#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
41/// An enumeration of all ISO-3166-1 country codes
42pub enum CountryCode {
43    /// Afghanistan
44    AFG,
45    /// Åland Islands
46    ALA,
47    /// Albania
48    ALB,
49    /// Algeria
50    DZA,
51    /// American Samoa
52    ASM,
53    /// Andorra
54    AND,
55    /// Angola
56    AGO,
57    /// Anguilla
58    AIA,
59    /// Antarctica
60    ATA,
61    /// Antigua and Barbuda
62    ATG,
63    /// Argentina
64    ARG,
65    /// Armenia
66    ARM,
67    /// Aruba
68    ABW,
69    /// Australia
70    AUS,
71    /// Austria
72    AUT,
73    /// Azerbaijan
74    AZE,
75    /// Bahamas
76    BHS,
77    /// Bahrain
78    BHR,
79    /// Bangladesh
80    BGD,
81    /// Barbados
82    BRB,
83    /// Belarus
84    BLR,
85    /// Belgium
86    BEL,
87    /// Belize
88    BLZ,
89    /// Benin
90    BEN,
91    /// Bermuda
92    BMU,
93    /// Bhutan
94    BTN,
95    /// Bolivia (Plurinational State of)
96    BOL,
97    /// Bonaire, Sint Eustatius and Saba
98    BES,
99    /// Bosnia and Herzegovina
100    BIH,
101    /// Botswana
102    BWA,
103    /// Bouvet Island
104    BVT,
105    /// Brazil
106    BRA,
107    /// British Indian Ocean Territory
108    IOT,
109    /// Brunei Darussalam
110    BRN,
111    /// Bulgaria
112    BGR,
113    /// Burkina Faso
114    BFA,
115    /// Burundi
116    BDI,
117    /// Cabo Verde
118    CPV,
119    /// Cambodia
120    KHM,
121    /// Cameroon
122    CMR,
123    /// Canada
124    CAN,
125    /// Cayman Islands
126    CYM,
127    /// Central African Republic
128    CAF,
129    /// Chad
130    TCD,
131    /// Chile
132    CHL,
133    /// China
134    CHN,
135    /// Christmas Island
136    CXR,
137    /// Cocos (Keeling) Islands
138    CCK,
139    /// Colombia
140    COL,
141    /// Comoros
142    COM,
143    /// Congo
144    COG,
145    /// Congo (Democratic Republic of the)
146    COD,
147    /// Cook Islands
148    COK,
149    /// Costa Rica
150    CRI,
151    /// Côte d'Ivoire
152    CIV,
153    /// Croatia
154    HRV,
155    /// Cuba
156    CUB,
157    /// Curaçao
158    CUW,
159    /// Cyprus
160    CYP,
161    /// Czechia
162    CZE,
163    /// Denmark
164    DNK,
165    /// Djibouti
166    DJI,
167    /// Dominica
168    DMA,
169    /// Dominican Republic
170    DOM,
171    /// Ecuador
172    ECU,
173    /// Egypt
174    EGY,
175    /// El Salvador
176    SLV,
177    /// Equatorial Guinea
178    GNQ,
179    /// Eritrea
180    ERI,
181    /// Estonia
182    EST,
183    /// Ethiopia
184    ETH,
185    /// Falkland Islands (Malvinas)
186    FLK,
187    /// Faroe Islands
188    FRO,
189    /// Fiji
190    FJI,
191    /// Finland
192    FIN,
193    /// France
194    FRA,
195    /// French Guiana
196    GUF,
197    /// French Polynesia
198    PYF,
199    /// French Southern Territories
200    ATF,
201    /// Gabon
202    GAB,
203    /// Gambia
204    GMB,
205    /// Georgia
206    GEO,
207    /// Germany
208    DEU,
209    /// Ghana
210    GHA,
211    /// Gibraltar
212    GIB,
213    /// Greece
214    GRC,
215    /// Greenland
216    GRL,
217    /// Grenada
218    GRD,
219    /// Guadeloupe
220    GLP,
221    /// Guam
222    GUM,
223    /// Guatemala
224    GTM,
225    /// Guernsey
226    GGY,
227    /// Guinea
228    GIN,
229    /// Guinea-Bissau
230    GNB,
231    /// Guyana
232    GUY,
233    /// Haiti
234    HTI,
235    /// Heard Island and McDonald Islands
236    HMD,
237    /// Holy See
238    VAT,
239    /// Honduras
240    HND,
241    /// Hong Kong
242    HKG,
243    /// Hungary
244    HUN,
245    /// Iceland
246    ISL,
247    /// India
248    IND,
249    /// Indonesia
250    IDN,
251    /// Iran (Islamic Republic of)
252    IRN,
253    /// Iraq
254    IRQ,
255    /// Ireland
256    IRL,
257    /// Isle of Man
258    IMN,
259    /// Israel
260    ISR,
261    /// Italy
262    ITA,
263    /// Jamaica
264    JAM,
265    /// Japan
266    JPN,
267    /// Jersey
268    JEY,
269    /// Jordan
270    JOR,
271    /// Kazakhstan
272    KAZ,
273    /// Kenya
274    KEN,
275    /// Kiribati
276    KIR,
277    /// Korea (Democratic People's Republic of)
278    PRK,
279    /// Korea (Republic of)
280    KOR,
281    /// Kuwait
282    KWT,
283    /// Kyrgyzstan
284    KGZ,
285    /// Lao People's Democratic Republic
286    LAO,
287    /// Latvia
288    LVA,
289    /// Lebanon
290    LBN,
291    /// Lesotho
292    LSO,
293    /// Liberia
294    LBR,
295    /// Libya
296    LBY,
297    /// Liechtenstein
298    LIE,
299    /// Lithuania
300    LTU,
301    /// Luxembourg
302    LUX,
303    /// Macao
304    MAC,
305    /// Macedonia (the former Yugoslav Republic of)
306    MKD,
307    /// Madagascar
308    MDG,
309    /// Malawi
310    MWI,
311    /// Malaysia
312    MYS,
313    /// Maldives
314    MDV,
315    /// Mali
316    MLI,
317    /// Malta
318    MLT,
319    /// Marshall Islands
320    MHL,
321    /// Martinique
322    MTQ,
323    /// Mauritania
324    MRT,
325    /// Mauritius
326    MUS,
327    /// Mayotte
328    MYT,
329    /// Mexico
330    MEX,
331    /// Micronesia (Federated States of)
332    FSM,
333    /// Moldova (Republic of)
334    MDA,
335    /// Monaco
336    MCO,
337    /// Mongolia
338    MNG,
339    /// Montenegro
340    MNE,
341    /// Montserrat
342    MSR,
343    /// Morocco
344    MAR,
345    /// Mozambique
346    MOZ,
347    /// Myanmar
348    MMR,
349    /// Namibia
350    NAM,
351    /// Nauru
352    NRU,
353    /// Nepal
354    NPL,
355    /// Netherlands
356    NLD,
357    /// New Caledonia
358    NCL,
359    /// New Zealand
360    NZL,
361    /// Nicaragua
362    NIC,
363    /// Niger
364    NER,
365    /// Nigeria
366    NGA,
367    /// Niue
368    NIU,
369    /// Norfolk Island
370    NFK,
371    /// Northern Mariana Islands
372    MNP,
373    /// Norway
374    NOR,
375    /// Oman
376    OMN,
377    /// Pakistan
378    PAK,
379    /// Palau
380    PLW,
381    /// Palestine, State of
382    PSE,
383    /// Panama
384    PAN,
385    /// Papua New Guinea
386    PNG,
387    /// Paraguay
388    PRY,
389    /// Peru
390    PER,
391    /// Philippines
392    PHL,
393    /// Pitcairn
394    PCN,
395    /// Poland
396    POL,
397    /// Portugal
398    PRT,
399    /// Puerto Rico
400    PRI,
401    /// Qatar
402    QAT,
403    /// Réunion
404    REU,
405    /// Romania
406    ROU,
407    /// Russian Federation
408    RUS,
409    /// Rwanda
410    RWA,
411    /// Saint Barthélemy
412    BLM,
413    /// Saint Helena, Ascension and Tristan da Cunha
414    SHN,
415    /// Saint Kitts and Nevis
416    KNA,
417    /// Saint Lucia
418    LCA,
419    /// Saint Martin (French part)
420    MAF,
421    /// Saint Pierre and Miquelon
422    SPM,
423    /// Saint Vincent and the Grenadines
424    VCT,
425    /// Samoa
426    WSM,
427    /// San Marino
428    SMR,
429    /// Sao Tome and Principe
430    STP,
431    /// Saudi Arabia
432    SAU,
433    /// Senegal
434    SEN,
435    /// Serbia
436    SRB,
437    /// Seychelles
438    SYC,
439    /// Sierra Leone
440    SLE,
441    /// Singapore
442    SGP,
443    /// Sint Maarten (Dutch part)
444    SXM,
445    /// Slovakia
446    SVK,
447    /// Slovenia
448    SVN,
449    /// Solomon Islands
450    SLB,
451    /// Somalia
452    SOM,
453    /// South Africa
454    ZAF,
455    /// South Georgia and the South Sandwich Islands
456    SGS,
457    /// South Sudan
458    SSD,
459    /// Spain
460    ESP,
461    /// Sri Lanka
462    LKA,
463    /// Sudan
464    SDN,
465    /// Suriname
466    SUR,
467    /// Svalbard and Jan Mayen
468    SJM,
469    /// Swaziland
470    SWZ,
471    /// Sweden
472    SWE,
473    /// Switzerland
474    CHE,
475    /// Syrian Arab Republic
476    SYR,
477    /// Taiwan, Province of China
478    TWN,
479    /// Tajikistan
480    TJK,
481    /// Tanzania, United Republic of
482    TZA,
483    /// Thailand
484    THA,
485    /// Timor-Leste
486    TLS,
487    /// Togo
488    TGO,
489    /// Tokelau
490    TKL,
491    /// Tonga
492    TON,
493    /// Trinidad and Tobago
494    TTO,
495    /// Tunisia
496    TUN,
497    /// Turkey
498    TUR,
499    /// Turkmenistan
500    TKM,
501    /// Turks and Caicos Islands
502    TCA,
503    /// Tuvalu
504    TUV,
505    /// Uganda
506    UGA,
507    /// Ukraine
508    UKR,
509    /// United Arab Emirates
510    ARE,
511    /// United Kingdom of Great Britain and Northern Ireland
512    GBR,
513    /// United States of America
514    USA,
515    /// United States Minor Outlying Islands
516    UMI,
517    /// Uruguay
518    URY,
519    /// Uzbekistan
520    UZB,
521    /// Vanuatu
522    VUT,
523    /// Venezuela (Bolivarian Republic of)
524    VEN,
525    /// Viet Nam
526    VNM,
527    /// Virgin Islands (British)
528    VGB,
529    /// Virgin Islands (U.S.)
530    VIR,
531    /// Wallis and Futuna
532    WLF,
533    /// Western Sahara
534    ESH,
535    /// Yemen
536    YEM,
537    /// Zambia
538    ZMB,
539    /// Zimbabwe
540    ZWE,
541}
542
543/// Errors that might arise when converting raw data into CountryCode
544#[derive(Debug, Error, PartialEq)]
545pub enum CountryCodeParseErr {
546    #[error("invalid alpha-2 country code string: {}", unknown)]
547    InvalidAlpha2 { unknown: String },
548    #[error("invalid alpha-3 country code string: {}", unknown)]
549    InvalidAlpha3 { unknown: String },
550    #[error("invalid ID (integer) country code: {}", unknown)]
551    InvalidID { unknown: u32 },
552}
553
554const NUM_COUNTRY_CODES: usize = 249;
555
556impl CountryCode {
557    /// Returns the ISO 3166-1 English short name
558    pub fn name(&self) -> &'static str {
559        use self::CountryCode::*;
560        use full::*;
561        match *self {
562            AFG => ISO_FULL_AFG,
563            ALA => ISO_FULL_ALA,
564            ALB => ISO_FULL_ALB,
565            DZA => ISO_FULL_DZA,
566            ASM => ISO_FULL_ASM,
567            AND => ISO_FULL_AND,
568            AGO => ISO_FULL_AGO,
569            AIA => ISO_FULL_AIA,
570            ATA => ISO_FULL_ATA,
571            ATG => ISO_FULL_ATG,
572            ARG => ISO_FULL_ARG,
573            ARM => ISO_FULL_ARM,
574            ABW => ISO_FULL_ABW,
575            AUS => ISO_FULL_AUS,
576            AUT => ISO_FULL_AUT,
577            AZE => ISO_FULL_AZE,
578            BHS => ISO_FULL_BHS,
579            BHR => ISO_FULL_BHR,
580            BGD => ISO_FULL_BGD,
581            BRB => ISO_FULL_BRB,
582            BLR => ISO_FULL_BLR,
583            BEL => ISO_FULL_BEL,
584            BLZ => ISO_FULL_BLZ,
585            BEN => ISO_FULL_BEN,
586            BMU => ISO_FULL_BMU,
587            BTN => ISO_FULL_BTN,
588            BOL => ISO_FULL_BOL,
589            BES => ISO_FULL_BES,
590            BIH => ISO_FULL_BIH,
591            BWA => ISO_FULL_BWA,
592            BVT => ISO_FULL_BVT,
593            BRA => ISO_FULL_BRA,
594            IOT => ISO_FULL_IOT,
595            BRN => ISO_FULL_BRN,
596            BGR => ISO_FULL_BGR,
597            BFA => ISO_FULL_BFA,
598            BDI => ISO_FULL_BDI,
599            CPV => ISO_FULL_CPV,
600            KHM => ISO_FULL_KHM,
601            CMR => ISO_FULL_CMR,
602            CAN => ISO_FULL_CAN,
603            CYM => ISO_FULL_CYM,
604            CAF => ISO_FULL_CAF,
605            TCD => ISO_FULL_TCD,
606            CHL => ISO_FULL_CHL,
607            CHN => ISO_FULL_CHN,
608            CXR => ISO_FULL_CXR,
609            CCK => ISO_FULL_CCK,
610            COL => ISO_FULL_COL,
611            COM => ISO_FULL_COM,
612            COG => ISO_FULL_COG,
613            COD => ISO_FULL_COD,
614            COK => ISO_FULL_COK,
615            CRI => ISO_FULL_CRI,
616            CIV => ISO_FULL_CIV,
617            HRV => ISO_FULL_HRV,
618            CUB => ISO_FULL_CUB,
619            CUW => ISO_FULL_CUW,
620            CYP => ISO_FULL_CYP,
621            CZE => ISO_FULL_CZE,
622            DNK => ISO_FULL_DNK,
623            DJI => ISO_FULL_DJI,
624            DMA => ISO_FULL_DMA,
625            DOM => ISO_FULL_DOM,
626            ECU => ISO_FULL_ECU,
627            EGY => ISO_FULL_EGY,
628            SLV => ISO_FULL_SLV,
629            GNQ => ISO_FULL_GNQ,
630            ERI => ISO_FULL_ERI,
631            EST => ISO_FULL_EST,
632            ETH => ISO_FULL_ETH,
633            FLK => ISO_FULL_FLK,
634            FRO => ISO_FULL_FRO,
635            FJI => ISO_FULL_FJI,
636            FIN => ISO_FULL_FIN,
637            FRA => ISO_FULL_FRA,
638            GUF => ISO_FULL_GUF,
639            PYF => ISO_FULL_PYF,
640            ATF => ISO_FULL_ATF,
641            GAB => ISO_FULL_GAB,
642            GMB => ISO_FULL_GMB,
643            GEO => ISO_FULL_GEO,
644            DEU => ISO_FULL_DEU,
645            GHA => ISO_FULL_GHA,
646            GIB => ISO_FULL_GIB,
647            GRC => ISO_FULL_GRC,
648            GRL => ISO_FULL_GRL,
649            GRD => ISO_FULL_GRD,
650            GLP => ISO_FULL_GLP,
651            GUM => ISO_FULL_GUM,
652            GTM => ISO_FULL_GTM,
653            GGY => ISO_FULL_GGY,
654            GIN => ISO_FULL_GIN,
655            GNB => ISO_FULL_GNB,
656            GUY => ISO_FULL_GUY,
657            HTI => ISO_FULL_HTI,
658            HMD => ISO_FULL_HMD,
659            VAT => ISO_FULL_VAT,
660            HND => ISO_FULL_HND,
661            HKG => ISO_FULL_HKG,
662            HUN => ISO_FULL_HUN,
663            ISL => ISO_FULL_ISL,
664            IND => ISO_FULL_IND,
665            IDN => ISO_FULL_IDN,
666            IRN => ISO_FULL_IRN,
667            IRQ => ISO_FULL_IRQ,
668            IRL => ISO_FULL_IRL,
669            IMN => ISO_FULL_IMN,
670            ISR => ISO_FULL_ISR,
671            ITA => ISO_FULL_ITA,
672            JAM => ISO_FULL_JAM,
673            JPN => ISO_FULL_JPN,
674            JEY => ISO_FULL_JEY,
675            JOR => ISO_FULL_JOR,
676            KAZ => ISO_FULL_KAZ,
677            KEN => ISO_FULL_KEN,
678            KIR => ISO_FULL_KIR,
679            PRK => ISO_FULL_PRK,
680            KOR => ISO_FULL_KOR,
681            KWT => ISO_FULL_KWT,
682            KGZ => ISO_FULL_KGZ,
683            LAO => ISO_FULL_LAO,
684            LVA => ISO_FULL_LVA,
685            LBN => ISO_FULL_LBN,
686            LSO => ISO_FULL_LSO,
687            LBR => ISO_FULL_LBR,
688            LBY => ISO_FULL_LBY,
689            LIE => ISO_FULL_LIE,
690            LTU => ISO_FULL_LTU,
691            LUX => ISO_FULL_LUX,
692            MAC => ISO_FULL_MAC,
693            MKD => ISO_FULL_MKD,
694            MDG => ISO_FULL_MDG,
695            MWI => ISO_FULL_MWI,
696            MYS => ISO_FULL_MYS,
697            MDV => ISO_FULL_MDV,
698            MLI => ISO_FULL_MLI,
699            MLT => ISO_FULL_MLT,
700            MHL => ISO_FULL_MHL,
701            MTQ => ISO_FULL_MTQ,
702            MRT => ISO_FULL_MRT,
703            MUS => ISO_FULL_MUS,
704            MYT => ISO_FULL_MYT,
705            MEX => ISO_FULL_MEX,
706            FSM => ISO_FULL_FSM,
707            MDA => ISO_FULL_MDA,
708            MCO => ISO_FULL_MCO,
709            MNG => ISO_FULL_MNG,
710            MNE => ISO_FULL_MNE,
711            MSR => ISO_FULL_MSR,
712            MAR => ISO_FULL_MAR,
713            MOZ => ISO_FULL_MOZ,
714            MMR => ISO_FULL_MMR,
715            NAM => ISO_FULL_NAM,
716            NRU => ISO_FULL_NRU,
717            NPL => ISO_FULL_NPL,
718            NLD => ISO_FULL_NLD,
719            NCL => ISO_FULL_NCL,
720            NZL => ISO_FULL_NZL,
721            NIC => ISO_FULL_NIC,
722            NER => ISO_FULL_NER,
723            NGA => ISO_FULL_NGA,
724            NIU => ISO_FULL_NIU,
725            NFK => ISO_FULL_NFK,
726            MNP => ISO_FULL_MNP,
727            NOR => ISO_FULL_NOR,
728            OMN => ISO_FULL_OMN,
729            PAK => ISO_FULL_PAK,
730            PLW => ISO_FULL_PLW,
731            PSE => ISO_FULL_PSE,
732            PAN => ISO_FULL_PAN,
733            PNG => ISO_FULL_PNG,
734            PRY => ISO_FULL_PRY,
735            PER => ISO_FULL_PER,
736            PHL => ISO_FULL_PHL,
737            PCN => ISO_FULL_PCN,
738            POL => ISO_FULL_POL,
739            PRT => ISO_FULL_PRT,
740            PRI => ISO_FULL_PRI,
741            QAT => ISO_FULL_QAT,
742            REU => ISO_FULL_REU,
743            ROU => ISO_FULL_ROU,
744            RUS => ISO_FULL_RUS,
745            RWA => ISO_FULL_RWA,
746            BLM => ISO_FULL_BLM,
747            SHN => ISO_FULL_SHN,
748            KNA => ISO_FULL_KNA,
749            LCA => ISO_FULL_LCA,
750            MAF => ISO_FULL_MAF,
751            SPM => ISO_FULL_SPM,
752            VCT => ISO_FULL_VCT,
753            WSM => ISO_FULL_WSM,
754            SMR => ISO_FULL_SMR,
755            STP => ISO_FULL_STP,
756            SAU => ISO_FULL_SAU,
757            SEN => ISO_FULL_SEN,
758            SRB => ISO_FULL_SRB,
759            SYC => ISO_FULL_SYC,
760            SLE => ISO_FULL_SLE,
761            SGP => ISO_FULL_SGP,
762            SXM => ISO_FULL_SXM,
763            SVK => ISO_FULL_SVK,
764            SVN => ISO_FULL_SVN,
765            SLB => ISO_FULL_SLB,
766            SOM => ISO_FULL_SOM,
767            ZAF => ISO_FULL_ZAF,
768            SGS => ISO_FULL_SGS,
769            SSD => ISO_FULL_SSD,
770            ESP => ISO_FULL_ESP,
771            LKA => ISO_FULL_LKA,
772            SDN => ISO_FULL_SDN,
773            SUR => ISO_FULL_SUR,
774            SJM => ISO_FULL_SJM,
775            SWZ => ISO_FULL_SWZ,
776            SWE => ISO_FULL_SWE,
777            CHE => ISO_FULL_CHE,
778            SYR => ISO_FULL_SYR,
779            TWN => ISO_FULL_TWN,
780            TJK => ISO_FULL_TJK,
781            TZA => ISO_FULL_TZA,
782            THA => ISO_FULL_THA,
783            TLS => ISO_FULL_TLS,
784            TGO => ISO_FULL_TGO,
785            TKL => ISO_FULL_TKL,
786            TON => ISO_FULL_TON,
787            TTO => ISO_FULL_TTO,
788            TUN => ISO_FULL_TUN,
789            TUR => ISO_FULL_TUR,
790            TKM => ISO_FULL_TKM,
791            TCA => ISO_FULL_TCA,
792            TUV => ISO_FULL_TUV,
793            UGA => ISO_FULL_UGA,
794            UKR => ISO_FULL_UKR,
795            ARE => ISO_FULL_ARE,
796            GBR => ISO_FULL_GBR,
797            USA => ISO_FULL_USA,
798            UMI => ISO_FULL_UMI,
799            URY => ISO_FULL_URY,
800            UZB => ISO_FULL_UZB,
801            VUT => ISO_FULL_VUT,
802            VEN => ISO_FULL_VEN,
803            VNM => ISO_FULL_VNM,
804            VGB => ISO_FULL_VGB,
805            VIR => ISO_FULL_VIR,
806            WLF => ISO_FULL_WLF,
807            ESH => ISO_FULL_ESH,
808            YEM => ISO_FULL_YEM,
809            ZMB => ISO_FULL_ZMB,
810            ZWE => ISO_FULL_ZWE,
811        }
812    }
813
814    /// Returns the ISO 3166-1 numeric ID
815    pub fn numeric_id(&self) -> u32 {
816        use self::CountryCode::*;
817        use numeric::*;
818        match *self {
819            AFG => ISO_NUM_AFG,
820            ALA => ISO_NUM_ALA,
821            ALB => ISO_NUM_ALB,
822            DZA => ISO_NUM_DZA,
823            ASM => ISO_NUM_ASM,
824            AND => ISO_NUM_AND,
825            AGO => ISO_NUM_AGO,
826            AIA => ISO_NUM_AIA,
827            ATA => ISO_NUM_ATA,
828            ATG => ISO_NUM_ATG,
829            ARG => ISO_NUM_ARG,
830            ARM => ISO_NUM_ARM,
831            ABW => ISO_NUM_ABW,
832            AUS => ISO_NUM_AUS,
833            AUT => ISO_NUM_AUT,
834            AZE => ISO_NUM_AZE,
835            BHS => ISO_NUM_BHS,
836            BHR => ISO_NUM_BHR,
837            BGD => ISO_NUM_BGD,
838            BRB => ISO_NUM_BRB,
839            BLR => ISO_NUM_BLR,
840            BEL => ISO_NUM_BEL,
841            BLZ => ISO_NUM_BLZ,
842            BEN => ISO_NUM_BEN,
843            BMU => ISO_NUM_BMU,
844            BTN => ISO_NUM_BTN,
845            BOL => ISO_NUM_BOL,
846            BES => ISO_NUM_BES,
847            BIH => ISO_NUM_BIH,
848            BWA => ISO_NUM_BWA,
849            BVT => ISO_NUM_BVT,
850            BRA => ISO_NUM_BRA,
851            IOT => ISO_NUM_IOT,
852            BRN => ISO_NUM_BRN,
853            BGR => ISO_NUM_BGR,
854            BFA => ISO_NUM_BFA,
855            BDI => ISO_NUM_BDI,
856            CPV => ISO_NUM_CPV,
857            KHM => ISO_NUM_KHM,
858            CMR => ISO_NUM_CMR,
859            CAN => ISO_NUM_CAN,
860            CYM => ISO_NUM_CYM,
861            CAF => ISO_NUM_CAF,
862            TCD => ISO_NUM_TCD,
863            CHL => ISO_NUM_CHL,
864            CHN => ISO_NUM_CHN,
865            CXR => ISO_NUM_CXR,
866            CCK => ISO_NUM_CCK,
867            COL => ISO_NUM_COL,
868            COM => ISO_NUM_COM,
869            COG => ISO_NUM_COG,
870            COD => ISO_NUM_COD,
871            COK => ISO_NUM_COK,
872            CRI => ISO_NUM_CRI,
873            CIV => ISO_NUM_CIV,
874            HRV => ISO_NUM_HRV,
875            CUB => ISO_NUM_CUB,
876            CUW => ISO_NUM_CUW,
877            CYP => ISO_NUM_CYP,
878            CZE => ISO_NUM_CZE,
879            DNK => ISO_NUM_DNK,
880            DJI => ISO_NUM_DJI,
881            DMA => ISO_NUM_DMA,
882            DOM => ISO_NUM_DOM,
883            ECU => ISO_NUM_ECU,
884            EGY => ISO_NUM_EGY,
885            SLV => ISO_NUM_SLV,
886            GNQ => ISO_NUM_GNQ,
887            ERI => ISO_NUM_ERI,
888            EST => ISO_NUM_EST,
889            ETH => ISO_NUM_ETH,
890            FLK => ISO_NUM_FLK,
891            FRO => ISO_NUM_FRO,
892            FJI => ISO_NUM_FJI,
893            FIN => ISO_NUM_FIN,
894            FRA => ISO_NUM_FRA,
895            GUF => ISO_NUM_GUF,
896            PYF => ISO_NUM_PYF,
897            ATF => ISO_NUM_ATF,
898            GAB => ISO_NUM_GAB,
899            GMB => ISO_NUM_GMB,
900            GEO => ISO_NUM_GEO,
901            DEU => ISO_NUM_DEU,
902            GHA => ISO_NUM_GHA,
903            GIB => ISO_NUM_GIB,
904            GRC => ISO_NUM_GRC,
905            GRL => ISO_NUM_GRL,
906            GRD => ISO_NUM_GRD,
907            GLP => ISO_NUM_GLP,
908            GUM => ISO_NUM_GUM,
909            GTM => ISO_NUM_GTM,
910            GGY => ISO_NUM_GGY,
911            GIN => ISO_NUM_GIN,
912            GNB => ISO_NUM_GNB,
913            GUY => ISO_NUM_GUY,
914            HTI => ISO_NUM_HTI,
915            HMD => ISO_NUM_HMD,
916            VAT => ISO_NUM_VAT,
917            HND => ISO_NUM_HND,
918            HKG => ISO_NUM_HKG,
919            HUN => ISO_NUM_HUN,
920            ISL => ISO_NUM_ISL,
921            IND => ISO_NUM_IND,
922            IDN => ISO_NUM_IDN,
923            IRN => ISO_NUM_IRN,
924            IRQ => ISO_NUM_IRQ,
925            IRL => ISO_NUM_IRL,
926            IMN => ISO_NUM_IMN,
927            ISR => ISO_NUM_ISR,
928            ITA => ISO_NUM_ITA,
929            JAM => ISO_NUM_JAM,
930            JPN => ISO_NUM_JPN,
931            JEY => ISO_NUM_JEY,
932            JOR => ISO_NUM_JOR,
933            KAZ => ISO_NUM_KAZ,
934            KEN => ISO_NUM_KEN,
935            KIR => ISO_NUM_KIR,
936            PRK => ISO_NUM_PRK,
937            KOR => ISO_NUM_KOR,
938            KWT => ISO_NUM_KWT,
939            KGZ => ISO_NUM_KGZ,
940            LAO => ISO_NUM_LAO,
941            LVA => ISO_NUM_LVA,
942            LBN => ISO_NUM_LBN,
943            LSO => ISO_NUM_LSO,
944            LBR => ISO_NUM_LBR,
945            LBY => ISO_NUM_LBY,
946            LIE => ISO_NUM_LIE,
947            LTU => ISO_NUM_LTU,
948            LUX => ISO_NUM_LUX,
949            MAC => ISO_NUM_MAC,
950            MKD => ISO_NUM_MKD,
951            MDG => ISO_NUM_MDG,
952            MWI => ISO_NUM_MWI,
953            MYS => ISO_NUM_MYS,
954            MDV => ISO_NUM_MDV,
955            MLI => ISO_NUM_MLI,
956            MLT => ISO_NUM_MLT,
957            MHL => ISO_NUM_MHL,
958            MTQ => ISO_NUM_MTQ,
959            MRT => ISO_NUM_MRT,
960            MUS => ISO_NUM_MUS,
961            MYT => ISO_NUM_MYT,
962            MEX => ISO_NUM_MEX,
963            FSM => ISO_NUM_FSM,
964            MDA => ISO_NUM_MDA,
965            MCO => ISO_NUM_MCO,
966            MNG => ISO_NUM_MNG,
967            MNE => ISO_NUM_MNE,
968            MSR => ISO_NUM_MSR,
969            MAR => ISO_NUM_MAR,
970            MOZ => ISO_NUM_MOZ,
971            MMR => ISO_NUM_MMR,
972            NAM => ISO_NUM_NAM,
973            NRU => ISO_NUM_NRU,
974            NPL => ISO_NUM_NPL,
975            NLD => ISO_NUM_NLD,
976            NCL => ISO_NUM_NCL,
977            NZL => ISO_NUM_NZL,
978            NIC => ISO_NUM_NIC,
979            NER => ISO_NUM_NER,
980            NGA => ISO_NUM_NGA,
981            NIU => ISO_NUM_NIU,
982            NFK => ISO_NUM_NFK,
983            MNP => ISO_NUM_MNP,
984            NOR => ISO_NUM_NOR,
985            OMN => ISO_NUM_OMN,
986            PAK => ISO_NUM_PAK,
987            PLW => ISO_NUM_PLW,
988            PSE => ISO_NUM_PSE,
989            PAN => ISO_NUM_PAN,
990            PNG => ISO_NUM_PNG,
991            PRY => ISO_NUM_PRY,
992            PER => ISO_NUM_PER,
993            PHL => ISO_NUM_PHL,
994            PCN => ISO_NUM_PCN,
995            POL => ISO_NUM_POL,
996            PRT => ISO_NUM_PRT,
997            PRI => ISO_NUM_PRI,
998            QAT => ISO_NUM_QAT,
999            REU => ISO_NUM_REU,
1000            ROU => ISO_NUM_ROU,
1001            RUS => ISO_NUM_RUS,
1002            RWA => ISO_NUM_RWA,
1003            BLM => ISO_NUM_BLM,
1004            SHN => ISO_NUM_SHN,
1005            KNA => ISO_NUM_KNA,
1006            LCA => ISO_NUM_LCA,
1007            MAF => ISO_NUM_MAF,
1008            SPM => ISO_NUM_SPM,
1009            VCT => ISO_NUM_VCT,
1010            WSM => ISO_NUM_WSM,
1011            SMR => ISO_NUM_SMR,
1012            STP => ISO_NUM_STP,
1013            SAU => ISO_NUM_SAU,
1014            SEN => ISO_NUM_SEN,
1015            SRB => ISO_NUM_SRB,
1016            SYC => ISO_NUM_SYC,
1017            SLE => ISO_NUM_SLE,
1018            SGP => ISO_NUM_SGP,
1019            SXM => ISO_NUM_SXM,
1020            SVK => ISO_NUM_SVK,
1021            SVN => ISO_NUM_SVN,
1022            SLB => ISO_NUM_SLB,
1023            SOM => ISO_NUM_SOM,
1024            ZAF => ISO_NUM_ZAF,
1025            SGS => ISO_NUM_SGS,
1026            SSD => ISO_NUM_SSD,
1027            ESP => ISO_NUM_ESP,
1028            LKA => ISO_NUM_LKA,
1029            SDN => ISO_NUM_SDN,
1030            SUR => ISO_NUM_SUR,
1031            SJM => ISO_NUM_SJM,
1032            SWZ => ISO_NUM_SWZ,
1033            SWE => ISO_NUM_SWE,
1034            CHE => ISO_NUM_CHE,
1035            SYR => ISO_NUM_SYR,
1036            TWN => ISO_NUM_TWN,
1037            TJK => ISO_NUM_TJK,
1038            TZA => ISO_NUM_TZA,
1039            THA => ISO_NUM_THA,
1040            TLS => ISO_NUM_TLS,
1041            TGO => ISO_NUM_TGO,
1042            TKL => ISO_NUM_TKL,
1043            TON => ISO_NUM_TON,
1044            TTO => ISO_NUM_TTO,
1045            TUN => ISO_NUM_TUN,
1046            TUR => ISO_NUM_TUR,
1047            TKM => ISO_NUM_TKM,
1048            TCA => ISO_NUM_TCA,
1049            TUV => ISO_NUM_TUV,
1050            UGA => ISO_NUM_UGA,
1051            UKR => ISO_NUM_UKR,
1052            ARE => ISO_NUM_ARE,
1053            GBR => ISO_NUM_GBR,
1054            USA => ISO_NUM_USA,
1055            UMI => ISO_NUM_UMI,
1056            URY => ISO_NUM_URY,
1057            UZB => ISO_NUM_UZB,
1058            VUT => ISO_NUM_VUT,
1059            VEN => ISO_NUM_VEN,
1060            VNM => ISO_NUM_VNM,
1061            VGB => ISO_NUM_VGB,
1062            VIR => ISO_NUM_VIR,
1063            WLF => ISO_NUM_WLF,
1064            ESH => ISO_NUM_ESH,
1065            YEM => ISO_NUM_YEM,
1066            ZMB => ISO_NUM_ZMB,
1067            ZWE => ISO_NUM_ZWE,
1068        }
1069    }
1070
1071    /// Returns the uppercase two-character ISO 3166-1 string
1072    pub fn alpha2(&self) -> &'static str {
1073        use self::CountryCode::*;
1074        use alpha2::*;
1075        match *self {
1076            AFG => ISO_A2_AFG,
1077            ALA => ISO_A2_ALA,
1078            ALB => ISO_A2_ALB,
1079            DZA => ISO_A2_DZA,
1080            ASM => ISO_A2_ASM,
1081            AND => ISO_A2_AND,
1082            AGO => ISO_A2_AGO,
1083            AIA => ISO_A2_AIA,
1084            ATA => ISO_A2_ATA,
1085            ATG => ISO_A2_ATG,
1086            ARG => ISO_A2_ARG,
1087            ARM => ISO_A2_ARM,
1088            ABW => ISO_A2_ABW,
1089            AUS => ISO_A2_AUS,
1090            AUT => ISO_A2_AUT,
1091            AZE => ISO_A2_AZE,
1092            BHS => ISO_A2_BHS,
1093            BHR => ISO_A2_BHR,
1094            BGD => ISO_A2_BGD,
1095            BRB => ISO_A2_BRB,
1096            BLR => ISO_A2_BLR,
1097            BEL => ISO_A2_BEL,
1098            BLZ => ISO_A2_BLZ,
1099            BEN => ISO_A2_BEN,
1100            BMU => ISO_A2_BMU,
1101            BTN => ISO_A2_BTN,
1102            BOL => ISO_A2_BOL,
1103            BES => ISO_A2_BES,
1104            BIH => ISO_A2_BIH,
1105            BWA => ISO_A2_BWA,
1106            BVT => ISO_A2_BVT,
1107            BRA => ISO_A2_BRA,
1108            IOT => ISO_A2_IOT,
1109            BRN => ISO_A2_BRN,
1110            BGR => ISO_A2_BGR,
1111            BFA => ISO_A2_BFA,
1112            BDI => ISO_A2_BDI,
1113            CPV => ISO_A2_CPV,
1114            KHM => ISO_A2_KHM,
1115            CMR => ISO_A2_CMR,
1116            CAN => ISO_A2_CAN,
1117            CYM => ISO_A2_CYM,
1118            CAF => ISO_A2_CAF,
1119            TCD => ISO_A2_TCD,
1120            CHL => ISO_A2_CHL,
1121            CHN => ISO_A2_CHN,
1122            CXR => ISO_A2_CXR,
1123            CCK => ISO_A2_CCK,
1124            COL => ISO_A2_COL,
1125            COM => ISO_A2_COM,
1126            COG => ISO_A2_COG,
1127            COD => ISO_A2_COD,
1128            COK => ISO_A2_COK,
1129            CRI => ISO_A2_CRI,
1130            CIV => ISO_A2_CIV,
1131            HRV => ISO_A2_HRV,
1132            CUB => ISO_A2_CUB,
1133            CUW => ISO_A2_CUW,
1134            CYP => ISO_A2_CYP,
1135            CZE => ISO_A2_CZE,
1136            DNK => ISO_A2_DNK,
1137            DJI => ISO_A2_DJI,
1138            DMA => ISO_A2_DMA,
1139            DOM => ISO_A2_DOM,
1140            ECU => ISO_A2_ECU,
1141            EGY => ISO_A2_EGY,
1142            SLV => ISO_A2_SLV,
1143            GNQ => ISO_A2_GNQ,
1144            ERI => ISO_A2_ERI,
1145            EST => ISO_A2_EST,
1146            ETH => ISO_A2_ETH,
1147            FLK => ISO_A2_FLK,
1148            FRO => ISO_A2_FRO,
1149            FJI => ISO_A2_FJI,
1150            FIN => ISO_A2_FIN,
1151            FRA => ISO_A2_FRA,
1152            GUF => ISO_A2_GUF,
1153            PYF => ISO_A2_PYF,
1154            ATF => ISO_A2_ATF,
1155            GAB => ISO_A2_GAB,
1156            GMB => ISO_A2_GMB,
1157            GEO => ISO_A2_GEO,
1158            DEU => ISO_A2_DEU,
1159            GHA => ISO_A2_GHA,
1160            GIB => ISO_A2_GIB,
1161            GRC => ISO_A2_GRC,
1162            GRL => ISO_A2_GRL,
1163            GRD => ISO_A2_GRD,
1164            GLP => ISO_A2_GLP,
1165            GUM => ISO_A2_GUM,
1166            GTM => ISO_A2_GTM,
1167            GGY => ISO_A2_GGY,
1168            GIN => ISO_A2_GIN,
1169            GNB => ISO_A2_GNB,
1170            GUY => ISO_A2_GUY,
1171            HTI => ISO_A2_HTI,
1172            HMD => ISO_A2_HMD,
1173            VAT => ISO_A2_VAT,
1174            HND => ISO_A2_HND,
1175            HKG => ISO_A2_HKG,
1176            HUN => ISO_A2_HUN,
1177            ISL => ISO_A2_ISL,
1178            IND => ISO_A2_IND,
1179            IDN => ISO_A2_IDN,
1180            IRN => ISO_A2_IRN,
1181            IRQ => ISO_A2_IRQ,
1182            IRL => ISO_A2_IRL,
1183            IMN => ISO_A2_IMN,
1184            ISR => ISO_A2_ISR,
1185            ITA => ISO_A2_ITA,
1186            JAM => ISO_A2_JAM,
1187            JPN => ISO_A2_JPN,
1188            JEY => ISO_A2_JEY,
1189            JOR => ISO_A2_JOR,
1190            KAZ => ISO_A2_KAZ,
1191            KEN => ISO_A2_KEN,
1192            KIR => ISO_A2_KIR,
1193            PRK => ISO_A2_PRK,
1194            KOR => ISO_A2_KOR,
1195            KWT => ISO_A2_KWT,
1196            KGZ => ISO_A2_KGZ,
1197            LAO => ISO_A2_LAO,
1198            LVA => ISO_A2_LVA,
1199            LBN => ISO_A2_LBN,
1200            LSO => ISO_A2_LSO,
1201            LBR => ISO_A2_LBR,
1202            LBY => ISO_A2_LBY,
1203            LIE => ISO_A2_LIE,
1204            LTU => ISO_A2_LTU,
1205            LUX => ISO_A2_LUX,
1206            MAC => ISO_A2_MAC,
1207            MKD => ISO_A2_MKD,
1208            MDG => ISO_A2_MDG,
1209            MWI => ISO_A2_MWI,
1210            MYS => ISO_A2_MYS,
1211            MDV => ISO_A2_MDV,
1212            MLI => ISO_A2_MLI,
1213            MLT => ISO_A2_MLT,
1214            MHL => ISO_A2_MHL,
1215            MTQ => ISO_A2_MTQ,
1216            MRT => ISO_A2_MRT,
1217            MUS => ISO_A2_MUS,
1218            MYT => ISO_A2_MYT,
1219            MEX => ISO_A2_MEX,
1220            FSM => ISO_A2_FSM,
1221            MDA => ISO_A2_MDA,
1222            MCO => ISO_A2_MCO,
1223            MNG => ISO_A2_MNG,
1224            MNE => ISO_A2_MNE,
1225            MSR => ISO_A2_MSR,
1226            MAR => ISO_A2_MAR,
1227            MOZ => ISO_A2_MOZ,
1228            MMR => ISO_A2_MMR,
1229            NAM => ISO_A2_NAM,
1230            NRU => ISO_A2_NRU,
1231            NPL => ISO_A2_NPL,
1232            NLD => ISO_A2_NLD,
1233            NCL => ISO_A2_NCL,
1234            NZL => ISO_A2_NZL,
1235            NIC => ISO_A2_NIC,
1236            NER => ISO_A2_NER,
1237            NGA => ISO_A2_NGA,
1238            NIU => ISO_A2_NIU,
1239            NFK => ISO_A2_NFK,
1240            MNP => ISO_A2_MNP,
1241            NOR => ISO_A2_NOR,
1242            OMN => ISO_A2_OMN,
1243            PAK => ISO_A2_PAK,
1244            PLW => ISO_A2_PLW,
1245            PSE => ISO_A2_PSE,
1246            PAN => ISO_A2_PAN,
1247            PNG => ISO_A2_PNG,
1248            PRY => ISO_A2_PRY,
1249            PER => ISO_A2_PER,
1250            PHL => ISO_A2_PHL,
1251            PCN => ISO_A2_PCN,
1252            POL => ISO_A2_POL,
1253            PRT => ISO_A2_PRT,
1254            PRI => ISO_A2_PRI,
1255            QAT => ISO_A2_QAT,
1256            REU => ISO_A2_REU,
1257            ROU => ISO_A2_ROU,
1258            RUS => ISO_A2_RUS,
1259            RWA => ISO_A2_RWA,
1260            BLM => ISO_A2_BLM,
1261            SHN => ISO_A2_SHN,
1262            KNA => ISO_A2_KNA,
1263            LCA => ISO_A2_LCA,
1264            MAF => ISO_A2_MAF,
1265            SPM => ISO_A2_SPM,
1266            VCT => ISO_A2_VCT,
1267            WSM => ISO_A2_WSM,
1268            SMR => ISO_A2_SMR,
1269            STP => ISO_A2_STP,
1270            SAU => ISO_A2_SAU,
1271            SEN => ISO_A2_SEN,
1272            SRB => ISO_A2_SRB,
1273            SYC => ISO_A2_SYC,
1274            SLE => ISO_A2_SLE,
1275            SGP => ISO_A2_SGP,
1276            SXM => ISO_A2_SXM,
1277            SVK => ISO_A2_SVK,
1278            SVN => ISO_A2_SVN,
1279            SLB => ISO_A2_SLB,
1280            SOM => ISO_A2_SOM,
1281            ZAF => ISO_A2_ZAF,
1282            SGS => ISO_A2_SGS,
1283            SSD => ISO_A2_SSD,
1284            ESP => ISO_A2_ESP,
1285            LKA => ISO_A2_LKA,
1286            SDN => ISO_A2_SDN,
1287            SUR => ISO_A2_SUR,
1288            SJM => ISO_A2_SJM,
1289            SWZ => ISO_A2_SWZ,
1290            SWE => ISO_A2_SWE,
1291            CHE => ISO_A2_CHE,
1292            SYR => ISO_A2_SYR,
1293            TWN => ISO_A2_TWN,
1294            TJK => ISO_A2_TJK,
1295            TZA => ISO_A2_TZA,
1296            THA => ISO_A2_THA,
1297            TLS => ISO_A2_TLS,
1298            TGO => ISO_A2_TGO,
1299            TKL => ISO_A2_TKL,
1300            TON => ISO_A2_TON,
1301            TTO => ISO_A2_TTO,
1302            TUN => ISO_A2_TUN,
1303            TUR => ISO_A2_TUR,
1304            TKM => ISO_A2_TKM,
1305            TCA => ISO_A2_TCA,
1306            TUV => ISO_A2_TUV,
1307            UGA => ISO_A2_UGA,
1308            UKR => ISO_A2_UKR,
1309            ARE => ISO_A2_ARE,
1310            GBR => ISO_A2_GBR,
1311            USA => ISO_A2_USA,
1312            UMI => ISO_A2_UMI,
1313            URY => ISO_A2_URY,
1314            UZB => ISO_A2_UZB,
1315            VUT => ISO_A2_VUT,
1316            VEN => ISO_A2_VEN,
1317            VNM => ISO_A2_VNM,
1318            VGB => ISO_A2_VGB,
1319            VIR => ISO_A2_VIR,
1320            WLF => ISO_A2_WLF,
1321            ESH => ISO_A2_ESH,
1322            YEM => ISO_A2_YEM,
1323            ZMB => ISO_A2_ZMB,
1324            ZWE => ISO_A2_ZWE,
1325        }
1326    }
1327
1328    /// Returns the uppercase three-character ISO 3166-1 string
1329    pub fn alpha3(&self) -> &'static str {
1330        use self::CountryCode::*;
1331        use alpha3::*;
1332        match *self {
1333            AFG => ISO_A3_AFG,
1334            ALA => ISO_A3_ALA,
1335            ALB => ISO_A3_ALB,
1336            DZA => ISO_A3_DZA,
1337            ASM => ISO_A3_ASM,
1338            AND => ISO_A3_AND,
1339            AGO => ISO_A3_AGO,
1340            AIA => ISO_A3_AIA,
1341            ATA => ISO_A3_ATA,
1342            ATG => ISO_A3_ATG,
1343            ARG => ISO_A3_ARG,
1344            ARM => ISO_A3_ARM,
1345            ABW => ISO_A3_ABW,
1346            AUS => ISO_A3_AUS,
1347            AUT => ISO_A3_AUT,
1348            AZE => ISO_A3_AZE,
1349            BHS => ISO_A3_BHS,
1350            BHR => ISO_A3_BHR,
1351            BGD => ISO_A3_BGD,
1352            BRB => ISO_A3_BRB,
1353            BLR => ISO_A3_BLR,
1354            BEL => ISO_A3_BEL,
1355            BLZ => ISO_A3_BLZ,
1356            BEN => ISO_A3_BEN,
1357            BMU => ISO_A3_BMU,
1358            BTN => ISO_A3_BTN,
1359            BOL => ISO_A3_BOL,
1360            BES => ISO_A3_BES,
1361            BIH => ISO_A3_BIH,
1362            BWA => ISO_A3_BWA,
1363            BVT => ISO_A3_BVT,
1364            BRA => ISO_A3_BRA,
1365            IOT => ISO_A3_IOT,
1366            BRN => ISO_A3_BRN,
1367            BGR => ISO_A3_BGR,
1368            BFA => ISO_A3_BFA,
1369            BDI => ISO_A3_BDI,
1370            CPV => ISO_A3_CPV,
1371            KHM => ISO_A3_KHM,
1372            CMR => ISO_A3_CMR,
1373            CAN => ISO_A3_CAN,
1374            CYM => ISO_A3_CYM,
1375            CAF => ISO_A3_CAF,
1376            TCD => ISO_A3_TCD,
1377            CHL => ISO_A3_CHL,
1378            CHN => ISO_A3_CHN,
1379            CXR => ISO_A3_CXR,
1380            CCK => ISO_A3_CCK,
1381            COL => ISO_A3_COL,
1382            COM => ISO_A3_COM,
1383            COG => ISO_A3_COG,
1384            COD => ISO_A3_COD,
1385            COK => ISO_A3_COK,
1386            CRI => ISO_A3_CRI,
1387            CIV => ISO_A3_CIV,
1388            HRV => ISO_A3_HRV,
1389            CUB => ISO_A3_CUB,
1390            CUW => ISO_A3_CUW,
1391            CYP => ISO_A3_CYP,
1392            CZE => ISO_A3_CZE,
1393            DNK => ISO_A3_DNK,
1394            DJI => ISO_A3_DJI,
1395            DMA => ISO_A3_DMA,
1396            DOM => ISO_A3_DOM,
1397            ECU => ISO_A3_ECU,
1398            EGY => ISO_A3_EGY,
1399            SLV => ISO_A3_SLV,
1400            GNQ => ISO_A3_GNQ,
1401            ERI => ISO_A3_ERI,
1402            EST => ISO_A3_EST,
1403            ETH => ISO_A3_ETH,
1404            FLK => ISO_A3_FLK,
1405            FRO => ISO_A3_FRO,
1406            FJI => ISO_A3_FJI,
1407            FIN => ISO_A3_FIN,
1408            FRA => ISO_A3_FRA,
1409            GUF => ISO_A3_GUF,
1410            PYF => ISO_A3_PYF,
1411            ATF => ISO_A3_ATF,
1412            GAB => ISO_A3_GAB,
1413            GMB => ISO_A3_GMB,
1414            GEO => ISO_A3_GEO,
1415            DEU => ISO_A3_DEU,
1416            GHA => ISO_A3_GHA,
1417            GIB => ISO_A3_GIB,
1418            GRC => ISO_A3_GRC,
1419            GRL => ISO_A3_GRL,
1420            GRD => ISO_A3_GRD,
1421            GLP => ISO_A3_GLP,
1422            GUM => ISO_A3_GUM,
1423            GTM => ISO_A3_GTM,
1424            GGY => ISO_A3_GGY,
1425            GIN => ISO_A3_GIN,
1426            GNB => ISO_A3_GNB,
1427            GUY => ISO_A3_GUY,
1428            HTI => ISO_A3_HTI,
1429            HMD => ISO_A3_HMD,
1430            VAT => ISO_A3_VAT,
1431            HND => ISO_A3_HND,
1432            HKG => ISO_A3_HKG,
1433            HUN => ISO_A3_HUN,
1434            ISL => ISO_A3_ISL,
1435            IND => ISO_A3_IND,
1436            IDN => ISO_A3_IDN,
1437            IRN => ISO_A3_IRN,
1438            IRQ => ISO_A3_IRQ,
1439            IRL => ISO_A3_IRL,
1440            IMN => ISO_A3_IMN,
1441            ISR => ISO_A3_ISR,
1442            ITA => ISO_A3_ITA,
1443            JAM => ISO_A3_JAM,
1444            JPN => ISO_A3_JPN,
1445            JEY => ISO_A3_JEY,
1446            JOR => ISO_A3_JOR,
1447            KAZ => ISO_A3_KAZ,
1448            KEN => ISO_A3_KEN,
1449            KIR => ISO_A3_KIR,
1450            PRK => ISO_A3_PRK,
1451            KOR => ISO_A3_KOR,
1452            KWT => ISO_A3_KWT,
1453            KGZ => ISO_A3_KGZ,
1454            LAO => ISO_A3_LAO,
1455            LVA => ISO_A3_LVA,
1456            LBN => ISO_A3_LBN,
1457            LSO => ISO_A3_LSO,
1458            LBR => ISO_A3_LBR,
1459            LBY => ISO_A3_LBY,
1460            LIE => ISO_A3_LIE,
1461            LTU => ISO_A3_LTU,
1462            LUX => ISO_A3_LUX,
1463            MAC => ISO_A3_MAC,
1464            MKD => ISO_A3_MKD,
1465            MDG => ISO_A3_MDG,
1466            MWI => ISO_A3_MWI,
1467            MYS => ISO_A3_MYS,
1468            MDV => ISO_A3_MDV,
1469            MLI => ISO_A3_MLI,
1470            MLT => ISO_A3_MLT,
1471            MHL => ISO_A3_MHL,
1472            MTQ => ISO_A3_MTQ,
1473            MRT => ISO_A3_MRT,
1474            MUS => ISO_A3_MUS,
1475            MYT => ISO_A3_MYT,
1476            MEX => ISO_A3_MEX,
1477            FSM => ISO_A3_FSM,
1478            MDA => ISO_A3_MDA,
1479            MCO => ISO_A3_MCO,
1480            MNG => ISO_A3_MNG,
1481            MNE => ISO_A3_MNE,
1482            MSR => ISO_A3_MSR,
1483            MAR => ISO_A3_MAR,
1484            MOZ => ISO_A3_MOZ,
1485            MMR => ISO_A3_MMR,
1486            NAM => ISO_A3_NAM,
1487            NRU => ISO_A3_NRU,
1488            NPL => ISO_A3_NPL,
1489            NLD => ISO_A3_NLD,
1490            NCL => ISO_A3_NCL,
1491            NZL => ISO_A3_NZL,
1492            NIC => ISO_A3_NIC,
1493            NER => ISO_A3_NER,
1494            NGA => ISO_A3_NGA,
1495            NIU => ISO_A3_NIU,
1496            NFK => ISO_A3_NFK,
1497            MNP => ISO_A3_MNP,
1498            NOR => ISO_A3_NOR,
1499            OMN => ISO_A3_OMN,
1500            PAK => ISO_A3_PAK,
1501            PLW => ISO_A3_PLW,
1502            PSE => ISO_A3_PSE,
1503            PAN => ISO_A3_PAN,
1504            PNG => ISO_A3_PNG,
1505            PRY => ISO_A3_PRY,
1506            PER => ISO_A3_PER,
1507            PHL => ISO_A3_PHL,
1508            PCN => ISO_A3_PCN,
1509            POL => ISO_A3_POL,
1510            PRT => ISO_A3_PRT,
1511            PRI => ISO_A3_PRI,
1512            QAT => ISO_A3_QAT,
1513            REU => ISO_A3_REU,
1514            ROU => ISO_A3_ROU,
1515            RUS => ISO_A3_RUS,
1516            RWA => ISO_A3_RWA,
1517            BLM => ISO_A3_BLM,
1518            SHN => ISO_A3_SHN,
1519            KNA => ISO_A3_KNA,
1520            LCA => ISO_A3_LCA,
1521            MAF => ISO_A3_MAF,
1522            SPM => ISO_A3_SPM,
1523            VCT => ISO_A3_VCT,
1524            WSM => ISO_A3_WSM,
1525            SMR => ISO_A3_SMR,
1526            STP => ISO_A3_STP,
1527            SAU => ISO_A3_SAU,
1528            SEN => ISO_A3_SEN,
1529            SRB => ISO_A3_SRB,
1530            SYC => ISO_A3_SYC,
1531            SLE => ISO_A3_SLE,
1532            SGP => ISO_A3_SGP,
1533            SXM => ISO_A3_SXM,
1534            SVK => ISO_A3_SVK,
1535            SVN => ISO_A3_SVN,
1536            SLB => ISO_A3_SLB,
1537            SOM => ISO_A3_SOM,
1538            ZAF => ISO_A3_ZAF,
1539            SGS => ISO_A3_SGS,
1540            SSD => ISO_A3_SSD,
1541            ESP => ISO_A3_ESP,
1542            LKA => ISO_A3_LKA,
1543            SDN => ISO_A3_SDN,
1544            SUR => ISO_A3_SUR,
1545            SJM => ISO_A3_SJM,
1546            SWZ => ISO_A3_SWZ,
1547            SWE => ISO_A3_SWE,
1548            CHE => ISO_A3_CHE,
1549            SYR => ISO_A3_SYR,
1550            TWN => ISO_A3_TWN,
1551            TJK => ISO_A3_TJK,
1552            TZA => ISO_A3_TZA,
1553            THA => ISO_A3_THA,
1554            TLS => ISO_A3_TLS,
1555            TGO => ISO_A3_TGO,
1556            TKL => ISO_A3_TKL,
1557            TON => ISO_A3_TON,
1558            TTO => ISO_A3_TTO,
1559            TUN => ISO_A3_TUN,
1560            TUR => ISO_A3_TUR,
1561            TKM => ISO_A3_TKM,
1562            TCA => ISO_A3_TCA,
1563            TUV => ISO_A3_TUV,
1564            UGA => ISO_A3_UGA,
1565            UKR => ISO_A3_UKR,
1566            ARE => ISO_A3_ARE,
1567            GBR => ISO_A3_GBR,
1568            USA => ISO_A3_USA,
1569            UMI => ISO_A3_UMI,
1570            URY => ISO_A3_URY,
1571            UZB => ISO_A3_UZB,
1572            VUT => ISO_A3_VUT,
1573            VEN => ISO_A3_VEN,
1574            VNM => ISO_A3_VNM,
1575            VGB => ISO_A3_VGB,
1576            VIR => ISO_A3_VIR,
1577            WLF => ISO_A3_WLF,
1578            ESH => ISO_A3_ESH,
1579            YEM => ISO_A3_YEM,
1580            ZMB => ISO_A3_ZMB,
1581            ZWE => ISO_A3_ZWE,
1582        }
1583    }
1584
1585    /// Attempts to determine the ISO 3166-1 CountryCode for the given two-character string,
1586    /// assuming it is in upper-case characters
1587    pub fn for_alpha2(value: &str) -> Result<CountryCode, CountryCodeParseErr> {
1588        use CountryCode::*;
1589        use alpha2::*;
1590        match value {
1591            ISO_A2_AFG => Ok(AFG),
1592            ISO_A2_ALA => Ok(ALA),
1593            ISO_A2_ALB => Ok(ALB),
1594            ISO_A2_DZA => Ok(DZA),
1595            ISO_A2_ASM => Ok(ASM),
1596            ISO_A2_AND => Ok(AND),
1597            ISO_A2_AGO => Ok(AGO),
1598            ISO_A2_AIA => Ok(AIA),
1599            ISO_A2_ATA => Ok(ATA),
1600            ISO_A2_ATG => Ok(ATG),
1601            ISO_A2_ARG => Ok(ARG),
1602            ISO_A2_ARM => Ok(ARM),
1603            ISO_A2_ABW => Ok(ABW),
1604            ISO_A2_AUS => Ok(AUS),
1605            ISO_A2_AUT => Ok(AUT),
1606            ISO_A2_AZE => Ok(AZE),
1607            ISO_A2_BHS => Ok(BHS),
1608            ISO_A2_BHR => Ok(BHR),
1609            ISO_A2_BGD => Ok(BGD),
1610            ISO_A2_BRB => Ok(BRB),
1611            ISO_A2_BLR => Ok(BLR),
1612            ISO_A2_BEL => Ok(BEL),
1613            ISO_A2_BLZ => Ok(BLZ),
1614            ISO_A2_BEN => Ok(BEN),
1615            ISO_A2_BMU => Ok(BMU),
1616            ISO_A2_BTN => Ok(BTN),
1617            ISO_A2_BOL => Ok(BOL),
1618            ISO_A2_BES => Ok(BES),
1619            ISO_A2_BIH => Ok(BIH),
1620            ISO_A2_BWA => Ok(BWA),
1621            ISO_A2_BVT => Ok(BVT),
1622            ISO_A2_BRA => Ok(BRA),
1623            ISO_A2_IOT => Ok(IOT),
1624            ISO_A2_BRN => Ok(BRN),
1625            ISO_A2_BGR => Ok(BGR),
1626            ISO_A2_BFA => Ok(BFA),
1627            ISO_A2_BDI => Ok(BDI),
1628            ISO_A2_CPV => Ok(CPV),
1629            ISO_A2_KHM => Ok(KHM),
1630            ISO_A2_CMR => Ok(CMR),
1631            ISO_A2_CAN => Ok(CAN),
1632            ISO_A2_CYM => Ok(CYM),
1633            ISO_A2_CAF => Ok(CAF),
1634            ISO_A2_TCD => Ok(TCD),
1635            ISO_A2_CHL => Ok(CHL),
1636            ISO_A2_CHN => Ok(CHN),
1637            ISO_A2_CXR => Ok(CXR),
1638            ISO_A2_CCK => Ok(CCK),
1639            ISO_A2_COL => Ok(COL),
1640            ISO_A2_COM => Ok(COM),
1641            ISO_A2_COG => Ok(COG),
1642            ISO_A2_COD => Ok(COD),
1643            ISO_A2_COK => Ok(COK),
1644            ISO_A2_CRI => Ok(CRI),
1645            ISO_A2_CIV => Ok(CIV),
1646            ISO_A2_HRV => Ok(HRV),
1647            ISO_A2_CUB => Ok(CUB),
1648            ISO_A2_CUW => Ok(CUW),
1649            ISO_A2_CYP => Ok(CYP),
1650            ISO_A2_CZE => Ok(CZE),
1651            ISO_A2_DNK => Ok(DNK),
1652            ISO_A2_DJI => Ok(DJI),
1653            ISO_A2_DMA => Ok(DMA),
1654            ISO_A2_DOM => Ok(DOM),
1655            ISO_A2_ECU => Ok(ECU),
1656            ISO_A2_EGY => Ok(EGY),
1657            ISO_A2_SLV => Ok(SLV),
1658            ISO_A2_GNQ => Ok(GNQ),
1659            ISO_A2_ERI => Ok(ERI),
1660            ISO_A2_EST => Ok(EST),
1661            ISO_A2_ETH => Ok(ETH),
1662            ISO_A2_FLK => Ok(FLK),
1663            ISO_A2_FRO => Ok(FRO),
1664            ISO_A2_FJI => Ok(FJI),
1665            ISO_A2_FIN => Ok(FIN),
1666            ISO_A2_FRA => Ok(FRA),
1667            ISO_A2_GUF => Ok(GUF),
1668            ISO_A2_PYF => Ok(PYF),
1669            ISO_A2_ATF => Ok(ATF),
1670            ISO_A2_GAB => Ok(GAB),
1671            ISO_A2_GMB => Ok(GMB),
1672            ISO_A2_GEO => Ok(GEO),
1673            ISO_A2_DEU => Ok(DEU),
1674            ISO_A2_GHA => Ok(GHA),
1675            ISO_A2_GIB => Ok(GIB),
1676            ISO_A2_GRC => Ok(GRC),
1677            ISO_A2_GRL => Ok(GRL),
1678            ISO_A2_GRD => Ok(GRD),
1679            ISO_A2_GLP => Ok(GLP),
1680            ISO_A2_GUM => Ok(GUM),
1681            ISO_A2_GTM => Ok(GTM),
1682            ISO_A2_GGY => Ok(GGY),
1683            ISO_A2_GIN => Ok(GIN),
1684            ISO_A2_GNB => Ok(GNB),
1685            ISO_A2_GUY => Ok(GUY),
1686            ISO_A2_HTI => Ok(HTI),
1687            ISO_A2_HMD => Ok(HMD),
1688            ISO_A2_VAT => Ok(VAT),
1689            ISO_A2_HND => Ok(HND),
1690            ISO_A2_HKG => Ok(HKG),
1691            ISO_A2_HUN => Ok(HUN),
1692            ISO_A2_ISL => Ok(ISL),
1693            ISO_A2_IND => Ok(IND),
1694            ISO_A2_IDN => Ok(IDN),
1695            ISO_A2_IRN => Ok(IRN),
1696            ISO_A2_IRQ => Ok(IRQ),
1697            ISO_A2_IRL => Ok(IRL),
1698            ISO_A2_IMN => Ok(IMN),
1699            ISO_A2_ISR => Ok(ISR),
1700            ISO_A2_ITA => Ok(ITA),
1701            ISO_A2_JAM => Ok(JAM),
1702            ISO_A2_JPN => Ok(JPN),
1703            ISO_A2_JEY => Ok(JEY),
1704            ISO_A2_JOR => Ok(JOR),
1705            ISO_A2_KAZ => Ok(KAZ),
1706            ISO_A2_KEN => Ok(KEN),
1707            ISO_A2_KIR => Ok(KIR),
1708            ISO_A2_PRK => Ok(PRK),
1709            ISO_A2_KOR => Ok(KOR),
1710            ISO_A2_KWT => Ok(KWT),
1711            ISO_A2_KGZ => Ok(KGZ),
1712            ISO_A2_LAO => Ok(LAO),
1713            ISO_A2_LVA => Ok(LVA),
1714            ISO_A2_LBN => Ok(LBN),
1715            ISO_A2_LSO => Ok(LSO),
1716            ISO_A2_LBR => Ok(LBR),
1717            ISO_A2_LBY => Ok(LBY),
1718            ISO_A2_LIE => Ok(LIE),
1719            ISO_A2_LTU => Ok(LTU),
1720            ISO_A2_LUX => Ok(LUX),
1721            ISO_A2_MAC => Ok(MAC),
1722            ISO_A2_MKD => Ok(MKD),
1723            ISO_A2_MDG => Ok(MDG),
1724            ISO_A2_MWI => Ok(MWI),
1725            ISO_A2_MYS => Ok(MYS),
1726            ISO_A2_MDV => Ok(MDV),
1727            ISO_A2_MLI => Ok(MLI),
1728            ISO_A2_MLT => Ok(MLT),
1729            ISO_A2_MHL => Ok(MHL),
1730            ISO_A2_MTQ => Ok(MTQ),
1731            ISO_A2_MRT => Ok(MRT),
1732            ISO_A2_MUS => Ok(MUS),
1733            ISO_A2_MYT => Ok(MYT),
1734            ISO_A2_MEX => Ok(MEX),
1735            ISO_A2_FSM => Ok(FSM),
1736            ISO_A2_MDA => Ok(MDA),
1737            ISO_A2_MCO => Ok(MCO),
1738            ISO_A2_MNG => Ok(MNG),
1739            ISO_A2_MNE => Ok(MNE),
1740            ISO_A2_MSR => Ok(MSR),
1741            ISO_A2_MAR => Ok(MAR),
1742            ISO_A2_MOZ => Ok(MOZ),
1743            ISO_A2_MMR => Ok(MMR),
1744            ISO_A2_NAM => Ok(NAM),
1745            ISO_A2_NRU => Ok(NRU),
1746            ISO_A2_NPL => Ok(NPL),
1747            ISO_A2_NLD => Ok(NLD),
1748            ISO_A2_NCL => Ok(NCL),
1749            ISO_A2_NZL => Ok(NZL),
1750            ISO_A2_NIC => Ok(NIC),
1751            ISO_A2_NER => Ok(NER),
1752            ISO_A2_NGA => Ok(NGA),
1753            ISO_A2_NIU => Ok(NIU),
1754            ISO_A2_NFK => Ok(NFK),
1755            ISO_A2_MNP => Ok(MNP),
1756            ISO_A2_NOR => Ok(NOR),
1757            ISO_A2_OMN => Ok(OMN),
1758            ISO_A2_PAK => Ok(PAK),
1759            ISO_A2_PLW => Ok(PLW),
1760            ISO_A2_PSE => Ok(PSE),
1761            ISO_A2_PAN => Ok(PAN),
1762            ISO_A2_PNG => Ok(PNG),
1763            ISO_A2_PRY => Ok(PRY),
1764            ISO_A2_PER => Ok(PER),
1765            ISO_A2_PHL => Ok(PHL),
1766            ISO_A2_PCN => Ok(PCN),
1767            ISO_A2_POL => Ok(POL),
1768            ISO_A2_PRT => Ok(PRT),
1769            ISO_A2_PRI => Ok(PRI),
1770            ISO_A2_QAT => Ok(QAT),
1771            ISO_A2_REU => Ok(REU),
1772            ISO_A2_ROU => Ok(ROU),
1773            ISO_A2_RUS => Ok(RUS),
1774            ISO_A2_RWA => Ok(RWA),
1775            ISO_A2_BLM => Ok(BLM),
1776            ISO_A2_SHN => Ok(SHN),
1777            ISO_A2_KNA => Ok(KNA),
1778            ISO_A2_LCA => Ok(LCA),
1779            ISO_A2_MAF => Ok(MAF),
1780            ISO_A2_SPM => Ok(SPM),
1781            ISO_A2_VCT => Ok(VCT),
1782            ISO_A2_WSM => Ok(WSM),
1783            ISO_A2_SMR => Ok(SMR),
1784            ISO_A2_STP => Ok(STP),
1785            ISO_A2_SAU => Ok(SAU),
1786            ISO_A2_SEN => Ok(SEN),
1787            ISO_A2_SRB => Ok(SRB),
1788            ISO_A2_SYC => Ok(SYC),
1789            ISO_A2_SLE => Ok(SLE),
1790            ISO_A2_SGP => Ok(SGP),
1791            ISO_A2_SXM => Ok(SXM),
1792            ISO_A2_SVK => Ok(SVK),
1793            ISO_A2_SVN => Ok(SVN),
1794            ISO_A2_SLB => Ok(SLB),
1795            ISO_A2_SOM => Ok(SOM),
1796            ISO_A2_ZAF => Ok(ZAF),
1797            ISO_A2_SGS => Ok(SGS),
1798            ISO_A2_SSD => Ok(SSD),
1799            ISO_A2_ESP => Ok(ESP),
1800            ISO_A2_LKA => Ok(LKA),
1801            ISO_A2_SDN => Ok(SDN),
1802            ISO_A2_SUR => Ok(SUR),
1803            ISO_A2_SJM => Ok(SJM),
1804            ISO_A2_SWZ => Ok(SWZ),
1805            ISO_A2_SWE => Ok(SWE),
1806            ISO_A2_CHE => Ok(CHE),
1807            ISO_A2_SYR => Ok(SYR),
1808            ISO_A2_TWN => Ok(TWN),
1809            ISO_A2_TJK => Ok(TJK),
1810            ISO_A2_TZA => Ok(TZA),
1811            ISO_A2_THA => Ok(THA),
1812            ISO_A2_TLS => Ok(TLS),
1813            ISO_A2_TGO => Ok(TGO),
1814            ISO_A2_TKL => Ok(TKL),
1815            ISO_A2_TON => Ok(TON),
1816            ISO_A2_TTO => Ok(TTO),
1817            ISO_A2_TUN => Ok(TUN),
1818            ISO_A2_TUR => Ok(TUR),
1819            ISO_A2_TKM => Ok(TKM),
1820            ISO_A2_TCA => Ok(TCA),
1821            ISO_A2_TUV => Ok(TUV),
1822            ISO_A2_UGA => Ok(UGA),
1823            ISO_A2_UKR => Ok(UKR),
1824            ISO_A2_ARE => Ok(ARE),
1825            ISO_A2_GBR => Ok(GBR),
1826            ISO_A2_USA => Ok(USA),
1827            ISO_A2_UMI => Ok(UMI),
1828            ISO_A2_URY => Ok(URY),
1829            ISO_A2_UZB => Ok(UZB),
1830            ISO_A2_VUT => Ok(VUT),
1831            ISO_A2_VEN => Ok(VEN),
1832            ISO_A2_VNM => Ok(VNM),
1833            ISO_A2_VGB => Ok(VGB),
1834            ISO_A2_VIR => Ok(VIR),
1835            ISO_A2_WLF => Ok(WLF),
1836            ISO_A2_ESH => Ok(ESH),
1837            ISO_A2_YEM => Ok(YEM),
1838            ISO_A2_ZMB => Ok(ZMB),
1839            ISO_A2_ZWE => Ok(ZWE),
1840            x => Err(CountryCodeParseErr::InvalidAlpha2 {
1841                unknown: String::from(x),
1842            }),
1843        }
1844    }
1845
1846    /// Attempts to determine the ISO 3166-1 CountryCode for the given two-character string,
1847    /// making no assumption as to the case-ness of the input
1848    pub fn for_alpha2_caseless(value: &str) -> Result<CountryCode, CountryCodeParseErr> {
1849        let uppercase = value.to_uppercase();
1850        CountryCode::for_alpha2(uppercase.as_ref())
1851    }
1852
1853    /// Attempts to determine the ISO 3166-1 CountryCode for the given three-character string,
1854    /// assuming it is in upper-case characters
1855    pub fn for_alpha3(value: &str) -> Result<CountryCode, CountryCodeParseErr> {
1856        use CountryCode::*;
1857        use alpha3::*;
1858        match value {
1859            ISO_A3_AFG => Ok(AFG),
1860            ISO_A3_ALA => Ok(ALA),
1861            ISO_A3_ALB => Ok(ALB),
1862            ISO_A3_DZA => Ok(DZA),
1863            ISO_A3_ASM => Ok(ASM),
1864            ISO_A3_AND => Ok(AND),
1865            ISO_A3_AGO => Ok(AGO),
1866            ISO_A3_AIA => Ok(AIA),
1867            ISO_A3_ATA => Ok(ATA),
1868            ISO_A3_ATG => Ok(ATG),
1869            ISO_A3_ARG => Ok(ARG),
1870            ISO_A3_ARM => Ok(ARM),
1871            ISO_A3_ABW => Ok(ABW),
1872            ISO_A3_AUS => Ok(AUS),
1873            ISO_A3_AUT => Ok(AUT),
1874            ISO_A3_AZE => Ok(AZE),
1875            ISO_A3_BHS => Ok(BHS),
1876            ISO_A3_BHR => Ok(BHR),
1877            ISO_A3_BGD => Ok(BGD),
1878            ISO_A3_BRB => Ok(BRB),
1879            ISO_A3_BLR => Ok(BLR),
1880            ISO_A3_BEL => Ok(BEL),
1881            ISO_A3_BLZ => Ok(BLZ),
1882            ISO_A3_BEN => Ok(BEN),
1883            ISO_A3_BMU => Ok(BMU),
1884            ISO_A3_BTN => Ok(BTN),
1885            ISO_A3_BOL => Ok(BOL),
1886            ISO_A3_BES => Ok(BES),
1887            ISO_A3_BIH => Ok(BIH),
1888            ISO_A3_BWA => Ok(BWA),
1889            ISO_A3_BVT => Ok(BVT),
1890            ISO_A3_BRA => Ok(BRA),
1891            ISO_A3_IOT => Ok(IOT),
1892            ISO_A3_BRN => Ok(BRN),
1893            ISO_A3_BGR => Ok(BGR),
1894            ISO_A3_BFA => Ok(BFA),
1895            ISO_A3_BDI => Ok(BDI),
1896            ISO_A3_CPV => Ok(CPV),
1897            ISO_A3_KHM => Ok(KHM),
1898            ISO_A3_CMR => Ok(CMR),
1899            ISO_A3_CAN => Ok(CAN),
1900            ISO_A3_CYM => Ok(CYM),
1901            ISO_A3_CAF => Ok(CAF),
1902            ISO_A3_TCD => Ok(TCD),
1903            ISO_A3_CHL => Ok(CHL),
1904            ISO_A3_CHN => Ok(CHN),
1905            ISO_A3_CXR => Ok(CXR),
1906            ISO_A3_CCK => Ok(CCK),
1907            ISO_A3_COL => Ok(COL),
1908            ISO_A3_COM => Ok(COM),
1909            ISO_A3_COG => Ok(COG),
1910            ISO_A3_COD => Ok(COD),
1911            ISO_A3_COK => Ok(COK),
1912            ISO_A3_CRI => Ok(CRI),
1913            ISO_A3_CIV => Ok(CIV),
1914            ISO_A3_HRV => Ok(HRV),
1915            ISO_A3_CUB => Ok(CUB),
1916            ISO_A3_CUW => Ok(CUW),
1917            ISO_A3_CYP => Ok(CYP),
1918            ISO_A3_CZE => Ok(CZE),
1919            ISO_A3_DNK => Ok(DNK),
1920            ISO_A3_DJI => Ok(DJI),
1921            ISO_A3_DMA => Ok(DMA),
1922            ISO_A3_DOM => Ok(DOM),
1923            ISO_A3_ECU => Ok(ECU),
1924            ISO_A3_EGY => Ok(EGY),
1925            ISO_A3_SLV => Ok(SLV),
1926            ISO_A3_GNQ => Ok(GNQ),
1927            ISO_A3_ERI => Ok(ERI),
1928            ISO_A3_EST => Ok(EST),
1929            ISO_A3_ETH => Ok(ETH),
1930            ISO_A3_FLK => Ok(FLK),
1931            ISO_A3_FRO => Ok(FRO),
1932            ISO_A3_FJI => Ok(FJI),
1933            ISO_A3_FIN => Ok(FIN),
1934            ISO_A3_FRA => Ok(FRA),
1935            ISO_A3_GUF => Ok(GUF),
1936            ISO_A3_PYF => Ok(PYF),
1937            ISO_A3_ATF => Ok(ATF),
1938            ISO_A3_GAB => Ok(GAB),
1939            ISO_A3_GMB => Ok(GMB),
1940            ISO_A3_GEO => Ok(GEO),
1941            ISO_A3_DEU => Ok(DEU),
1942            ISO_A3_GHA => Ok(GHA),
1943            ISO_A3_GIB => Ok(GIB),
1944            ISO_A3_GRC => Ok(GRC),
1945            ISO_A3_GRL => Ok(GRL),
1946            ISO_A3_GRD => Ok(GRD),
1947            ISO_A3_GLP => Ok(GLP),
1948            ISO_A3_GUM => Ok(GUM),
1949            ISO_A3_GTM => Ok(GTM),
1950            ISO_A3_GGY => Ok(GGY),
1951            ISO_A3_GIN => Ok(GIN),
1952            ISO_A3_GNB => Ok(GNB),
1953            ISO_A3_GUY => Ok(GUY),
1954            ISO_A3_HTI => Ok(HTI),
1955            ISO_A3_HMD => Ok(HMD),
1956            ISO_A3_VAT => Ok(VAT),
1957            ISO_A3_HND => Ok(HND),
1958            ISO_A3_HKG => Ok(HKG),
1959            ISO_A3_HUN => Ok(HUN),
1960            ISO_A3_ISL => Ok(ISL),
1961            ISO_A3_IND => Ok(IND),
1962            ISO_A3_IDN => Ok(IDN),
1963            ISO_A3_IRN => Ok(IRN),
1964            ISO_A3_IRQ => Ok(IRQ),
1965            ISO_A3_IRL => Ok(IRL),
1966            ISO_A3_IMN => Ok(IMN),
1967            ISO_A3_ISR => Ok(ISR),
1968            ISO_A3_ITA => Ok(ITA),
1969            ISO_A3_JAM => Ok(JAM),
1970            ISO_A3_JPN => Ok(JPN),
1971            ISO_A3_JEY => Ok(JEY),
1972            ISO_A3_JOR => Ok(JOR),
1973            ISO_A3_KAZ => Ok(KAZ),
1974            ISO_A3_KEN => Ok(KEN),
1975            ISO_A3_KIR => Ok(KIR),
1976            ISO_A3_PRK => Ok(PRK),
1977            ISO_A3_KOR => Ok(KOR),
1978            ISO_A3_KWT => Ok(KWT),
1979            ISO_A3_KGZ => Ok(KGZ),
1980            ISO_A3_LAO => Ok(LAO),
1981            ISO_A3_LVA => Ok(LVA),
1982            ISO_A3_LBN => Ok(LBN),
1983            ISO_A3_LSO => Ok(LSO),
1984            ISO_A3_LBR => Ok(LBR),
1985            ISO_A3_LBY => Ok(LBY),
1986            ISO_A3_LIE => Ok(LIE),
1987            ISO_A3_LTU => Ok(LTU),
1988            ISO_A3_LUX => Ok(LUX),
1989            ISO_A3_MAC => Ok(MAC),
1990            ISO_A3_MKD => Ok(MKD),
1991            ISO_A3_MDG => Ok(MDG),
1992            ISO_A3_MWI => Ok(MWI),
1993            ISO_A3_MYS => Ok(MYS),
1994            ISO_A3_MDV => Ok(MDV),
1995            ISO_A3_MLI => Ok(MLI),
1996            ISO_A3_MLT => Ok(MLT),
1997            ISO_A3_MHL => Ok(MHL),
1998            ISO_A3_MTQ => Ok(MTQ),
1999            ISO_A3_MRT => Ok(MRT),
2000            ISO_A3_MUS => Ok(MUS),
2001            ISO_A3_MYT => Ok(MYT),
2002            ISO_A3_MEX => Ok(MEX),
2003            ISO_A3_FSM => Ok(FSM),
2004            ISO_A3_MDA => Ok(MDA),
2005            ISO_A3_MCO => Ok(MCO),
2006            ISO_A3_MNG => Ok(MNG),
2007            ISO_A3_MNE => Ok(MNE),
2008            ISO_A3_MSR => Ok(MSR),
2009            ISO_A3_MAR => Ok(MAR),
2010            ISO_A3_MOZ => Ok(MOZ),
2011            ISO_A3_MMR => Ok(MMR),
2012            ISO_A3_NAM => Ok(NAM),
2013            ISO_A3_NRU => Ok(NRU),
2014            ISO_A3_NPL => Ok(NPL),
2015            ISO_A3_NLD => Ok(NLD),
2016            ISO_A3_NCL => Ok(NCL),
2017            ISO_A3_NZL => Ok(NZL),
2018            ISO_A3_NIC => Ok(NIC),
2019            ISO_A3_NER => Ok(NER),
2020            ISO_A3_NGA => Ok(NGA),
2021            ISO_A3_NIU => Ok(NIU),
2022            ISO_A3_NFK => Ok(NFK),
2023            ISO_A3_MNP => Ok(MNP),
2024            ISO_A3_NOR => Ok(NOR),
2025            ISO_A3_OMN => Ok(OMN),
2026            ISO_A3_PAK => Ok(PAK),
2027            ISO_A3_PLW => Ok(PLW),
2028            ISO_A3_PSE => Ok(PSE),
2029            ISO_A3_PAN => Ok(PAN),
2030            ISO_A3_PNG => Ok(PNG),
2031            ISO_A3_PRY => Ok(PRY),
2032            ISO_A3_PER => Ok(PER),
2033            ISO_A3_PHL => Ok(PHL),
2034            ISO_A3_PCN => Ok(PCN),
2035            ISO_A3_POL => Ok(POL),
2036            ISO_A3_PRT => Ok(PRT),
2037            ISO_A3_PRI => Ok(PRI),
2038            ISO_A3_QAT => Ok(QAT),
2039            ISO_A3_REU => Ok(REU),
2040            ISO_A3_ROU => Ok(ROU),
2041            ISO_A3_RUS => Ok(RUS),
2042            ISO_A3_RWA => Ok(RWA),
2043            ISO_A3_BLM => Ok(BLM),
2044            ISO_A3_SHN => Ok(SHN),
2045            ISO_A3_KNA => Ok(KNA),
2046            ISO_A3_LCA => Ok(LCA),
2047            ISO_A3_MAF => Ok(MAF),
2048            ISO_A3_SPM => Ok(SPM),
2049            ISO_A3_VCT => Ok(VCT),
2050            ISO_A3_WSM => Ok(WSM),
2051            ISO_A3_SMR => Ok(SMR),
2052            ISO_A3_STP => Ok(STP),
2053            ISO_A3_SAU => Ok(SAU),
2054            ISO_A3_SEN => Ok(SEN),
2055            ISO_A3_SRB => Ok(SRB),
2056            ISO_A3_SYC => Ok(SYC),
2057            ISO_A3_SLE => Ok(SLE),
2058            ISO_A3_SGP => Ok(SGP),
2059            ISO_A3_SXM => Ok(SXM),
2060            ISO_A3_SVK => Ok(SVK),
2061            ISO_A3_SVN => Ok(SVN),
2062            ISO_A3_SLB => Ok(SLB),
2063            ISO_A3_SOM => Ok(SOM),
2064            ISO_A3_ZAF => Ok(ZAF),
2065            ISO_A3_SGS => Ok(SGS),
2066            ISO_A3_SSD => Ok(SSD),
2067            ISO_A3_ESP => Ok(ESP),
2068            ISO_A3_LKA => Ok(LKA),
2069            ISO_A3_SDN => Ok(SDN),
2070            ISO_A3_SUR => Ok(SUR),
2071            ISO_A3_SJM => Ok(SJM),
2072            ISO_A3_SWZ => Ok(SWZ),
2073            ISO_A3_SWE => Ok(SWE),
2074            ISO_A3_CHE => Ok(CHE),
2075            ISO_A3_SYR => Ok(SYR),
2076            ISO_A3_TWN => Ok(TWN),
2077            ISO_A3_TJK => Ok(TJK),
2078            ISO_A3_TZA => Ok(TZA),
2079            ISO_A3_THA => Ok(THA),
2080            ISO_A3_TLS => Ok(TLS),
2081            ISO_A3_TGO => Ok(TGO),
2082            ISO_A3_TKL => Ok(TKL),
2083            ISO_A3_TON => Ok(TON),
2084            ISO_A3_TTO => Ok(TTO),
2085            ISO_A3_TUN => Ok(TUN),
2086            ISO_A3_TUR => Ok(TUR),
2087            ISO_A3_TKM => Ok(TKM),
2088            ISO_A3_TCA => Ok(TCA),
2089            ISO_A3_TUV => Ok(TUV),
2090            ISO_A3_UGA => Ok(UGA),
2091            ISO_A3_UKR => Ok(UKR),
2092            ISO_A3_ARE => Ok(ARE),
2093            ISO_A3_GBR => Ok(GBR),
2094            ISO_A3_USA => Ok(USA),
2095            ISO_A3_UMI => Ok(UMI),
2096            ISO_A3_URY => Ok(URY),
2097            ISO_A3_UZB => Ok(UZB),
2098            ISO_A3_VUT => Ok(VUT),
2099            ISO_A3_VEN => Ok(VEN),
2100            ISO_A3_VNM => Ok(VNM),
2101            ISO_A3_VGB => Ok(VGB),
2102            ISO_A3_VIR => Ok(VIR),
2103            ISO_A3_WLF => Ok(WLF),
2104            ISO_A3_ESH => Ok(ESH),
2105            ISO_A3_YEM => Ok(YEM),
2106            ISO_A3_ZMB => Ok(ZMB),
2107            ISO_A3_ZWE => Ok(ZWE),
2108            x => Err(CountryCodeParseErr::InvalidAlpha3 {
2109                unknown: String::from(x),
2110            }),
2111        }
2112    }
2113
2114    /// Attempts to determine the ISO 3166-1 CountryCode for the given three-character string,
2115    /// making no assumption as to the case-ness of the input
2116    pub fn for_alpha3_caseless(value: &str) -> Result<CountryCode, CountryCodeParseErr> {
2117        let uppercase = value.to_uppercase();
2118        CountryCode::for_alpha3(uppercase.as_ref())
2119    }
2120
2121    /// Attempts to determine the ISO 3166-1 CountryCode for the given unsigned integer
2122    pub fn for_id(value: u32) -> Result<CountryCode, CountryCodeParseErr> {
2123        use CountryCode::*;
2124        use numeric::*;
2125        match value {
2126            ISO_NUM_AFG => Ok(AFG),
2127            ISO_NUM_ALA => Ok(ALA),
2128            ISO_NUM_ALB => Ok(ALB),
2129            ISO_NUM_DZA => Ok(DZA),
2130            ISO_NUM_ASM => Ok(ASM),
2131            ISO_NUM_AND => Ok(AND),
2132            ISO_NUM_AGO => Ok(AGO),
2133            ISO_NUM_AIA => Ok(AIA),
2134            ISO_NUM_ATA => Ok(ATA),
2135            ISO_NUM_ATG => Ok(ATG),
2136            ISO_NUM_ARG => Ok(ARG),
2137            ISO_NUM_ARM => Ok(ARM),
2138            ISO_NUM_ABW => Ok(ABW),
2139            ISO_NUM_AUS => Ok(AUS),
2140            ISO_NUM_AUT => Ok(AUT),
2141            ISO_NUM_AZE => Ok(AZE),
2142            ISO_NUM_BHS => Ok(BHS),
2143            ISO_NUM_BHR => Ok(BHR),
2144            ISO_NUM_BGD => Ok(BGD),
2145            ISO_NUM_BRB => Ok(BRB),
2146            ISO_NUM_BLR => Ok(BLR),
2147            ISO_NUM_BEL => Ok(BEL),
2148            ISO_NUM_BLZ => Ok(BLZ),
2149            ISO_NUM_BEN => Ok(BEN),
2150            ISO_NUM_BMU => Ok(BMU),
2151            ISO_NUM_BTN => Ok(BTN),
2152            ISO_NUM_BOL => Ok(BOL),
2153            ISO_NUM_BES => Ok(BES),
2154            ISO_NUM_BIH => Ok(BIH),
2155            ISO_NUM_BWA => Ok(BWA),
2156            ISO_NUM_BVT => Ok(BVT),
2157            ISO_NUM_BRA => Ok(BRA),
2158            ISO_NUM_IOT => Ok(IOT),
2159            ISO_NUM_BRN => Ok(BRN),
2160            ISO_NUM_BGR => Ok(BGR),
2161            ISO_NUM_BFA => Ok(BFA),
2162            ISO_NUM_BDI => Ok(BDI),
2163            ISO_NUM_CPV => Ok(CPV),
2164            ISO_NUM_KHM => Ok(KHM),
2165            ISO_NUM_CMR => Ok(CMR),
2166            ISO_NUM_CAN => Ok(CAN),
2167            ISO_NUM_CYM => Ok(CYM),
2168            ISO_NUM_CAF => Ok(CAF),
2169            ISO_NUM_TCD => Ok(TCD),
2170            ISO_NUM_CHL => Ok(CHL),
2171            ISO_NUM_CHN => Ok(CHN),
2172            ISO_NUM_CXR => Ok(CXR),
2173            ISO_NUM_CCK => Ok(CCK),
2174            ISO_NUM_COL => Ok(COL),
2175            ISO_NUM_COM => Ok(COM),
2176            ISO_NUM_COG => Ok(COG),
2177            ISO_NUM_COD => Ok(COD),
2178            ISO_NUM_COK => Ok(COK),
2179            ISO_NUM_CRI => Ok(CRI),
2180            ISO_NUM_CIV => Ok(CIV),
2181            ISO_NUM_HRV => Ok(HRV),
2182            ISO_NUM_CUB => Ok(CUB),
2183            ISO_NUM_CUW => Ok(CUW),
2184            ISO_NUM_CYP => Ok(CYP),
2185            ISO_NUM_CZE => Ok(CZE),
2186            ISO_NUM_DNK => Ok(DNK),
2187            ISO_NUM_DJI => Ok(DJI),
2188            ISO_NUM_DMA => Ok(DMA),
2189            ISO_NUM_DOM => Ok(DOM),
2190            ISO_NUM_ECU => Ok(ECU),
2191            ISO_NUM_EGY => Ok(EGY),
2192            ISO_NUM_SLV => Ok(SLV),
2193            ISO_NUM_GNQ => Ok(GNQ),
2194            ISO_NUM_ERI => Ok(ERI),
2195            ISO_NUM_EST => Ok(EST),
2196            ISO_NUM_ETH => Ok(ETH),
2197            ISO_NUM_FLK => Ok(FLK),
2198            ISO_NUM_FRO => Ok(FRO),
2199            ISO_NUM_FJI => Ok(FJI),
2200            ISO_NUM_FIN => Ok(FIN),
2201            ISO_NUM_FRA => Ok(FRA),
2202            ISO_NUM_GUF => Ok(GUF),
2203            ISO_NUM_PYF => Ok(PYF),
2204            ISO_NUM_ATF => Ok(ATF),
2205            ISO_NUM_GAB => Ok(GAB),
2206            ISO_NUM_GMB => Ok(GMB),
2207            ISO_NUM_GEO => Ok(GEO),
2208            ISO_NUM_DEU => Ok(DEU),
2209            ISO_NUM_GHA => Ok(GHA),
2210            ISO_NUM_GIB => Ok(GIB),
2211            ISO_NUM_GRC => Ok(GRC),
2212            ISO_NUM_GRL => Ok(GRL),
2213            ISO_NUM_GRD => Ok(GRD),
2214            ISO_NUM_GLP => Ok(GLP),
2215            ISO_NUM_GUM => Ok(GUM),
2216            ISO_NUM_GTM => Ok(GTM),
2217            ISO_NUM_GGY => Ok(GGY),
2218            ISO_NUM_GIN => Ok(GIN),
2219            ISO_NUM_GNB => Ok(GNB),
2220            ISO_NUM_GUY => Ok(GUY),
2221            ISO_NUM_HTI => Ok(HTI),
2222            ISO_NUM_HMD => Ok(HMD),
2223            ISO_NUM_VAT => Ok(VAT),
2224            ISO_NUM_HND => Ok(HND),
2225            ISO_NUM_HKG => Ok(HKG),
2226            ISO_NUM_HUN => Ok(HUN),
2227            ISO_NUM_ISL => Ok(ISL),
2228            ISO_NUM_IND => Ok(IND),
2229            ISO_NUM_IDN => Ok(IDN),
2230            ISO_NUM_IRN => Ok(IRN),
2231            ISO_NUM_IRQ => Ok(IRQ),
2232            ISO_NUM_IRL => Ok(IRL),
2233            ISO_NUM_IMN => Ok(IMN),
2234            ISO_NUM_ISR => Ok(ISR),
2235            ISO_NUM_ITA => Ok(ITA),
2236            ISO_NUM_JAM => Ok(JAM),
2237            ISO_NUM_JPN => Ok(JPN),
2238            ISO_NUM_JEY => Ok(JEY),
2239            ISO_NUM_JOR => Ok(JOR),
2240            ISO_NUM_KAZ => Ok(KAZ),
2241            ISO_NUM_KEN => Ok(KEN),
2242            ISO_NUM_KIR => Ok(KIR),
2243            ISO_NUM_PRK => Ok(PRK),
2244            ISO_NUM_KOR => Ok(KOR),
2245            ISO_NUM_KWT => Ok(KWT),
2246            ISO_NUM_KGZ => Ok(KGZ),
2247            ISO_NUM_LAO => Ok(LAO),
2248            ISO_NUM_LVA => Ok(LVA),
2249            ISO_NUM_LBN => Ok(LBN),
2250            ISO_NUM_LSO => Ok(LSO),
2251            ISO_NUM_LBR => Ok(LBR),
2252            ISO_NUM_LBY => Ok(LBY),
2253            ISO_NUM_LIE => Ok(LIE),
2254            ISO_NUM_LTU => Ok(LTU),
2255            ISO_NUM_LUX => Ok(LUX),
2256            ISO_NUM_MAC => Ok(MAC),
2257            ISO_NUM_MKD => Ok(MKD),
2258            ISO_NUM_MDG => Ok(MDG),
2259            ISO_NUM_MWI => Ok(MWI),
2260            ISO_NUM_MYS => Ok(MYS),
2261            ISO_NUM_MDV => Ok(MDV),
2262            ISO_NUM_MLI => Ok(MLI),
2263            ISO_NUM_MLT => Ok(MLT),
2264            ISO_NUM_MHL => Ok(MHL),
2265            ISO_NUM_MTQ => Ok(MTQ),
2266            ISO_NUM_MRT => Ok(MRT),
2267            ISO_NUM_MUS => Ok(MUS),
2268            ISO_NUM_MYT => Ok(MYT),
2269            ISO_NUM_MEX => Ok(MEX),
2270            ISO_NUM_FSM => Ok(FSM),
2271            ISO_NUM_MDA => Ok(MDA),
2272            ISO_NUM_MCO => Ok(MCO),
2273            ISO_NUM_MNG => Ok(MNG),
2274            ISO_NUM_MNE => Ok(MNE),
2275            ISO_NUM_MSR => Ok(MSR),
2276            ISO_NUM_MAR => Ok(MAR),
2277            ISO_NUM_MOZ => Ok(MOZ),
2278            ISO_NUM_MMR => Ok(MMR),
2279            ISO_NUM_NAM => Ok(NAM),
2280            ISO_NUM_NRU => Ok(NRU),
2281            ISO_NUM_NPL => Ok(NPL),
2282            ISO_NUM_NLD => Ok(NLD),
2283            ISO_NUM_NCL => Ok(NCL),
2284            ISO_NUM_NZL => Ok(NZL),
2285            ISO_NUM_NIC => Ok(NIC),
2286            ISO_NUM_NER => Ok(NER),
2287            ISO_NUM_NGA => Ok(NGA),
2288            ISO_NUM_NIU => Ok(NIU),
2289            ISO_NUM_NFK => Ok(NFK),
2290            ISO_NUM_MNP => Ok(MNP),
2291            ISO_NUM_NOR => Ok(NOR),
2292            ISO_NUM_OMN => Ok(OMN),
2293            ISO_NUM_PAK => Ok(PAK),
2294            ISO_NUM_PLW => Ok(PLW),
2295            ISO_NUM_PSE => Ok(PSE),
2296            ISO_NUM_PAN => Ok(PAN),
2297            ISO_NUM_PNG => Ok(PNG),
2298            ISO_NUM_PRY => Ok(PRY),
2299            ISO_NUM_PER => Ok(PER),
2300            ISO_NUM_PHL => Ok(PHL),
2301            ISO_NUM_PCN => Ok(PCN),
2302            ISO_NUM_POL => Ok(POL),
2303            ISO_NUM_PRT => Ok(PRT),
2304            ISO_NUM_PRI => Ok(PRI),
2305            ISO_NUM_QAT => Ok(QAT),
2306            ISO_NUM_REU => Ok(REU),
2307            ISO_NUM_ROU => Ok(ROU),
2308            ISO_NUM_RUS => Ok(RUS),
2309            ISO_NUM_RWA => Ok(RWA),
2310            ISO_NUM_BLM => Ok(BLM),
2311            ISO_NUM_SHN => Ok(SHN),
2312            ISO_NUM_KNA => Ok(KNA),
2313            ISO_NUM_LCA => Ok(LCA),
2314            ISO_NUM_MAF => Ok(MAF),
2315            ISO_NUM_SPM => Ok(SPM),
2316            ISO_NUM_VCT => Ok(VCT),
2317            ISO_NUM_WSM => Ok(WSM),
2318            ISO_NUM_SMR => Ok(SMR),
2319            ISO_NUM_STP => Ok(STP),
2320            ISO_NUM_SAU => Ok(SAU),
2321            ISO_NUM_SEN => Ok(SEN),
2322            ISO_NUM_SRB => Ok(SRB),
2323            ISO_NUM_SYC => Ok(SYC),
2324            ISO_NUM_SLE => Ok(SLE),
2325            ISO_NUM_SGP => Ok(SGP),
2326            ISO_NUM_SXM => Ok(SXM),
2327            ISO_NUM_SVK => Ok(SVK),
2328            ISO_NUM_SVN => Ok(SVN),
2329            ISO_NUM_SLB => Ok(SLB),
2330            ISO_NUM_SOM => Ok(SOM),
2331            ISO_NUM_ZAF => Ok(ZAF),
2332            ISO_NUM_SGS => Ok(SGS),
2333            ISO_NUM_SSD => Ok(SSD),
2334            ISO_NUM_ESP => Ok(ESP),
2335            ISO_NUM_LKA => Ok(LKA),
2336            ISO_NUM_SDN => Ok(SDN),
2337            ISO_NUM_SUR => Ok(SUR),
2338            ISO_NUM_SJM => Ok(SJM),
2339            ISO_NUM_SWZ => Ok(SWZ),
2340            ISO_NUM_SWE => Ok(SWE),
2341            ISO_NUM_CHE => Ok(CHE),
2342            ISO_NUM_SYR => Ok(SYR),
2343            ISO_NUM_TWN => Ok(TWN),
2344            ISO_NUM_TJK => Ok(TJK),
2345            ISO_NUM_TZA => Ok(TZA),
2346            ISO_NUM_THA => Ok(THA),
2347            ISO_NUM_TLS => Ok(TLS),
2348            ISO_NUM_TGO => Ok(TGO),
2349            ISO_NUM_TKL => Ok(TKL),
2350            ISO_NUM_TON => Ok(TON),
2351            ISO_NUM_TTO => Ok(TTO),
2352            ISO_NUM_TUN => Ok(TUN),
2353            ISO_NUM_TUR => Ok(TUR),
2354            ISO_NUM_TKM => Ok(TKM),
2355            ISO_NUM_TCA => Ok(TCA),
2356            ISO_NUM_TUV => Ok(TUV),
2357            ISO_NUM_UGA => Ok(UGA),
2358            ISO_NUM_UKR => Ok(UKR),
2359            ISO_NUM_ARE => Ok(ARE),
2360            ISO_NUM_GBR => Ok(GBR),
2361            ISO_NUM_USA => Ok(USA),
2362            ISO_NUM_UMI => Ok(UMI),
2363            ISO_NUM_URY => Ok(URY),
2364            ISO_NUM_UZB => Ok(UZB),
2365            ISO_NUM_VUT => Ok(VUT),
2366            ISO_NUM_VEN => Ok(VEN),
2367            ISO_NUM_VNM => Ok(VNM),
2368            ISO_NUM_VGB => Ok(VGB),
2369            ISO_NUM_VIR => Ok(VIR),
2370            ISO_NUM_WLF => Ok(WLF),
2371            ISO_NUM_ESH => Ok(ESH),
2372            ISO_NUM_YEM => Ok(YEM),
2373            ISO_NUM_ZMB => Ok(ZMB),
2374            ISO_NUM_ZWE => Ok(ZWE),
2375            x => Err(CountryCodeParseErr::InvalidID { unknown: x }),
2376        }
2377    }
2378
2379    /// Returns an array of all CountryCode variants, sorted in ascending lexicographic order
2380    /// by the full name of the corresponding country
2381    pub fn as_array() -> &'static [CountryCode; NUM_COUNTRY_CODES] {
2382        &sorted_arrays::CODES_SORTED_DEFAULT
2383    }
2384
2385    /// Returns an array of all CountryCode variants, sorted in ascending lexicographic order
2386    /// by the alpha-2 code for the corresponding country
2387    pub fn as_array_alpha2() -> &'static [CountryCode; NUM_COUNTRY_CODES] {
2388        &sorted_arrays::CODES_SORTED_ALPHA2
2389    }
2390
2391    /// Returns an iterator over all CountryCode variants, sorted in ascending lexicographic order
2392    /// by the alpha-3 code for the corresponding country
2393    pub fn as_array_alpha3() -> &'static [CountryCode; NUM_COUNTRY_CODES] {
2394        &sorted_arrays::CODES_SORTED_ALPHA3
2395    }
2396
2397    /// Returns an iterator over all CountryCode variants, sorted in ascending order
2398    /// by the numeric code for the corresponding country
2399    pub fn as_array_numeric() -> &'static [CountryCode; NUM_COUNTRY_CODES] {
2400        &sorted_arrays::CODES_SORTED_NUMERIC_ID
2401    }
2402
2403    /// Returns an iterator over all CountryCode variants, sorted in ascending lexicographic order
2404    /// by the full name of the corresponding country
2405    pub fn iter() -> impl Iterator<Item = &'static CountryCode> {
2406        sorted_arrays::CODES_SORTED_DEFAULT.iter()
2407    }
2408
2409    /// Returns an iterator over all CountryCode variants, sorted in ascending lexicographic order
2410    /// by the alpha-2 code for the corresponding country
2411    pub fn iter_alpha2() -> impl Iterator<Item = &'static CountryCode> {
2412        sorted_arrays::CODES_SORTED_ALPHA2.iter()
2413    }
2414
2415    /// Returns an iterator over all CountryCode variants, sorted in ascending lexicographic order
2416    /// by the alpha-3 code for the corresponding country
2417    pub fn iter_alpha3() -> impl Iterator<Item = &'static CountryCode> {
2418        sorted_arrays::CODES_SORTED_ALPHA3.iter()
2419    }
2420
2421    /// Returns an iterator over all CountryCode variants, sorted in ascending order
2422    /// by the numeric code for the corresponding country
2423    pub fn iter_numeric() -> impl Iterator<Item = &'static CountryCode> {
2424        sorted_arrays::CODES_SORTED_NUMERIC_ID.iter()
2425    }
2426
2427    /// Returns the number of unique ISO 3166-1 defined country codes currently supported by this
2428    /// library.
2429    pub fn num_country_codes() -> usize {
2430        NUM_COUNTRY_CODES
2431    }
2432}
2433
2434impl Into<u32> for CountryCode {
2435    fn into(self) -> u32 {
2436        self.numeric_id()
2437    }
2438}
2439
2440impl Display for CountryCode {
2441    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
2442        f.write_str(self.name())
2443    }
2444}
2445
2446struct CountryCodeVisitor;
2447
2448impl Serialize for CountryCode {
2449    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
2450      S: Serializer {
2451        serializer.collect_str(self.alpha2())
2452    }
2453}
2454
2455impl<'de> Deserialize<'de> for CountryCode {
2456    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
2457      D: Deserializer<'de> {
2458        deserializer.deserialize_str(CountryCodeVisitor)
2459    }
2460}
2461
2462impl<'de> Visitor<'de> for CountryCodeVisitor {
2463    type Value = CountryCode;
2464
2465    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2466        write!(formatter, "an ISO 3166-1 compliant alpha-2 country code")
2467    }
2468
2469    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
2470        where
2471          E: de::Error,
2472    {
2473        match CountryCode::for_alpha2_caseless(v) {
2474            Ok(x) => Ok(x),
2475            Err(_) => Err(de::Error::invalid_value(de::Unexpected::Str(v), &self)),
2476        }
2477    }
2478
2479    fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
2480        where
2481          E: de::Error,
2482    {
2483        match CountryCode::for_alpha2_caseless(v) {
2484            Ok(x) => Ok(x),
2485            Err(_) => Err(de::Error::invalid_value(de::Unexpected::Str(v), &self)),
2486        }
2487    }
2488}