1#![allow(missing_docs)]
2
3use std::convert::Infallible;
4use std::str::FromStr;
5
6use serde::Serialize;
7
8#[derive(Clone, Debug, Eq, Serialize, PartialEq, Hash, Default)]
12pub enum Currency {
13 #[serde(rename = "byn")]
14 BYN, #[serde(rename = "mmk")]
16 MMK, #[serde(rename = "aed")]
18 AED, #[serde(rename = "afn")]
20 AFN, #[serde(rename = "all")]
22 ALL, #[serde(rename = "amd")]
24 AMD, #[serde(rename = "ang")]
26 ANG, #[serde(rename = "aoa")]
28 AOA, #[serde(rename = "ars")]
30 ARS, #[serde(rename = "aud")]
32 AUD, #[serde(rename = "awg")]
34 AWG, #[serde(rename = "azn")]
36 AZN, #[serde(rename = "bam")]
38 BAM, #[serde(rename = "bbd")]
40 BBD, #[serde(rename = "bdt")]
42 BDT, #[serde(rename = "bgn")]
44 BGN, #[serde(rename = "bif")]
46 BIF, #[serde(rename = "bmd")]
48 BMD, #[serde(rename = "bnd")]
50 BND, #[serde(rename = "bob")]
52 BOB, #[serde(rename = "brl")]
54 BRL, #[serde(rename = "bsd")]
56 BSD, #[serde(rename = "bwp")]
58 BWP, #[serde(rename = "bzd")]
60 BZD, #[serde(rename = "cad")]
62 CAD, #[serde(rename = "cdf")]
64 CDF, #[serde(rename = "chf")]
66 CHF, #[serde(rename = "clp")]
68 CLP, #[serde(rename = "cny")]
70 CNY, #[serde(rename = "cop")]
72 COP, #[serde(rename = "crc")]
74 CRC, #[serde(rename = "cve")]
76 CVE, #[serde(rename = "czk")]
78 CZK, #[serde(rename = "djf")]
80 DJF, #[serde(rename = "dkk")]
82 DKK, #[serde(rename = "dop")]
84 DOP, #[serde(rename = "dzd")]
86 DZD, #[serde(rename = "eek")]
88 EEK, #[serde(rename = "egp")]
90 EGP, #[serde(rename = "etb")]
92 ETB, #[serde(rename = "eur")]
94 EUR, #[serde(rename = "fjd")]
96 FJD, #[serde(rename = "fkp")]
98 FKP, #[serde(rename = "gbp")]
100 GBP, #[serde(rename = "gel")]
102 GEL, #[serde(rename = "gip")]
104 GIP, #[serde(rename = "gmd")]
106 GMD, #[serde(rename = "gnf")]
108 GNF, #[serde(rename = "gtq")]
110 GTQ, #[serde(rename = "gyd")]
112 GYD, #[serde(rename = "hkd")]
114 HKD, #[serde(rename = "hnl")]
116 HNL, #[serde(rename = "hrk")]
118 HRK, #[serde(rename = "htg")]
120 HTG, #[serde(rename = "huf")]
122 HUF, #[serde(rename = "idr")]
124 IDR, #[serde(rename = "ils")]
126 ILS, #[serde(rename = "inr")]
128 INR, #[serde(rename = "isk")]
130 ISK, #[serde(rename = "jmd")]
132 JMD, #[serde(rename = "jpy")]
134 JPY, #[serde(rename = "kes")]
136 KES, #[serde(rename = "kgs")]
138 KGS, #[serde(rename = "khr")]
140 KHR, #[serde(rename = "kmf")]
142 KMF, #[serde(rename = "krw")]
144 KRW, #[serde(rename = "kyd")]
146 KYD, #[serde(rename = "kzt")]
148 KZT, #[serde(rename = "lak")]
150 LAK, #[serde(rename = "lbp")]
152 LBP, #[serde(rename = "lkr")]
154 LKR, #[serde(rename = "lrd")]
156 LRD, #[serde(rename = "lsl")]
158 LSL, #[serde(rename = "ltl")]
160 LTL, #[serde(rename = "lvl")]
162 LVL, #[serde(rename = "mad")]
164 MAD, #[serde(rename = "mdl")]
166 MDL, #[serde(rename = "mga")]
168 MGA, #[serde(rename = "mkd")]
170 MKD, #[serde(rename = "mnt")]
172 MNT, #[serde(rename = "mop")]
174 MOP, #[serde(rename = "mro")]
176 MRO, #[serde(rename = "mur")]
178 MUR, #[serde(rename = "mvr")]
180 MVR, #[serde(rename = "mwk")]
182 MWK, #[serde(rename = "mxn")]
184 MXN, #[serde(rename = "myr")]
186 MYR, #[serde(rename = "mzn")]
188 MZN, #[serde(rename = "nad")]
190 NAD, #[serde(rename = "ngn")]
192 NGN, #[serde(rename = "nio")]
194 NIO, #[serde(rename = "nok")]
196 NOK, #[serde(rename = "npr")]
198 NPR, #[serde(rename = "nzd")]
200 NZD, #[serde(rename = "pab")]
202 PAB, #[serde(rename = "pen")]
204 PEN, #[serde(rename = "pgk")]
206 PGK, #[serde(rename = "php")]
208 PHP, #[serde(rename = "pkr")]
210 PKR, #[serde(rename = "pln")]
212 PLN, #[serde(rename = "pyg")]
214 PYG, #[serde(rename = "qar")]
216 QAR, #[serde(rename = "ron")]
218 RON, #[serde(rename = "rsd")]
220 RSD, #[serde(rename = "rub")]
222 RUB, #[serde(rename = "rwf")]
224 RWF, #[serde(rename = "sar")]
226 SAR, #[serde(rename = "sbd")]
228 SBD, #[serde(rename = "scr")]
230 SCR, #[serde(rename = "sek")]
232 SEK, #[serde(rename = "sgd")]
234 SGD, #[serde(rename = "shp")]
236 SHP, #[serde(rename = "sll")]
238 SLL, #[serde(rename = "sos")]
240 SOS, #[serde(rename = "srd")]
242 SRD, #[serde(rename = "std")]
244 STD, #[serde(rename = "svc")]
246 SVC, #[serde(rename = "szl")]
248 SZL, #[serde(rename = "thb")]
250 THB, #[serde(rename = "tjs")]
252 TJS, #[serde(rename = "top")]
254 TOP, #[serde(rename = "try")]
256 TRY, #[serde(rename = "ttd")]
258 TTD, #[serde(rename = "twd")]
260 TWD, #[serde(rename = "tzs")]
262 TZS, #[serde(rename = "uah")]
264 UAH, #[serde(rename = "ugx")]
266 UGX, #[serde(rename = "usd")]
268 #[default]
269 USD, #[serde(rename = "uyu")]
271 UYU, #[serde(rename = "uzs")]
273 UZS, #[serde(rename = "vef")]
275 VEF, #[serde(rename = "vnd")]
277 VND, #[serde(rename = "vuv")]
279 VUV, #[serde(rename = "wst")]
281 WST, #[serde(rename = "xaf")]
283 XAF, #[serde(rename = "xcd")]
285 XCD, #[serde(rename = "xof")]
287 XOF, #[serde(rename = "xpf")]
289 XPF, #[serde(rename = "yer")]
291 YER, #[serde(rename = "zar")]
293 ZAR, #[serde(rename = "zmw")]
295 ZMW, #[serde(untagged)]
297 Unknown(String),
298}
299
300impl std::fmt::Display for Currency {
301 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
302 write!(f, "{}", format!("{self:?}").to_ascii_lowercase())
303 }
304}
305
306miniserde::make_place!(Place);
307
308impl miniserde::Deserialize for Currency {
309 fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
310 Place::new(out)
311 }
312}
313
314impl miniserde::de::Visitor for Place<Currency> {
315 fn string(&mut self, s: &str) -> miniserde::Result<()> {
316 self.out = Some(Currency::from_str(s).unwrap());
317 Ok(())
318 }
319}
320
321#[cfg(feature = "deserialize")]
322impl<'de> serde::Deserialize<'de> for Currency {
323 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
324 use std::str::FromStr;
325 let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
326 Ok(Self::from_str(&s).unwrap())
327 }
328}
329
330impl std::str::FromStr for Currency {
331 type Err = Infallible;
332 fn from_str(s: &str) -> Result<Self, Self::Err> {
333 match s {
334 "byn" => Ok(Currency::BYN),
335 "mmk" => Ok(Currency::MMK),
336 "aed" => Ok(Currency::AED),
337 "afn" => Ok(Currency::AFN),
338 "all" => Ok(Currency::ALL),
339 "amd" => Ok(Currency::AMD),
340 "ang" => Ok(Currency::ANG),
341 "aoa" => Ok(Currency::AOA),
342 "ars" => Ok(Currency::ARS),
343 "aud" => Ok(Currency::AUD),
344 "awg" => Ok(Currency::AWG),
345 "azn" => Ok(Currency::AZN),
346 "bam" => Ok(Currency::BAM),
347 "bbd" => Ok(Currency::BBD),
348 "bdt" => Ok(Currency::BDT),
349 "bgn" => Ok(Currency::BGN),
350 "bif" => Ok(Currency::BIF),
351 "bmd" => Ok(Currency::BMD),
352 "bnd" => Ok(Currency::BND),
353 "bob" => Ok(Currency::BOB),
354 "brl" => Ok(Currency::BRL),
355 "bsd" => Ok(Currency::BSD),
356 "bwp" => Ok(Currency::BWP),
357 "bzd" => Ok(Currency::BZD),
358 "cad" => Ok(Currency::CAD),
359 "cdf" => Ok(Currency::CDF),
360 "chf" => Ok(Currency::CHF),
361 "clp" => Ok(Currency::CLP),
362 "cny" => Ok(Currency::CNY),
363 "cop" => Ok(Currency::COP),
364 "crc" => Ok(Currency::CRC),
365 "cve" => Ok(Currency::CVE),
366 "czk" => Ok(Currency::CZK),
367 "djf" => Ok(Currency::DJF),
368 "dkk" => Ok(Currency::DKK),
369 "dop" => Ok(Currency::DOP),
370 "dzd" => Ok(Currency::DZD),
371 "eek" => Ok(Currency::EEK),
372 "egp" => Ok(Currency::EGP),
373 "etb" => Ok(Currency::ETB),
374 "eur" => Ok(Currency::EUR),
375 "fjd" => Ok(Currency::FJD),
376 "fkp" => Ok(Currency::FKP),
377 "gbp" => Ok(Currency::GBP),
378 "gel" => Ok(Currency::GEL),
379 "gip" => Ok(Currency::GIP),
380 "gmd" => Ok(Currency::GMD),
381 "gnf" => Ok(Currency::GNF),
382 "gtq" => Ok(Currency::GTQ),
383 "gyd" => Ok(Currency::GYD),
384 "hkd" => Ok(Currency::HKD),
385 "hnl" => Ok(Currency::HNL),
386 "hrk" => Ok(Currency::HRK),
387 "htg" => Ok(Currency::HTG),
388 "huf" => Ok(Currency::HUF),
389 "idr" => Ok(Currency::IDR),
390 "ils" => Ok(Currency::ILS),
391 "inr" => Ok(Currency::INR),
392 "isk" => Ok(Currency::ISK),
393 "jmd" => Ok(Currency::JMD),
394 "jpy" => Ok(Currency::JPY),
395 "kes" => Ok(Currency::KES),
396 "kgs" => Ok(Currency::KGS),
397 "khr" => Ok(Currency::KHR),
398 "kmf" => Ok(Currency::KMF),
399 "krw" => Ok(Currency::KRW),
400 "kyd" => Ok(Currency::KYD),
401 "kzt" => Ok(Currency::KZT),
402 "lak" => Ok(Currency::LAK),
403 "lbp" => Ok(Currency::LBP),
404 "lkr" => Ok(Currency::LKR),
405 "lrd" => Ok(Currency::LRD),
406 "lsl" => Ok(Currency::LSL),
407 "ltl" => Ok(Currency::LTL),
408 "lvl" => Ok(Currency::LVL),
409 "mad" => Ok(Currency::MAD),
410 "mdl" => Ok(Currency::MDL),
411 "mga" => Ok(Currency::MGA),
412 "mkd" => Ok(Currency::MKD),
413 "mnt" => Ok(Currency::MNT),
414 "mop" => Ok(Currency::MOP),
415 "mro" => Ok(Currency::MRO),
416 "mur" => Ok(Currency::MUR),
417 "mvr" => Ok(Currency::MVR),
418 "mwk" => Ok(Currency::MWK),
419 "mxn" => Ok(Currency::MXN),
420 "myr" => Ok(Currency::MYR),
421 "mzn" => Ok(Currency::MZN),
422 "nad" => Ok(Currency::NAD),
423 "ngn" => Ok(Currency::NGN),
424 "nio" => Ok(Currency::NIO),
425 "nok" => Ok(Currency::NOK),
426 "npr" => Ok(Currency::NPR),
427 "nzd" => Ok(Currency::NZD),
428 "pab" => Ok(Currency::PAB),
429 "pen" => Ok(Currency::PEN),
430 "pgk" => Ok(Currency::PGK),
431 "php" => Ok(Currency::PHP),
432 "pkr" => Ok(Currency::PKR),
433 "pln" => Ok(Currency::PLN),
434 "pyg" => Ok(Currency::PYG),
435 "qar" => Ok(Currency::QAR),
436 "ron" => Ok(Currency::RON),
437 "rsd" => Ok(Currency::RSD),
438 "rub" => Ok(Currency::RUB),
439 "rwf" => Ok(Currency::RWF),
440 "sar" => Ok(Currency::SAR),
441 "sbd" => Ok(Currency::SBD),
442 "scr" => Ok(Currency::SCR),
443 "sek" => Ok(Currency::SEK),
444 "sgd" => Ok(Currency::SGD),
445 "shp" => Ok(Currency::SHP),
446 "sll" => Ok(Currency::SLL),
447 "sos" => Ok(Currency::SOS),
448 "srd" => Ok(Currency::SRD),
449 "std" => Ok(Currency::STD),
450 "svc" => Ok(Currency::SVC),
451 "szl" => Ok(Currency::SZL),
452 "thb" => Ok(Currency::THB),
453 "tjs" => Ok(Currency::TJS),
454 "top" => Ok(Currency::TOP),
455 "try" => Ok(Currency::TRY),
456 "ttd" => Ok(Currency::TTD),
457 "twd" => Ok(Currency::TWD),
458 "tzs" => Ok(Currency::TZS),
459 "uah" => Ok(Currency::UAH),
460 "ugx" => Ok(Currency::UGX),
461 "usd" => Ok(Currency::USD),
462 "uyu" => Ok(Currency::UYU),
463 "uzs" => Ok(Currency::UZS),
464 "vef" => Ok(Currency::VEF),
465 "vnd" => Ok(Currency::VND),
466 "vuv" => Ok(Currency::VUV),
467 "wst" => Ok(Currency::WST),
468 "xaf" => Ok(Currency::XAF),
469 "xcd" => Ok(Currency::XCD),
470 "xof" => Ok(Currency::XOF),
471 "xpf" => Ok(Currency::XPF),
472 "yer" => Ok(Currency::YER),
473 "zar" => Ok(Currency::ZAR),
474 "zmw" => Ok(Currency::ZMW),
475 _ => Ok(Currency::Unknown(s.to_string())),
476 }
477 }
478}
479
480#[cfg(test)]
481mod tests {
482 use super::*;
483 #[test]
484 fn debug_currency() {
485 assert_eq!(format!("{:?}", Currency::AED), "AED");
486 assert_eq!(format!("{:?}", Currency::USD), "USD");
487 assert_eq!(format!("{:?}", Currency::ZMW), "ZMW");
488 }
489
490 #[test]
491 fn display_currency() {
492 assert_eq!(format!("{}", Currency::AED), "aed");
493 assert_eq!(format!("{}", Currency::USD), "usd");
494 assert_eq!(format!("{}", Currency::ZMW), "zmw");
495 }
496
497 #[test]
498 fn serialize_currency() {
499 assert_eq!(serde_json::to_string(&Currency::AED).unwrap(), "\"aed\"");
500 assert_eq!(serde_json::to_string(&Currency::USD).unwrap(), "\"usd\"");
501 assert_eq!(serde_json::to_string(&Currency::ZMW).unwrap(), "\"zmw\"");
502 }
503
504 #[test]
505 fn deserialize_currency() {
506 assert_eq!(miniserde::json::from_str::<Currency>("\"aed\"").unwrap(), Currency::AED);
507 assert_eq!(miniserde::json::from_str::<Currency>("\"usd\"").unwrap(), Currency::USD);
508 assert_eq!(miniserde::json::from_str::<Currency>("\"zmw\"").unwrap(), Currency::ZMW);
509 }
510}