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