country_code/iso3166_1/
alpha_3.rs

1//! [ISO 3166-1 alpha-3 - Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)
2
3//
4country_code! {
5    length = 3;
6    #[derive(Debug, Clone)]
7    pub enum CountryCode {
8        ABW,
9        AFG,
10        AGO,
11        AIA,
12        ALA,
13        ALB,
14        AND,
15        ARE,
16        ARG,
17        ARM,
18        ASM,
19        ATA,
20        ATF,
21        ATG,
22        AUS,
23        AUT,
24        AZE,
25        BDI,
26        BEL,
27        BEN,
28        BES,
29        BFA,
30        BGD,
31        BGR,
32        BHR,
33        BHS,
34        BIH,
35        BLM,
36        BLR,
37        BLZ,
38        BMU,
39        BOL,
40        BRA,
41        BRB,
42        BRN,
43        BTN,
44        BVT,
45        BWA,
46        CAF,
47        CAN,
48        CCK,
49        CHE,
50        CHL,
51        CHN,
52        CIV,
53        CMR,
54        COD,
55        COG,
56        COK,
57        COL,
58        COM,
59        CPV,
60        CRI,
61        CUB,
62        CUW,
63        CXR,
64        CYM,
65        CYP,
66        CZE,
67        DEU,
68        DJI,
69        DMA,
70        DNK,
71        DOM,
72        DZA,
73        ECU,
74        EGY,
75        ERI,
76        ESH,
77        ESP,
78        EST,
79        ETH,
80        FIN,
81        FJI,
82        FLK,
83        FRA,
84        FRO,
85        FSM,
86        GAB,
87        GBR,
88        GEO,
89        GGY,
90        GHA,
91        GIB,
92        GIN,
93        GLP,
94        GMB,
95        GNB,
96        GNQ,
97        GRC,
98        GRD,
99        GRL,
100        GTM,
101        GUF,
102        GUM,
103        GUY,
104        HKG,
105        HMD,
106        HND,
107        HRV,
108        HTI,
109        HUN,
110        IDN,
111        IMN,
112        IND,
113        IOT,
114        IRL,
115        IRN,
116        IRQ,
117        ISL,
118        ISR,
119        ITA,
120        JAM,
121        JEY,
122        JOR,
123        JPN,
124        KAZ,
125        KEN,
126        KGZ,
127        KHM,
128        KIR,
129        KNA,
130        KOR,
131        KWT,
132        LAO,
133        LBN,
134        LBR,
135        LBY,
136        LCA,
137        LIE,
138        LKA,
139        LSO,
140        LTU,
141        LUX,
142        LVA,
143        MAC,
144        MAF,
145        MAR,
146        MCO,
147        MDA,
148        MDG,
149        MDV,
150        MEX,
151        MHL,
152        MKD,
153        MLI,
154        MLT,
155        MMR,
156        MNE,
157        MNG,
158        MNP,
159        MOZ,
160        MRT,
161        MSR,
162        MTQ,
163        MUS,
164        MWI,
165        MYS,
166        MYT,
167        NAM,
168        NCL,
169        NER,
170        NFK,
171        NGA,
172        NIC,
173        NIU,
174        NLD,
175        NOR,
176        NPL,
177        NRU,
178        NZL,
179        OMN,
180        PAK,
181        PAN,
182        PCN,
183        PER,
184        PHL,
185        PLW,
186        PNG,
187        POL,
188        PRI,
189        PRK,
190        PRT,
191        PRY,
192        PSE,
193        PYF,
194        QAT,
195        REU,
196        ROU,
197        RUS,
198        RWA,
199        SAU,
200        SDN,
201        SEN,
202        SGP,
203        SGS,
204        SHN,
205        SJM,
206        SLB,
207        SLE,
208        SLV,
209        SMR,
210        SOM,
211        SPM,
212        SRB,
213        SSD,
214        STP,
215        SUR,
216        SVK,
217        SVN,
218        SWE,
219        SWZ,
220        SXM,
221        SYC,
222        SYR,
223        TCA,
224        TCD,
225        TGO,
226        THA,
227        TJK,
228        TKL,
229        TKM,
230        TLS,
231        TON,
232        TTO,
233        TUN,
234        TUR,
235        TUV,
236        TWN,
237        TZA,
238        UGA,
239        UKR,
240        UMI,
241        URY,
242        USA,
243        UZB,
244        VAT,
245        VCT,
246        VEN,
247        VGB,
248        VIR,
249        VNM,
250        VUT,
251        WLF,
252        WSM,
253        YEM,
254        ZAF,
255        ZMB,
256        ZWE,
257    }
258}
259
260#[cfg(test)]
261mod tests {
262    use super::*;
263
264    use alloc::string::ToString as _;
265
266    use csv::ReaderBuilder;
267
268    #[test]
269    fn test_country_code() {
270        // Wikipedia
271        let mut rdr = ReaderBuilder::new()
272            .has_headers(false)
273            .delimiter(b' ')
274            .flexible(true)
275            .from_reader(
276                include_str!(
277                    "../../tests/ISO_3166-1_alpha-3/Officially_assigned_code_elements.txt"
278                )
279                .as_bytes(),
280            );
281
282        let mut n = 0;
283        for record in rdr.records() {
284            let record = record.unwrap();
285            let code = &record[0];
286            assert_eq!(code.parse::<CountryCode>().unwrap().to_string(), code);
287            n += 1;
288        }
289
290        assert_eq!(CountryCode::VARS.len(), n);
291
292        // FromStr
293        assert_eq!(
294            "ZZZ".parse::<CountryCode>().unwrap(),
295            CountryCode::Other("ZZZ".into())
296        );
297        assert_eq!(
298            "x".parse::<CountryCode>().err().unwrap(),
299            crate::error::ParseError::Invalid("x".into())
300        );
301        #[cfg(feature = "std")]
302        {
303            std::println!("{}", "x".parse::<CountryCode>().err().unwrap());
304        }
305
306        // PartialEq
307        assert_eq!(CountryCode::USA, CountryCode::USA);
308        assert_eq!(CountryCode::USA, "USA");
309
310        match CountryCode::USA {
311            x if x == "USA" => {}
312            _ => panic!(),
313        }
314
315        #[cfg(feature = "std")]
316        {
317            // Hash
318            let mut h = std::collections::HashSet::new();
319            h.insert(CountryCode::USA);
320            h.insert(CountryCode::Other("USA".into()));
321            assert_eq!(h.len(), 1);
322        }
323
324        #[cfg(feature = "serde")]
325        {
326            #[derive(serde::Serialize, serde::Deserialize)]
327            struct Foo {
328                code: CountryCode,
329            }
330
331            assert_eq!(
332                serde_json::from_str::<Foo>(r#"{"code":"USA"}"#)
333                    .unwrap()
334                    .code,
335                CountryCode::USA
336            );
337            assert_eq!(
338                serde_json::to_string(&Foo {
339                    code: CountryCode::USA
340                })
341                .unwrap(),
342                r#"{"code":"USA"}"#
343            );
344        }
345    }
346}