1country_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 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 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 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 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}