Skip to main content

valence_core/currency/
code.rs

1//! ISO 4217 alphabetic currency codes.
2//!
3//! Maintained in Rust (not generated from CSV). Additive ISO updates land as crate releases.
4//!
5//! Wire / serde form is the uppercase alphabetic string (e.g. `"USD"`).
6
7use std::fmt;
8use std::str::FromStr;
9
10use serde::{Deserialize, Deserializer, Serialize, Serializer};
11
12/// ISO 4217 alphabetic currency code.
13///
14/// Parsing accepts **canonical uppercase** spellings only (e.g. `"USD"`, not `"usd"`).
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16pub enum CurrencyCode {
17    /// ISO 4217 `AED`.
18    Aed,
19    /// ISO 4217 `AFN`.
20    Afn,
21    /// ISO 4217 `ALL`.
22    All,
23    /// ISO 4217 `AMD`.
24    Amd,
25    /// ISO 4217 `ANG`.
26    Ang,
27    /// ISO 4217 `AOA`.
28    Aoa,
29    /// ISO 4217 `ARS`.
30    Ars,
31    /// ISO 4217 `AUD`.
32    Aud,
33    /// ISO 4217 `AWG`.
34    Awg,
35    /// ISO 4217 `AZN`.
36    Azn,
37    /// ISO 4217 `BAM`.
38    Bam,
39    /// ISO 4217 `BBD`.
40    Bbd,
41    /// ISO 4217 `BDT`.
42    Bdt,
43    /// ISO 4217 `BGN`.
44    Bgn,
45    /// ISO 4217 `BHD`.
46    Bhd,
47    /// ISO 4217 `BIF`.
48    Bif,
49    /// ISO 4217 `BMD`.
50    Bmd,
51    /// ISO 4217 `BND`.
52    Bnd,
53    /// ISO 4217 `BOB`.
54    Bob,
55    /// ISO 4217 `BOV`.
56    Bov,
57    /// ISO 4217 `BRL`.
58    Brl,
59    /// ISO 4217 `BSD`.
60    Bsd,
61    /// ISO 4217 `BTN`.
62    Btn,
63    /// ISO 4217 `BWP`.
64    Bwp,
65    /// ISO 4217 `BYN`.
66    Byn,
67    /// ISO 4217 `BZD`.
68    Bzd,
69    /// ISO 4217 `CAD`.
70    Cad,
71    /// ISO 4217 `CDF`.
72    Cdf,
73    /// ISO 4217 `CHE`.
74    Che,
75    /// ISO 4217 `CHF`.
76    Chf,
77    /// ISO 4217 `CHW`.
78    Chw,
79    /// ISO 4217 `CLF`.
80    Clf,
81    /// ISO 4217 `CLP`.
82    Clp,
83    /// ISO 4217 `CNY`.
84    Cny,
85    /// ISO 4217 `COP`.
86    Cop,
87    /// ISO 4217 `COU`.
88    Cou,
89    /// ISO 4217 `CRC`.
90    Crc,
91    /// ISO 4217 `CUC`.
92    Cuc,
93    /// ISO 4217 `CUP`.
94    Cup,
95    /// ISO 4217 `CVE`.
96    Cve,
97    /// ISO 4217 `CZK`.
98    Czk,
99    /// ISO 4217 `DJF`.
100    Djf,
101    /// ISO 4217 `DKK`.
102    Dkk,
103    /// ISO 4217 `DOP`.
104    Dop,
105    /// ISO 4217 `DZD`.
106    Dzd,
107    /// ISO 4217 `EGP`.
108    Egp,
109    /// ISO 4217 `ERN`.
110    Ern,
111    /// ISO 4217 `ETB`.
112    Etb,
113    /// ISO 4217 `EUR`.
114    Eur,
115    /// ISO 4217 `FJD`.
116    Fjd,
117    /// ISO 4217 `FKP`.
118    Fkp,
119    /// ISO 4217 `GBP`.
120    Gbp,
121    /// ISO 4217 `GEL`.
122    Gel,
123    /// ISO 4217 `GHS`.
124    Ghs,
125    /// ISO 4217 `GIP`.
126    Gip,
127    /// ISO 4217 `GMD`.
128    Gmd,
129    /// ISO 4217 `GNF`.
130    Gnf,
131    /// ISO 4217 `GTQ`.
132    Gtq,
133    /// ISO 4217 `GYD`.
134    Gyd,
135    /// ISO 4217 `HKD`.
136    Hkd,
137    /// ISO 4217 `HNL`.
138    Hnl,
139    /// ISO 4217 `HTG`.
140    Htg,
141    /// ISO 4217 `HUF`.
142    Huf,
143    /// ISO 4217 `IDR`.
144    Idr,
145    /// ISO 4217 `ILS`.
146    Ils,
147    /// ISO 4217 `INR`.
148    Inr,
149    /// ISO 4217 `IQD`.
150    Iqd,
151    /// ISO 4217 `IRR`.
152    Irr,
153    /// ISO 4217 `ISK`.
154    Isk,
155    /// ISO 4217 `JMD`.
156    Jmd,
157    /// ISO 4217 `JOD`.
158    Jod,
159    /// ISO 4217 `JPY`.
160    Jpy,
161    /// ISO 4217 `KES`.
162    Kes,
163    /// ISO 4217 `KGS`.
164    Kgs,
165    /// ISO 4217 `KHR`.
166    Khr,
167    /// ISO 4217 `KMF`.
168    Kmf,
169    /// ISO 4217 `KPW`.
170    Kpw,
171    /// ISO 4217 `KRW`.
172    Krw,
173    /// ISO 4217 `KWD`.
174    Kwd,
175    /// ISO 4217 `KYD`.
176    Kyd,
177    /// ISO 4217 `KZT`.
178    Kzt,
179    /// ISO 4217 `LAK`.
180    Lak,
181    /// ISO 4217 `LBP`.
182    Lbp,
183    /// ISO 4217 `LKR`.
184    Lkr,
185    /// ISO 4217 `LRD`.
186    Lrd,
187    /// ISO 4217 `LSL`.
188    Lsl,
189    /// ISO 4217 `LYD`.
190    Lyd,
191    /// ISO 4217 `MAD`.
192    Mad,
193    /// ISO 4217 `MDL`.
194    Mdl,
195    /// ISO 4217 `MGA`.
196    Mga,
197    /// ISO 4217 `MKD`.
198    Mkd,
199    /// ISO 4217 `MMK`.
200    Mmk,
201    /// ISO 4217 `MNT`.
202    Mnt,
203    /// ISO 4217 `MOP`.
204    Mop,
205    /// ISO 4217 `MRU`.
206    Mru,
207    /// ISO 4217 `MUR`.
208    Mur,
209    /// ISO 4217 `MVR`.
210    Mvr,
211    /// ISO 4217 `MWK`.
212    Mwk,
213    /// ISO 4217 `MXN`.
214    Mxn,
215    /// ISO 4217 `MXV`.
216    Mxv,
217    /// ISO 4217 `MYR`.
218    Myr,
219    /// ISO 4217 `MZN`.
220    Mzn,
221    /// ISO 4217 `NAD`.
222    Nad,
223    /// ISO 4217 `NGN`.
224    Ngn,
225    /// ISO 4217 `NIO`.
226    Nio,
227    /// ISO 4217 `NOK`.
228    Nok,
229    /// ISO 4217 `NPR`.
230    Npr,
231    /// ISO 4217 `NZD`.
232    Nzd,
233    /// ISO 4217 `OMR`.
234    Omr,
235    /// ISO 4217 `PAB`.
236    Pab,
237    /// ISO 4217 `PEN`.
238    Pen,
239    /// ISO 4217 `PGK`.
240    Pgk,
241    /// ISO 4217 `PHP`.
242    Php,
243    /// ISO 4217 `PKR`.
244    Pkr,
245    /// ISO 4217 `PLN`.
246    Pln,
247    /// ISO 4217 `PYG`.
248    Pyg,
249    /// ISO 4217 `QAR`.
250    Qar,
251    /// ISO 4217 `RON`.
252    Ron,
253    /// ISO 4217 `RSD`.
254    Rsd,
255    /// ISO 4217 `RUB`.
256    Rub,
257    /// ISO 4217 `RWF`.
258    Rwf,
259    /// ISO 4217 `SAR`.
260    Sar,
261    /// ISO 4217 `SBD`.
262    Sbd,
263    /// ISO 4217 `SCR`.
264    Scr,
265    /// ISO 4217 `SDG`.
266    Sdg,
267    /// ISO 4217 `SEK`.
268    Sek,
269    /// ISO 4217 `SGD`.
270    Sgd,
271    /// ISO 4217 `SHP`.
272    Shp,
273    /// ISO 4217 `SLE`.
274    Sle,
275    /// ISO 4217 `SOS`.
276    Sos,
277    /// ISO 4217 `SRD`.
278    Srd,
279    /// ISO 4217 `SSP`.
280    Ssp,
281    /// ISO 4217 `STN`.
282    Stn,
283    /// ISO 4217 `SVC`.
284    Svc,
285    /// ISO 4217 `SYP`.
286    Syp,
287    /// ISO 4217 `SZL`.
288    Szl,
289    /// ISO 4217 `THB`.
290    Thb,
291    /// ISO 4217 `TJS`.
292    Tjs,
293    /// ISO 4217 `TMT`.
294    Tmt,
295    /// ISO 4217 `TND`.
296    Tnd,
297    /// ISO 4217 `TOP`.
298    Top,
299    /// ISO 4217 `TRY`.
300    Try,
301    /// ISO 4217 `TTD`.
302    Ttd,
303    /// ISO 4217 `TWD`.
304    Twd,
305    /// ISO 4217 `TZS`.
306    Tzs,
307    /// ISO 4217 `UAH`.
308    Uah,
309    /// ISO 4217 `UGX`.
310    Ugx,
311    /// ISO 4217 `USD`.
312    Usd,
313    /// ISO 4217 `USN`.
314    Usn,
315    /// ISO 4217 `UYI`.
316    Uyi,
317    /// ISO 4217 `UYU`.
318    Uyu,
319    /// ISO 4217 `UYW`.
320    Uyw,
321    /// ISO 4217 `UZS`.
322    Uzs,
323    /// ISO 4217 `VED`.
324    Ved,
325    /// ISO 4217 `VES`.
326    Ves,
327    /// ISO 4217 `VND`.
328    Vnd,
329    /// ISO 4217 `VUV`.
330    Vuv,
331    /// ISO 4217 `WST`.
332    Wst,
333    /// ISO 4217 `XAF`.
334    Xaf,
335    /// ISO 4217 `XAG`.
336    Xag,
337    /// ISO 4217 `XAU`.
338    Xau,
339    /// ISO 4217 `XBA`.
340    Xba,
341    /// ISO 4217 `XBB`.
342    Xbb,
343    /// ISO 4217 `XBC`.
344    Xbc,
345    /// ISO 4217 `XBD`.
346    Xbd,
347    /// ISO 4217 `XCD`.
348    Xcd,
349    /// ISO 4217 `XDR`.
350    Xdr,
351    /// ISO 4217 `XOF`.
352    Xof,
353    /// ISO 4217 `XPD`.
354    Xpd,
355    /// ISO 4217 `XPF`.
356    Xpf,
357    /// ISO 4217 `XPT`.
358    Xpt,
359    /// ISO 4217 `XSU`.
360    Xsu,
361    /// ISO 4217 `XTS`.
362    Xts,
363    /// ISO 4217 `XUA`.
364    Xua,
365    /// ISO 4217 `XXX`.
366    Xxx,
367    /// ISO 4217 `YER`.
368    Yer,
369    /// ISO 4217 `ZAR`.
370    Zar,
371    /// ISO 4217 `ZMW`.
372    Zmw,
373    /// ISO 4217 `ZWG`.
374    Zwg,
375}
376
377impl CurrencyCode {
378    /// All known codes in this crate version.
379    pub const fn all() -> &'static [CurrencyCode] {
380        &[
381            Self::Aed,
382            Self::Afn,
383            Self::All,
384            Self::Amd,
385            Self::Ang,
386            Self::Aoa,
387            Self::Ars,
388            Self::Aud,
389            Self::Awg,
390            Self::Azn,
391            Self::Bam,
392            Self::Bbd,
393            Self::Bdt,
394            Self::Bgn,
395            Self::Bhd,
396            Self::Bif,
397            Self::Bmd,
398            Self::Bnd,
399            Self::Bob,
400            Self::Bov,
401            Self::Brl,
402            Self::Bsd,
403            Self::Btn,
404            Self::Bwp,
405            Self::Byn,
406            Self::Bzd,
407            Self::Cad,
408            Self::Cdf,
409            Self::Che,
410            Self::Chf,
411            Self::Chw,
412            Self::Clf,
413            Self::Clp,
414            Self::Cny,
415            Self::Cop,
416            Self::Cou,
417            Self::Crc,
418            Self::Cuc,
419            Self::Cup,
420            Self::Cve,
421            Self::Czk,
422            Self::Djf,
423            Self::Dkk,
424            Self::Dop,
425            Self::Dzd,
426            Self::Egp,
427            Self::Ern,
428            Self::Etb,
429            Self::Eur,
430            Self::Fjd,
431            Self::Fkp,
432            Self::Gbp,
433            Self::Gel,
434            Self::Ghs,
435            Self::Gip,
436            Self::Gmd,
437            Self::Gnf,
438            Self::Gtq,
439            Self::Gyd,
440            Self::Hkd,
441            Self::Hnl,
442            Self::Htg,
443            Self::Huf,
444            Self::Idr,
445            Self::Ils,
446            Self::Inr,
447            Self::Iqd,
448            Self::Irr,
449            Self::Isk,
450            Self::Jmd,
451            Self::Jod,
452            Self::Jpy,
453            Self::Kes,
454            Self::Kgs,
455            Self::Khr,
456            Self::Kmf,
457            Self::Kpw,
458            Self::Krw,
459            Self::Kwd,
460            Self::Kyd,
461            Self::Kzt,
462            Self::Lak,
463            Self::Lbp,
464            Self::Lkr,
465            Self::Lrd,
466            Self::Lsl,
467            Self::Lyd,
468            Self::Mad,
469            Self::Mdl,
470            Self::Mga,
471            Self::Mkd,
472            Self::Mmk,
473            Self::Mnt,
474            Self::Mop,
475            Self::Mru,
476            Self::Mur,
477            Self::Mvr,
478            Self::Mwk,
479            Self::Mxn,
480            Self::Mxv,
481            Self::Myr,
482            Self::Mzn,
483            Self::Nad,
484            Self::Ngn,
485            Self::Nio,
486            Self::Nok,
487            Self::Npr,
488            Self::Nzd,
489            Self::Omr,
490            Self::Pab,
491            Self::Pen,
492            Self::Pgk,
493            Self::Php,
494            Self::Pkr,
495            Self::Pln,
496            Self::Pyg,
497            Self::Qar,
498            Self::Ron,
499            Self::Rsd,
500            Self::Rub,
501            Self::Rwf,
502            Self::Sar,
503            Self::Sbd,
504            Self::Scr,
505            Self::Sdg,
506            Self::Sek,
507            Self::Sgd,
508            Self::Shp,
509            Self::Sle,
510            Self::Sos,
511            Self::Srd,
512            Self::Ssp,
513            Self::Stn,
514            Self::Svc,
515            Self::Syp,
516            Self::Szl,
517            Self::Thb,
518            Self::Tjs,
519            Self::Tmt,
520            Self::Tnd,
521            Self::Top,
522            Self::Try,
523            Self::Ttd,
524            Self::Twd,
525            Self::Tzs,
526            Self::Uah,
527            Self::Ugx,
528            Self::Usd,
529            Self::Usn,
530            Self::Uyi,
531            Self::Uyu,
532            Self::Uyw,
533            Self::Uzs,
534            Self::Ved,
535            Self::Ves,
536            Self::Vnd,
537            Self::Vuv,
538            Self::Wst,
539            Self::Xaf,
540            Self::Xag,
541            Self::Xau,
542            Self::Xba,
543            Self::Xbb,
544            Self::Xbc,
545            Self::Xbd,
546            Self::Xcd,
547            Self::Xdr,
548            Self::Xof,
549            Self::Xpd,
550            Self::Xpf,
551            Self::Xpt,
552            Self::Xsu,
553            Self::Xts,
554            Self::Xua,
555            Self::Xxx,
556            Self::Yer,
557            Self::Zar,
558            Self::Zmw,
559            Self::Zwg,
560        ]
561    }
562
563    /// Alphabetic code (`"USD"`).
564    pub const fn as_str(self) -> &'static str {
565        match self {
566            Self::Aed => "AED",
567            Self::Afn => "AFN",
568            Self::All => "ALL",
569            Self::Amd => "AMD",
570            Self::Ang => "ANG",
571            Self::Aoa => "AOA",
572            Self::Ars => "ARS",
573            Self::Aud => "AUD",
574            Self::Awg => "AWG",
575            Self::Azn => "AZN",
576            Self::Bam => "BAM",
577            Self::Bbd => "BBD",
578            Self::Bdt => "BDT",
579            Self::Bgn => "BGN",
580            Self::Bhd => "BHD",
581            Self::Bif => "BIF",
582            Self::Bmd => "BMD",
583            Self::Bnd => "BND",
584            Self::Bob => "BOB",
585            Self::Bov => "BOV",
586            Self::Brl => "BRL",
587            Self::Bsd => "BSD",
588            Self::Btn => "BTN",
589            Self::Bwp => "BWP",
590            Self::Byn => "BYN",
591            Self::Bzd => "BZD",
592            Self::Cad => "CAD",
593            Self::Cdf => "CDF",
594            Self::Che => "CHE",
595            Self::Chf => "CHF",
596            Self::Chw => "CHW",
597            Self::Clf => "CLF",
598            Self::Clp => "CLP",
599            Self::Cny => "CNY",
600            Self::Cop => "COP",
601            Self::Cou => "COU",
602            Self::Crc => "CRC",
603            Self::Cuc => "CUC",
604            Self::Cup => "CUP",
605            Self::Cve => "CVE",
606            Self::Czk => "CZK",
607            Self::Djf => "DJF",
608            Self::Dkk => "DKK",
609            Self::Dop => "DOP",
610            Self::Dzd => "DZD",
611            Self::Egp => "EGP",
612            Self::Ern => "ERN",
613            Self::Etb => "ETB",
614            Self::Eur => "EUR",
615            Self::Fjd => "FJD",
616            Self::Fkp => "FKP",
617            Self::Gbp => "GBP",
618            Self::Gel => "GEL",
619            Self::Ghs => "GHS",
620            Self::Gip => "GIP",
621            Self::Gmd => "GMD",
622            Self::Gnf => "GNF",
623            Self::Gtq => "GTQ",
624            Self::Gyd => "GYD",
625            Self::Hkd => "HKD",
626            Self::Hnl => "HNL",
627            Self::Htg => "HTG",
628            Self::Huf => "HUF",
629            Self::Idr => "IDR",
630            Self::Ils => "ILS",
631            Self::Inr => "INR",
632            Self::Iqd => "IQD",
633            Self::Irr => "IRR",
634            Self::Isk => "ISK",
635            Self::Jmd => "JMD",
636            Self::Jod => "JOD",
637            Self::Jpy => "JPY",
638            Self::Kes => "KES",
639            Self::Kgs => "KGS",
640            Self::Khr => "KHR",
641            Self::Kmf => "KMF",
642            Self::Kpw => "KPW",
643            Self::Krw => "KRW",
644            Self::Kwd => "KWD",
645            Self::Kyd => "KYD",
646            Self::Kzt => "KZT",
647            Self::Lak => "LAK",
648            Self::Lbp => "LBP",
649            Self::Lkr => "LKR",
650            Self::Lrd => "LRD",
651            Self::Lsl => "LSL",
652            Self::Lyd => "LYD",
653            Self::Mad => "MAD",
654            Self::Mdl => "MDL",
655            Self::Mga => "MGA",
656            Self::Mkd => "MKD",
657            Self::Mmk => "MMK",
658            Self::Mnt => "MNT",
659            Self::Mop => "MOP",
660            Self::Mru => "MRU",
661            Self::Mur => "MUR",
662            Self::Mvr => "MVR",
663            Self::Mwk => "MWK",
664            Self::Mxn => "MXN",
665            Self::Mxv => "MXV",
666            Self::Myr => "MYR",
667            Self::Mzn => "MZN",
668            Self::Nad => "NAD",
669            Self::Ngn => "NGN",
670            Self::Nio => "NIO",
671            Self::Nok => "NOK",
672            Self::Npr => "NPR",
673            Self::Nzd => "NZD",
674            Self::Omr => "OMR",
675            Self::Pab => "PAB",
676            Self::Pen => "PEN",
677            Self::Pgk => "PGK",
678            Self::Php => "PHP",
679            Self::Pkr => "PKR",
680            Self::Pln => "PLN",
681            Self::Pyg => "PYG",
682            Self::Qar => "QAR",
683            Self::Ron => "RON",
684            Self::Rsd => "RSD",
685            Self::Rub => "RUB",
686            Self::Rwf => "RWF",
687            Self::Sar => "SAR",
688            Self::Sbd => "SBD",
689            Self::Scr => "SCR",
690            Self::Sdg => "SDG",
691            Self::Sek => "SEK",
692            Self::Sgd => "SGD",
693            Self::Shp => "SHP",
694            Self::Sle => "SLE",
695            Self::Sos => "SOS",
696            Self::Srd => "SRD",
697            Self::Ssp => "SSP",
698            Self::Stn => "STN",
699            Self::Svc => "SVC",
700            Self::Syp => "SYP",
701            Self::Szl => "SZL",
702            Self::Thb => "THB",
703            Self::Tjs => "TJS",
704            Self::Tmt => "TMT",
705            Self::Tnd => "TND",
706            Self::Top => "TOP",
707            Self::Try => "TRY",
708            Self::Ttd => "TTD",
709            Self::Twd => "TWD",
710            Self::Tzs => "TZS",
711            Self::Uah => "UAH",
712            Self::Ugx => "UGX",
713            Self::Usd => "USD",
714            Self::Usn => "USN",
715            Self::Uyi => "UYI",
716            Self::Uyu => "UYU",
717            Self::Uyw => "UYW",
718            Self::Uzs => "UZS",
719            Self::Ved => "VED",
720            Self::Ves => "VES",
721            Self::Vnd => "VND",
722            Self::Vuv => "VUV",
723            Self::Wst => "WST",
724            Self::Xaf => "XAF",
725            Self::Xag => "XAG",
726            Self::Xau => "XAU",
727            Self::Xba => "XBA",
728            Self::Xbb => "XBB",
729            Self::Xbc => "XBC",
730            Self::Xbd => "XBD",
731            Self::Xcd => "XCD",
732            Self::Xdr => "XDR",
733            Self::Xof => "XOF",
734            Self::Xpd => "XPD",
735            Self::Xpf => "XPF",
736            Self::Xpt => "XPT",
737            Self::Xsu => "XSU",
738            Self::Xts => "XTS",
739            Self::Xua => "XUA",
740            Self::Xxx => "XXX",
741            Self::Yer => "YER",
742            Self::Zar => "ZAR",
743            Self::Zmw => "ZMW",
744            Self::Zwg => "ZWG",
745        }
746    }
747
748    /// ISO 4217 minor-unit exponent (digits after the decimal in major units).
749    pub const fn exponent(self) -> u32 {
750        match self {
751            Self::Aed => 2,
752            Self::Afn => 2,
753            Self::All => 2,
754            Self::Amd => 2,
755            Self::Ang => 2,
756            Self::Aoa => 2,
757            Self::Ars => 2,
758            Self::Aud => 2,
759            Self::Awg => 2,
760            Self::Azn => 2,
761            Self::Bam => 2,
762            Self::Bbd => 2,
763            Self::Bdt => 2,
764            Self::Bgn => 2,
765            Self::Bhd => 3,
766            Self::Bif => 0,
767            Self::Bmd => 2,
768            Self::Bnd => 2,
769            Self::Bob => 2,
770            Self::Bov => 2,
771            Self::Brl => 2,
772            Self::Bsd => 2,
773            Self::Btn => 2,
774            Self::Bwp => 2,
775            Self::Byn => 2,
776            Self::Bzd => 2,
777            Self::Cad => 2,
778            Self::Cdf => 2,
779            Self::Che => 2,
780            Self::Chf => 2,
781            Self::Chw => 2,
782            Self::Clf => 4,
783            Self::Clp => 0,
784            Self::Cny => 2,
785            Self::Cop => 2,
786            Self::Cou => 2,
787            Self::Crc => 2,
788            Self::Cuc => 2,
789            Self::Cup => 2,
790            Self::Cve => 2,
791            Self::Czk => 2,
792            Self::Djf => 0,
793            Self::Dkk => 2,
794            Self::Dop => 2,
795            Self::Dzd => 2,
796            Self::Egp => 2,
797            Self::Ern => 2,
798            Self::Etb => 2,
799            Self::Eur => 2,
800            Self::Fjd => 2,
801            Self::Fkp => 2,
802            Self::Gbp => 2,
803            Self::Gel => 2,
804            Self::Ghs => 2,
805            Self::Gip => 2,
806            Self::Gmd => 2,
807            Self::Gnf => 0,
808            Self::Gtq => 2,
809            Self::Gyd => 2,
810            Self::Hkd => 2,
811            Self::Hnl => 2,
812            Self::Htg => 2,
813            Self::Huf => 2,
814            Self::Idr => 2,
815            Self::Ils => 2,
816            Self::Inr => 2,
817            Self::Iqd => 3,
818            Self::Irr => 2,
819            Self::Isk => 0,
820            Self::Jmd => 2,
821            Self::Jod => 3,
822            Self::Jpy => 0,
823            Self::Kes => 2,
824            Self::Kgs => 2,
825            Self::Khr => 2,
826            Self::Kmf => 0,
827            Self::Kpw => 2,
828            Self::Krw => 0,
829            Self::Kwd => 3,
830            Self::Kyd => 2,
831            Self::Kzt => 2,
832            Self::Lak => 2,
833            Self::Lbp => 2,
834            Self::Lkr => 2,
835            Self::Lrd => 2,
836            Self::Lsl => 2,
837            Self::Lyd => 3,
838            Self::Mad => 2,
839            Self::Mdl => 2,
840            Self::Mga => 2,
841            Self::Mkd => 2,
842            Self::Mmk => 2,
843            Self::Mnt => 2,
844            Self::Mop => 2,
845            Self::Mru => 2,
846            Self::Mur => 2,
847            Self::Mvr => 2,
848            Self::Mwk => 2,
849            Self::Mxn => 2,
850            Self::Mxv => 2,
851            Self::Myr => 2,
852            Self::Mzn => 2,
853            Self::Nad => 2,
854            Self::Ngn => 2,
855            Self::Nio => 2,
856            Self::Nok => 2,
857            Self::Npr => 2,
858            Self::Nzd => 2,
859            Self::Omr => 3,
860            Self::Pab => 2,
861            Self::Pen => 2,
862            Self::Pgk => 2,
863            Self::Php => 2,
864            Self::Pkr => 2,
865            Self::Pln => 2,
866            Self::Pyg => 0,
867            Self::Qar => 2,
868            Self::Ron => 2,
869            Self::Rsd => 2,
870            Self::Rub => 2,
871            Self::Rwf => 0,
872            Self::Sar => 2,
873            Self::Sbd => 2,
874            Self::Scr => 2,
875            Self::Sdg => 2,
876            Self::Sek => 2,
877            Self::Sgd => 2,
878            Self::Shp => 2,
879            Self::Sle => 2,
880            Self::Sos => 2,
881            Self::Srd => 2,
882            Self::Ssp => 2,
883            Self::Stn => 2,
884            Self::Svc => 2,
885            Self::Syp => 2,
886            Self::Szl => 2,
887            Self::Thb => 2,
888            Self::Tjs => 2,
889            Self::Tmt => 2,
890            Self::Tnd => 3,
891            Self::Top => 2,
892            Self::Try => 2,
893            Self::Ttd => 2,
894            Self::Twd => 2,
895            Self::Tzs => 2,
896            Self::Uah => 2,
897            Self::Ugx => 0,
898            Self::Usd => 2,
899            Self::Usn => 2,
900            Self::Uyi => 0,
901            Self::Uyu => 2,
902            Self::Uyw => 4,
903            Self::Uzs => 2,
904            Self::Ved => 2,
905            Self::Ves => 2,
906            Self::Vnd => 0,
907            Self::Vuv => 0,
908            Self::Wst => 2,
909            Self::Xaf => 0,
910            Self::Xag => 0,
911            Self::Xau => 0,
912            Self::Xba => 0,
913            Self::Xbb => 0,
914            Self::Xbc => 0,
915            Self::Xbd => 0,
916            Self::Xcd => 2,
917            Self::Xdr => 0,
918            Self::Xof => 0,
919            Self::Xpd => 0,
920            Self::Xpf => 0,
921            Self::Xpt => 0,
922            Self::Xsu => 0,
923            Self::Xts => 0,
924            Self::Xua => 0,
925            Self::Xxx => 0,
926            Self::Yer => 2,
927            Self::Zar => 2,
928            Self::Zmw => 2,
929            Self::Zwg => 2,
930        }
931    }
932}
933
934impl fmt::Display for CurrencyCode {
935    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
936        f.write_str(self.as_str())
937    }
938}
939
940/// Unknown or non-canonical currency code string.
941#[derive(Debug, Clone, PartialEq, Eq)]
942pub struct ParseCurrencyCodeError {
943    pub input: String,
944}
945
946impl fmt::Display for ParseCurrencyCodeError {
947    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
948        write!(f, "unknown or non-canonical currency code: {}", self.input)
949    }
950}
951
952impl std::error::Error for ParseCurrencyCodeError {}
953
954impl FromStr for CurrencyCode {
955    type Err = ParseCurrencyCodeError;
956
957    fn from_str(s: &str) -> Result<Self, Self::Err> {
958        match s {
959            "AED" => Ok(Self::Aed),
960            "AFN" => Ok(Self::Afn),
961            "ALL" => Ok(Self::All),
962            "AMD" => Ok(Self::Amd),
963            "ANG" => Ok(Self::Ang),
964            "AOA" => Ok(Self::Aoa),
965            "ARS" => Ok(Self::Ars),
966            "AUD" => Ok(Self::Aud),
967            "AWG" => Ok(Self::Awg),
968            "AZN" => Ok(Self::Azn),
969            "BAM" => Ok(Self::Bam),
970            "BBD" => Ok(Self::Bbd),
971            "BDT" => Ok(Self::Bdt),
972            "BGN" => Ok(Self::Bgn),
973            "BHD" => Ok(Self::Bhd),
974            "BIF" => Ok(Self::Bif),
975            "BMD" => Ok(Self::Bmd),
976            "BND" => Ok(Self::Bnd),
977            "BOB" => Ok(Self::Bob),
978            "BOV" => Ok(Self::Bov),
979            "BRL" => Ok(Self::Brl),
980            "BSD" => Ok(Self::Bsd),
981            "BTN" => Ok(Self::Btn),
982            "BWP" => Ok(Self::Bwp),
983            "BYN" => Ok(Self::Byn),
984            "BZD" => Ok(Self::Bzd),
985            "CAD" => Ok(Self::Cad),
986            "CDF" => Ok(Self::Cdf),
987            "CHE" => Ok(Self::Che),
988            "CHF" => Ok(Self::Chf),
989            "CHW" => Ok(Self::Chw),
990            "CLF" => Ok(Self::Clf),
991            "CLP" => Ok(Self::Clp),
992            "CNY" => Ok(Self::Cny),
993            "COP" => Ok(Self::Cop),
994            "COU" => Ok(Self::Cou),
995            "CRC" => Ok(Self::Crc),
996            "CUC" => Ok(Self::Cuc),
997            "CUP" => Ok(Self::Cup),
998            "CVE" => Ok(Self::Cve),
999            "CZK" => Ok(Self::Czk),
1000            "DJF" => Ok(Self::Djf),
1001            "DKK" => Ok(Self::Dkk),
1002            "DOP" => Ok(Self::Dop),
1003            "DZD" => Ok(Self::Dzd),
1004            "EGP" => Ok(Self::Egp),
1005            "ERN" => Ok(Self::Ern),
1006            "ETB" => Ok(Self::Etb),
1007            "EUR" => Ok(Self::Eur),
1008            "FJD" => Ok(Self::Fjd),
1009            "FKP" => Ok(Self::Fkp),
1010            "GBP" => Ok(Self::Gbp),
1011            "GEL" => Ok(Self::Gel),
1012            "GHS" => Ok(Self::Ghs),
1013            "GIP" => Ok(Self::Gip),
1014            "GMD" => Ok(Self::Gmd),
1015            "GNF" => Ok(Self::Gnf),
1016            "GTQ" => Ok(Self::Gtq),
1017            "GYD" => Ok(Self::Gyd),
1018            "HKD" => Ok(Self::Hkd),
1019            "HNL" => Ok(Self::Hnl),
1020            "HTG" => Ok(Self::Htg),
1021            "HUF" => Ok(Self::Huf),
1022            "IDR" => Ok(Self::Idr),
1023            "ILS" => Ok(Self::Ils),
1024            "INR" => Ok(Self::Inr),
1025            "IQD" => Ok(Self::Iqd),
1026            "IRR" => Ok(Self::Irr),
1027            "ISK" => Ok(Self::Isk),
1028            "JMD" => Ok(Self::Jmd),
1029            "JOD" => Ok(Self::Jod),
1030            "JPY" => Ok(Self::Jpy),
1031            "KES" => Ok(Self::Kes),
1032            "KGS" => Ok(Self::Kgs),
1033            "KHR" => Ok(Self::Khr),
1034            "KMF" => Ok(Self::Kmf),
1035            "KPW" => Ok(Self::Kpw),
1036            "KRW" => Ok(Self::Krw),
1037            "KWD" => Ok(Self::Kwd),
1038            "KYD" => Ok(Self::Kyd),
1039            "KZT" => Ok(Self::Kzt),
1040            "LAK" => Ok(Self::Lak),
1041            "LBP" => Ok(Self::Lbp),
1042            "LKR" => Ok(Self::Lkr),
1043            "LRD" => Ok(Self::Lrd),
1044            "LSL" => Ok(Self::Lsl),
1045            "LYD" => Ok(Self::Lyd),
1046            "MAD" => Ok(Self::Mad),
1047            "MDL" => Ok(Self::Mdl),
1048            "MGA" => Ok(Self::Mga),
1049            "MKD" => Ok(Self::Mkd),
1050            "MMK" => Ok(Self::Mmk),
1051            "MNT" => Ok(Self::Mnt),
1052            "MOP" => Ok(Self::Mop),
1053            "MRU" => Ok(Self::Mru),
1054            "MUR" => Ok(Self::Mur),
1055            "MVR" => Ok(Self::Mvr),
1056            "MWK" => Ok(Self::Mwk),
1057            "MXN" => Ok(Self::Mxn),
1058            "MXV" => Ok(Self::Mxv),
1059            "MYR" => Ok(Self::Myr),
1060            "MZN" => Ok(Self::Mzn),
1061            "NAD" => Ok(Self::Nad),
1062            "NGN" => Ok(Self::Ngn),
1063            "NIO" => Ok(Self::Nio),
1064            "NOK" => Ok(Self::Nok),
1065            "NPR" => Ok(Self::Npr),
1066            "NZD" => Ok(Self::Nzd),
1067            "OMR" => Ok(Self::Omr),
1068            "PAB" => Ok(Self::Pab),
1069            "PEN" => Ok(Self::Pen),
1070            "PGK" => Ok(Self::Pgk),
1071            "PHP" => Ok(Self::Php),
1072            "PKR" => Ok(Self::Pkr),
1073            "PLN" => Ok(Self::Pln),
1074            "PYG" => Ok(Self::Pyg),
1075            "QAR" => Ok(Self::Qar),
1076            "RON" => Ok(Self::Ron),
1077            "RSD" => Ok(Self::Rsd),
1078            "RUB" => Ok(Self::Rub),
1079            "RWF" => Ok(Self::Rwf),
1080            "SAR" => Ok(Self::Sar),
1081            "SBD" => Ok(Self::Sbd),
1082            "SCR" => Ok(Self::Scr),
1083            "SDG" => Ok(Self::Sdg),
1084            "SEK" => Ok(Self::Sek),
1085            "SGD" => Ok(Self::Sgd),
1086            "SHP" => Ok(Self::Shp),
1087            "SLE" => Ok(Self::Sle),
1088            "SOS" => Ok(Self::Sos),
1089            "SRD" => Ok(Self::Srd),
1090            "SSP" => Ok(Self::Ssp),
1091            "STN" => Ok(Self::Stn),
1092            "SVC" => Ok(Self::Svc),
1093            "SYP" => Ok(Self::Syp),
1094            "SZL" => Ok(Self::Szl),
1095            "THB" => Ok(Self::Thb),
1096            "TJS" => Ok(Self::Tjs),
1097            "TMT" => Ok(Self::Tmt),
1098            "TND" => Ok(Self::Tnd),
1099            "TOP" => Ok(Self::Top),
1100            "TRY" => Ok(Self::Try),
1101            "TTD" => Ok(Self::Ttd),
1102            "TWD" => Ok(Self::Twd),
1103            "TZS" => Ok(Self::Tzs),
1104            "UAH" => Ok(Self::Uah),
1105            "UGX" => Ok(Self::Ugx),
1106            "USD" => Ok(Self::Usd),
1107            "USN" => Ok(Self::Usn),
1108            "UYI" => Ok(Self::Uyi),
1109            "UYU" => Ok(Self::Uyu),
1110            "UYW" => Ok(Self::Uyw),
1111            "UZS" => Ok(Self::Uzs),
1112            "VED" => Ok(Self::Ved),
1113            "VES" => Ok(Self::Ves),
1114            "VND" => Ok(Self::Vnd),
1115            "VUV" => Ok(Self::Vuv),
1116            "WST" => Ok(Self::Wst),
1117            "XAF" => Ok(Self::Xaf),
1118            "XAG" => Ok(Self::Xag),
1119            "XAU" => Ok(Self::Xau),
1120            "XBA" => Ok(Self::Xba),
1121            "XBB" => Ok(Self::Xbb),
1122            "XBC" => Ok(Self::Xbc),
1123            "XBD" => Ok(Self::Xbd),
1124            "XCD" => Ok(Self::Xcd),
1125            "XDR" => Ok(Self::Xdr),
1126            "XOF" => Ok(Self::Xof),
1127            "XPD" => Ok(Self::Xpd),
1128            "XPF" => Ok(Self::Xpf),
1129            "XPT" => Ok(Self::Xpt),
1130            "XSU" => Ok(Self::Xsu),
1131            "XTS" => Ok(Self::Xts),
1132            "XUA" => Ok(Self::Xua),
1133            "XXX" => Ok(Self::Xxx),
1134            "YER" => Ok(Self::Yer),
1135            "ZAR" => Ok(Self::Zar),
1136            "ZMW" => Ok(Self::Zmw),
1137            "ZWG" => Ok(Self::Zwg),
1138            _ => Err(ParseCurrencyCodeError {
1139                input: s.to_string(),
1140            }),
1141        }
1142    }
1143}
1144
1145impl TryFrom<&str> for CurrencyCode {
1146    type Error = ParseCurrencyCodeError;
1147
1148    fn try_from(value: &str) -> Result<Self, Self::Error> {
1149        value.parse()
1150    }
1151}
1152
1153impl Serialize for CurrencyCode {
1154    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1155        serializer.serialize_str(self.as_str())
1156    }
1157}
1158
1159impl<'de> Deserialize<'de> for CurrencyCode {
1160    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1161        let s = String::deserialize(deserializer)?;
1162        s.parse().map_err(serde::de::Error::custom)
1163    }
1164}
1165
1166#[cfg(test)]
1167mod tests {
1168    use super::*;
1169
1170    #[test]
1171    fn round_trip_all_variants() {
1172        for code in CurrencyCode::all() {
1173            let s = code.as_str();
1174            assert_eq!(s.parse::<CurrencyCode>().unwrap(), *code);
1175            assert_eq!(s.len(), 3);
1176        }
1177    }
1178
1179    #[test]
1180    fn exponents_samples() {
1181        assert_eq!(CurrencyCode::Usd.exponent(), 2);
1182        assert_eq!(CurrencyCode::Jpy.exponent(), 0);
1183        assert_eq!(CurrencyCode::Kwd.exponent(), 3);
1184    }
1185
1186    #[test]
1187    fn rejects_unknown_and_lowercase() {
1188        assert!("ZZZ".parse::<CurrencyCode>().is_err());
1189        assert!("usd".parse::<CurrencyCode>().is_err());
1190    }
1191
1192    #[test]
1193    fn serde_string() {
1194        let v = serde_json::to_value(CurrencyCode::Eur).unwrap();
1195        assert_eq!(v, serde_json::json!("EUR"));
1196        let back: CurrencyCode = serde_json::from_value(v).unwrap();
1197        assert_eq!(back, CurrencyCode::Eur);
1198    }
1199}