country_code/iso3166_1/
alpha_2.rs

1//! [ISO 3166-1 alpha-2 - Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
2
3//
4country_code! {
5    length = 2;
6    #[derive(Debug, Clone)]
7    pub enum CountryCode {
8        AD,
9        AE,
10        AF,
11        AG,
12        AI,
13        AL,
14        AM,
15        AO,
16        AQ,
17        AR,
18        AS,
19        AT,
20        AU,
21        AW,
22        AX,
23        AZ,
24        BA,
25        BB,
26        BD,
27        BE,
28        BF,
29        BG,
30        BH,
31        BI,
32        BJ,
33        BL,
34        BM,
35        BN,
36        BO,
37        BQ,
38        BR,
39        BS,
40        BT,
41        BV,
42        BW,
43        BY,
44        BZ,
45        CA,
46        CC,
47        CD,
48        CF,
49        CG,
50        CH,
51        CI,
52        CK,
53        CL,
54        CM,
55        CN,
56        CO,
57        CR,
58        CU,
59        CV,
60        CW,
61        CX,
62        CY,
63        CZ,
64        DE,
65        DJ,
66        DK,
67        DM,
68        DO,
69        DZ,
70        EC,
71        EE,
72        EG,
73        EH,
74        ER,
75        ES,
76        ET,
77        FI,
78        FJ,
79        FK,
80        FM,
81        FO,
82        FR,
83        GA,
84        GB,
85        GD,
86        GE,
87        GF,
88        GG,
89        GH,
90        GI,
91        GL,
92        GM,
93        GN,
94        GP,
95        GQ,
96        GR,
97        GS,
98        GT,
99        GU,
100        GW,
101        GY,
102        HK,
103        HM,
104        HN,
105        HR,
106        HT,
107        HU,
108        ID,
109        IE,
110        IL,
111        IM,
112        IN,
113        IO,
114        IQ,
115        IR,
116        IS,
117        IT,
118        JE,
119        JM,
120        JO,
121        JP,
122        KE,
123        KG,
124        KH,
125        KI,
126        KM,
127        KN,
128        KP,
129        KR,
130        KW,
131        KY,
132        KZ,
133        LA,
134        LB,
135        LC,
136        LI,
137        LK,
138        LR,
139        LS,
140        LT,
141        LU,
142        LV,
143        LY,
144        MA,
145        MC,
146        MD,
147        ME,
148        MF,
149        MG,
150        MH,
151        MK,
152        ML,
153        MM,
154        MN,
155        MO,
156        MP,
157        MQ,
158        MR,
159        MS,
160        MT,
161        MU,
162        MV,
163        MW,
164        MX,
165        MY,
166        MZ,
167        NA,
168        NC,
169        NE,
170        NF,
171        NG,
172        NI,
173        NL,
174        NO,
175        NP,
176        NR,
177        NU,
178        NZ,
179        OM,
180        PA,
181        PE,
182        PF,
183        PG,
184        PH,
185        PK,
186        PL,
187        PM,
188        PN,
189        PR,
190        PS,
191        PT,
192        PW,
193        PY,
194        QA,
195        RE,
196        RO,
197        RS,
198        RU,
199        RW,
200        SA,
201        SB,
202        SC,
203        SD,
204        SE,
205        SG,
206        SH,
207        SI,
208        SJ,
209        SK,
210        SL,
211        SM,
212        SN,
213        SO,
214        SR,
215        SS,
216        ST,
217        SV,
218        SX,
219        SY,
220        SZ,
221        TC,
222        TD,
223        TF,
224        TG,
225        TH,
226        TJ,
227        TK,
228        TL,
229        TM,
230        TN,
231        TO,
232        TR,
233        TT,
234        TV,
235        TW,
236        TZ,
237        UA,
238        UG,
239        UM,
240        US,
241        UY,
242        UZ,
243        VA,
244        VC,
245        VE,
246        VG,
247        VI,
248        VN,
249        VU,
250        WF,
251        WS,
252        YE,
253        YT,
254        ZA,
255        ZM,
256        ZW,
257    }
258}
259
260#[cfg(test)]
261mod tests {
262    use super::*;
263
264    use alloc::string::ToString as _;
265
266    use csv::Reader;
267
268    #[test]
269    fn test_country_code() {
270        // Wikipedia
271        let mut rdr = Reader::from_reader(
272            include_str!("../../tests/ISO_3166-1_alpha-2/Officially_assigned_code_elements.csv")
273                .as_bytes(),
274        );
275
276        let mut n = 0;
277        for record in rdr.records() {
278            let record = record.unwrap();
279            let code = &record[0];
280            assert_eq!(code.parse::<CountryCode>().unwrap().to_string(), code);
281            n += 1;
282        }
283
284        assert_eq!(CountryCode::VARS.len(), n);
285
286        // FromStr
287        assert_eq!(
288            "ZZ".parse::<CountryCode>().unwrap(),
289            CountryCode::Other("ZZ".into())
290        );
291        assert_eq!(
292            "x".parse::<CountryCode>().err().unwrap(),
293            crate::error::ParseError::Invalid("x".into())
294        );
295        #[cfg(feature = "std")]
296        {
297            std::println!("{}", "x".parse::<CountryCode>().err().unwrap());
298        }
299
300        // PartialEq
301        assert_eq!(CountryCode::US, CountryCode::US);
302        assert_eq!(CountryCode::US, "US");
303
304        match CountryCode::US {
305            x if x == "US" => {}
306            _ => panic!(),
307        }
308
309        #[cfg(feature = "std")]
310        {
311            // Hash
312            let mut h = std::collections::HashSet::new();
313            h.insert(CountryCode::US);
314            h.insert(CountryCode::Other("US".into()));
315            assert_eq!(h.len(), 1);
316        }
317
318        #[cfg(feature = "serde")]
319        {
320            #[derive(serde::Serialize, serde::Deserialize)]
321            struct Foo {
322                code: CountryCode,
323            }
324
325            assert_eq!(
326                serde_json::from_str::<Foo>(r#"{"code":"US"}"#)
327                    .unwrap()
328                    .code,
329                CountryCode::US
330            );
331            assert_eq!(
332                serde_json::to_string(&Foo {
333                    code: CountryCode::US
334                })
335                .unwrap(),
336                r#"{"code":"US"}"#
337            );
338        }
339    }
340}