1use crate::currency_code;
4
5currency_code! {
6 #[derive(Debug, Clone)]
7 pub enum CurrencyCode {
8 AED,
9 AFN,
10 ALL,
11 AMD,
12 ANG,
13 AOA,
14 ARS,
15 AUD,
16 AWG,
17 AZN,
18 BAM,
19 BBD,
20 BDT,
21 BGN,
22 BHD,
23 BIF,
24 BMD,
25 BND,
26 BOB,
27 BOV,
28 BRL,
29 BSD,
30 BTN,
31 BWP,
32 BYN,
33 BZD,
34 CAD,
35 CDF,
36 CHE,
37 CHF,
38 CHW,
39 CLF,
40 CLP,
41 CNY,
42 COP,
43 COU,
44 CRC,
45 CUC,
46 CUP,
47 CVE,
48 CZK,
49 DJF,
50 DKK,
51 DOP,
52 DZD,
53 EGP,
54 ERN,
55 ETB,
56 EUR,
57 FJD,
58 FKP,
59 GBP,
60 GEL,
61 GHS,
62 GIP,
63 GMD,
64 GNF,
65 GTQ,
66 GYD,
67 HKD,
68 HNL,
69 HRK,
70 HTG,
71 HUF,
72 IDR,
73 ILS,
74 INR,
75 IQD,
76 IRR,
77 ISK,
78 JMD,
79 JOD,
80 JPY,
81 KES,
82 KGS,
83 KHR,
84 KMF,
85 KPW,
86 KRW,
87 KWD,
88 KYD,
89 KZT,
90 LAK,
91 LBP,
92 LKR,
93 LRD,
94 LSL,
95 LYD,
96 MAD,
97 MDL,
98 MGA,
99 MKD,
100 MMK,
101 MNT,
102 MOP,
103 MRU,
104 MUR,
105 MVR,
106 MWK,
107 MXN,
108 MXV,
109 MYR,
110 MZN,
111 NAD,
112 NGN,
113 NIO,
114 NOK,
115 NPR,
116 NZD,
117 OMR,
118 PAB,
119 PEN,
120 PGK,
121 PHP,
122 PKR,
123 PLN,
124 PYG,
125 QAR,
126 RON,
127 RSD,
128 RUB,
129 RWF,
130 SAR,
131 SBD,
132 SCR,
133 SDG,
134 SEK,
135 SGD,
136 SHP,
137 SLL,
138 SOS,
139 SRD,
140 SSP,
141 STN,
142 SVC,
143 SYP,
144 SZL,
145 THB,
146 TJS,
147 TMT,
148 TND,
149 TOP,
150 TRY,
151 TTD,
152 TWD,
153 TZS,
154 UAH,
155 UGX,
156 USD,
157 USN,
158 UYI,
159 UYU,
160 UYW,
161 UZS,
162 VED,
163 VES,
164 VND,
165 VUV,
166 WST,
167 XAF,
168 XAG,
169 XAU,
170 XBA,
171 XBB,
172 XBC,
173 XBD,
174 XCD,
175 XDR,
176 XOF,
177 XPD,
178 XPF,
179 XPT,
180 XSU,
181 XTS,
182 XUA,
183 XXX,
184 YER,
185 ZAR,
186 ZMW,
187 ZWL,
188 }
189}
190
191#[cfg(test)]
192mod tests {
193 use super::*;
194
195 use alloc::string::ToString as _;
196
197 use csv::Reader;
198
199 #[test]
200 fn test_currency_code() {
201 let mut rdr =
203 Reader::from_reader(include_str!("../tests/ISO_4217/Active_codes.csv").as_bytes());
204
205 let mut n = 0;
206 for record in rdr.records() {
207 let record = record.unwrap();
208 let code = &record[0];
209 let code = &code[0..3];
210 assert_eq!(code.parse::<CurrencyCode>().unwrap().to_string(), code);
211 n += 1;
212 }
213
214 assert_eq!(CurrencyCode::VARS.len(), n);
215
216 assert_eq!(
218 "ZZZ".parse::<CurrencyCode>().unwrap(),
219 CurrencyCode::Other("ZZZ".into())
220 );
221 assert_eq!(
222 "x".parse::<CurrencyCode>().err().unwrap(),
223 crate::error::ParseError::Invalid("x".into())
224 );
225 #[cfg(feature = "std")]
226 {
227 std::println!("{}", "x".parse::<CurrencyCode>().err().unwrap());
228 }
229
230 assert_eq!(CurrencyCode::USD, CurrencyCode::USD);
232 assert_eq!(CurrencyCode::USD, CurrencyCode::Other("USD".into()));
233 assert_eq!(CurrencyCode::USD, "USD");
234
235 #[cfg(feature = "std")]
236 {
237 let mut h = std::collections::HashSet::new();
239 h.insert(CurrencyCode::USD);
240 h.insert(CurrencyCode::Other("USD".into()));
241 assert_eq!(h.len(), 1);
242 }
243
244 #[cfg(feature = "serde")]
245 {
246 #[derive(serde::Serialize, serde::Deserialize)]
247 struct Foo {
248 code: CurrencyCode,
249 }
250
251 assert_eq!(
252 serde_json::from_str::<Foo>(r#"{"code":"USD"}"#)
253 .unwrap()
254 .code,
255 CurrencyCode::USD
256 );
257 assert_eq!(
258 serde_json::to_string(&Foo {
259 code: CurrencyCode::USD
260 })
261 .unwrap(),
262 r#"{"code":"USD"}"#
263 );
264 }
265 }
266}