currency_iso4217/
lib.rs

1//! ISO 4217 <https://en.wikipedia.org/wiki/ISO_4217> currency codes
2//!
3//! A `no_std` implementation of ISO 4217 currency codes.
4//!
5//! Aims to be as minimalistic as possible, while still providing a full set of features for
6//! handling ISO 4217 currency codes.
7//!
8//! Alternatives:
9//!
10//! - [`rust-iso4217`](https://github.com/rust-iso/rust_iso4217)
11//! - [`codes-iso-4217`](https://github.com/johnstonskj/rust-codes)
12#![cfg_attr(not(feature = "std"), no_std)]
13
14extern crate alloc;
15
16#[cfg(not(feature = "std"))]
17use core as std;
18#[cfg(feature = "std")]
19use std;
20
21use std::fmt;
22
23/// ISO 4217 currency codes <https://en.wikipedia.org/wiki/ISO_4217>
24#[repr(u32)]
25#[rustfmt::skip]
26#[allow(clippy::zero_prefixed_literal)]
27#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
28#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
29pub enum Currency {
30    /// United Arab Emirates dirham United Arab Emirates
31    AED = 784,
32    /// Afghan afghani Afghanistan
33    AFN = 971,
34    /// Albanian lek Albania
35    ALL = 008,
36    /// Armenian dram Armenia
37    AMD = 051,
38    /// Netherlands Antillean guilder Cura
39    ANG = 532,
40    /// Angolan kwanza Angola
41    AOA = 973,
42    /// Argentine peso Argentina
43    ARS = 032,
44    /// Australian dollar Australia
45    AUD = 036,
46    /// Aruban florin Aruba
47    AWG = 533,
48    /// Azerbaijani manat Azerbaijan
49    AZN = 944,
50    /// Bosnia and Herzegovina convertible mark Bosnia and Herzegovina
51    BAM = 977,
52    /// Barbados dollar Barbados
53    BBD = 052,
54    /// Bangladeshi taka Bangladesh
55    BDT = 050,
56    /// Bulgarian lev Bulgaria
57    BGN = 975,
58    /// Bahraini dinar Bahrain
59    BHD = 048,
60    /// Burundian franc Burundi
61    BIF = 108,
62    /// Bermudian dollar Bermuda
63    BMD = 060,
64    /// Brunei dollar Brunei
65    BND = 096,
66    /// Boliviano Bolivia
67    BOB = 068,
68    /// Bolivian Mvdol (funds code)
69    BOV = 984,
70    /// Brazilian real Brazil
71    BRL = 986,
72    /// Bahamian dollar Bahamas
73    BSD = 044,
74    /// Bhutanese ngultrum Bhutan
75    BTN = 064,
76    /// Botswana pula Botswana
77    BWP = 072,
78    /// Belarusian ruble Belarus
79    BYN = 933,
80    /// Belize dollar Belize
81    BZD = 084,
82    /// Canadian dollar Canada
83    CAD = 124,
84    /// Congolese franc Democratic Republic of the Congo
85    CDF = 976,
86    /// WIR euro (complementary currency)
87    CHE = 947,
88    /// Swiss franc Switzerland
89    CHF = 756,
90    /// WIR franc (complementary currency)
91    CHW = 948,
92    /// Unidad de Fomento (funds code)
93    CLF = 990,
94    /// Chilean peso Chile
95    CLP = 152,
96    /// Colombian peso Colombia
97    COP = 170,
98    ///  Unidad de Valor Real (UVR) (funds code)
99    COU = 970,
100    /// Costa Rican colon Costa Rica
101    CRC = 188,
102    /// Cuban convertible peso Cuba
103    CUC = 931,
104    /// Cuban peso Cuba
105    CUP = 192,
106    /// Cape Verdean escudo Cabo Verde
107    CVE = 132,
108    /// Czech koruna Czechia
109    CZK = 203,
110    /// Djiboutian franc Djibouti
111    DJF = 262,
112    /// Danish krone Denmark
113    DKK = 208,
114    /// Dominican peso Dominican Republic
115    DOP = 214,
116    /// Algerian dinar Algeria
117    DZD = 012,
118    /// Egyptian pound Egypt
119    EGP = 818,
120    /// Eritrean nakfa Eritrea
121    ERN = 232,
122    /// Ethiopian birr Ethiopia
123    ETB = 230,
124    /// Euro
125    EUR = 978,
126    /// Fiji dollar Fiji
127    FJD = 242,
128    /// Falkland Islands pound Falkland Islands (pegged to GBP)
129    FKP = 238,
130    /// Pound sterling United Kingdom
131    GBP = 826,
132    /// Georgian lari Georgia
133    GEL = 981,
134    /// Ghanaian cedi Ghana
135    GHS = 936,
136    /// Gibraltar pound Gibraltar (pegged to GBP)
137    GIP = 292,
138    /// Gambian dalasi Gambia
139    GMD = 270,
140    /// Guinean franc Guinea
141    GNF = 324,
142    /// Guatemalan quetzal Guatemala
143    GTQ = 320,
144    /// Guyanese dollar Guyana
145    GYD = 328,
146    /// Hong Kong dollar Hong Kong
147    HKD = 344,
148    /// Honduran lempira Honduras
149    HNL = 340,
150    /// Haitian gourde Haiti
151    HTG = 332,
152    /// Hungarian forint Hungary
153    HUF = 348,
154    /// Indonesian rupiah Indonesia
155    IDR = 360,
156    /// Israeli new shekel Israel
157    ILS = 376,
158    /// Indian rupee India
159    INR = 356,
160    /// Iraqi dinar Iraq
161    IQD = 368,
162    /// Iranian rial Iran
163    IRR = 364,
164    /// Icelandic kr
165    ISK = 352,
166    /// Jamaican dollar Jamaica
167    JMD = 388,
168    /// Jordanian dinar Jordan
169    JOD = 400,
170    /// Japanese yen Japan
171    JPY = 392,
172    /// Kenyan shilling Kenya
173    KES = 404,
174    /// Kyrgyzstani som Kyrgyzstan
175    KGS = 417,
176    /// Cambodian riel Cambodia
177    KHR = 116,
178    /// Comoro franc Comoros
179    KMF = 174,
180    /// North Korean won North Korea
181    KPW = 408,
182    /// South Korean won
183    KRW = 410,
184    /// Kuwaiti dinar Kuwait
185    KWD = 414,
186    /// Cayman Islands dollar Cayman Islands
187    KYD = 136,
188    /// Kazakhstani tenge Kazakhstan
189    KZT = 398,
190    /// Lao kip Laos
191    LAK = 418,
192    /// Lebanese pound Lebanon
193    LBP = 422,
194    /// Sri Lankan rupee Sri Lanka
195    LKR = 144,
196    /// Liberian dollar Liberia
197    LRD = 430,
198    /// Lesotho loti Lesotho
199    LSL = 426,
200    /// Libyan dinar Libya
201    LYD = 434,
202    /// Moroccan dirham Morocco
203    MAD = 504,
204    /// Moldovan leu Moldova
205    MDL = 498,
206    /// Malagasy ariary
207    MGA = 969,
208    /// Macedonian denar North Macedonia
209    MKD = 807,
210    /// Myanmar kyat Myanmar
211    MMK = 104,
212    /// Mongolian tögrög
213    MNT = 496,
214    /// Macanese pataca Macau
215    MOP = 446,
216    /// Mauritanian ouguiya
217    MRU = 929,
218    /// Mauritian rupee Mauritius
219    MUR = 480,
220    /// Maldivian rufiyaa Maldives
221    MVR = 462,
222    /// Malawian kwacha Malawi
223    MWK = 454,
224    /// Mexican peso Mexico
225    MXN = 484,
226    /// Mexican Unidad de Inversion (UDI) (funds code)
227    MXV = 979,
228    /// Malaysian ringgit Malaysia
229    MYR = 458,
230    /// Mozambican metical Mozambique
231    MZN = 943,
232    /// Namibian dollar Namibia (pegged to ZAR)
233    NAD = 516,
234    /// Nigerian naira Nigeria
235    NGN = 566,
236    /// Nicaraguan c
237    NIO = 558,
238    /// Norwegian krone Norway
239    NOK = 578,
240    /// Nepalese rupee Nepal
241    NPR = 524,
242    /// New Zealand dollar New Zealand
243    NZD = 554,
244    /// Omani rial Oman
245    OMR = 512,
246    /// Panamanian balboa Panama
247    PAB = 590,
248    /// Peruvian sol Peru
249    PEN = 604,
250    /// Papua New Guinean kina Papua New Guinea
251    PGK = 598,
252    /// Philippine peso
253    PHP = 608,
254    /// Pakistani rupee Pakistan
255    PKR = 586,
256    /// Polish z
257    PLN = 985,
258    /// Paraguayan guaran
259    PYG = 600,
260    /// Qatari riyal Qatar
261    QAR = 634,
262    /// Romanian leu Romania
263    RON = 946,
264    /// Serbian dinar Serbia
265    RSD = 941,
266    /// Renminbi
267    CNY = 156,
268    /// Russian ruble Russia
269    RUB = 643,
270    /// Rwandan franc Rwanda
271    RWF = 646,
272    /// Saudi riyal Saudi Arabia
273    SAR = 682,
274    /// Solomon Islands dollar Solomon Islands
275    SBD = 090,
276    /// Seychelles rupee Seychelles
277    SCR = 690,
278    /// Sudanese pound Sudan
279    SDG = 938,
280    /// Swedish krona (plural
281    SEK = 752,
282    /// Singapore dollar Singapore
283    SGD = 702,
284    /// Saint Helena pound Saint Helena (SH
285    SHP = 654,
286    /// Sierra Leonean leone (new leone)
287    SLE = 925,
288    /// Sierra Leonean leone (old leone)
289    SLL = 694,
290    /// Somali shilling Somalia
291    SOS = 706,
292    /// Surinamese dollar Suriname
293    SRD = 968,
294    /// South Sudanese pound South Sudan
295    SSP = 728,
296    /// São Tomé and Príncipe dobra
297    STN = 930,
298    /// Salvadoran col
299    SVC = 222,
300    /// Syrian pound Syria
301    SYP = 760,
302    /// Swazi lilangeni Eswatini
303    SZL = 748,
304    /// Thai baht Thailand
305    THB = 764,
306    /// Tajikistani somoni Tajikistan
307    TJS = 972,
308    /// Turkmenistan manat Turkmenistan
309    TMT = 934,
310    /// Tunisian dinar Tunisia
311    TND = 788,
312    /// Tongan pa
313    TOP = 776,
314    /// Turkish lira Turkey
315    TRY = 949,
316    /// Trinidad and Tobago dollar Trinidad and Tobago
317    TTD = 780,
318    /// New Taiwan dollar Taiwan
319    TWD = 901,
320    /// Tanzanian shilling Tanzania
321    TZS = 834,
322    /// Ukrainian hryvnia Ukraine
323    UAH = 980,
324    /// Ugandan shilling Uganda
325    UGX = 800,
326    /// United States dollar United States
327    USD = 840,
328    /// United States dollar (next day) (funds code)
329    USN = 997,
330    /// Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)
331    UYI = 940,
332    /// Uruguayan peso Uruguay
333    UYU = 858,
334    /// Unidad previsional
335    UYW = 927,
336    /// Uzbekistan sum Uzbekistan
337    UZS = 860,
338    /// Venezuelan digital bol
339    VED = 926,
340    /// Venezuelan sovereign bol
341    VES = 928,
342    /// Vietnamese
343    VND = 704,
344    /// Vanuatu vatu Vanuatu
345    VUV = 548,
346    /// Samoan tala Samoa
347    WST = 882,
348    /// CFA franc BEAC Cameroon (CM)
349    XAF = 950,
350    /// Silver (one troy ounce)
351    XAG = 961,
352    /// Gold (one troy ounce)
353    XAU = 959,
354    /// European Composite Unit (bond market unit)
355    XBA = 955,
356    /// European Monetary Unit (bond market unit)
357    XBB = 956,
358    /// European Unit of Account 9 (bond market unit)
359    XBC = 957,
360    /// European unit of account 17 (bond market unit)
361    XBD = 958,
362    /// East Caribbean dollar Anguilla (AI)
363    XCD = 951,
364    /// Special drawing rights
365    XDR = 960,
366    /// CFA franc BCEAO Benin (BJ)
367    XOF = 952,
368    /// Palladium (one troy ounce)
369    XPD = 964,
370    /// CFP franc (franc Pacifique)
371    XPF = 953,
372    /// Platinum (one troy ounce)
373    XPT = 962,
374    /// SUCRE
375    XSU = 994,
376    /// Code reserved for testing
377    XTS = 963,
378    /// ADB Unit of Account
379    XUA = 965,
380    /// No country code
381    #[default]
382    XXX = 999,
383    /// Yemeni rial Yemen
384    YER = 886,
385    /// South African rand Eswatini
386    ZAR = 710,
387    /// Zambian kwacha Zambia
388    ZMW = 967,
389    /// Zimbabwean dollar (fifth)
390    ZWL = 932,
391}
392
393impl Currency {
394    /// The length of the ASCII string, not the internal representation.
395    pub const LEN: usize = 3;
396
397    /// Creates a new [Currency].
398    pub const fn new() -> Self {
399        Self::XXX
400    }
401
402    /// Gets the name of the currency (in English).
403    pub const fn name(&self) -> &'static str {
404        match self {
405            Self::AED => "United Arab Emirates dirham United Arab Emirates",
406            Self::AFN => "Afghan afghani Afghanistan",
407            Self::ALL => "Albanian lek Albania",
408            Self::AMD => "Armenian dram Armenia",
409            Self::ANG => "Netherlands Antillean guilder Cura",
410            Self::AOA => "Angolan kwanza Angola",
411            Self::ARS => "Argentine peso Argentina",
412            Self::AUD => "Australian dollar Australia",
413            Self::AWG => "Aruban florin Aruba",
414            Self::AZN => "Azerbaijani manat Azerbaijan",
415            Self::BAM => "Bosnia and Herzegovina convertible mark Bosnia and Herzegovina",
416            Self::BBD => "Barbados dollar Barbados",
417            Self::BDT => "Bangladeshi taka Bangladesh",
418            Self::BGN => "Bulgarian lev Bulgaria",
419            Self::BHD => "Bahraini dinar Bahrain",
420            Self::BIF => "Burundian franc Burundi",
421            Self::BMD => "Bermudian dollar Bermuda",
422            Self::BND => "Brunei dollar Brunei",
423            Self::BOB => "Boliviano Bolivia",
424            Self::BOV => "Bolivian Mvdol (funds code)",
425            Self::BRL => "Brazilian real Brazil",
426            Self::BSD => "Bahamian dollar Bahamas",
427            Self::BTN => "Bhutanese ngultrum Bhutan",
428            Self::BWP => "Botswana pula Botswana",
429            Self::BYN => "Belarusian ruble Belarus",
430            Self::BZD => "Belize dollar Belize",
431            Self::CAD => "Canadian dollar Canada",
432            Self::CDF => "Congolese franc Democratic Republic of the Congo",
433            Self::CHE => "WIR euro (complementary currency)",
434            Self::CHF => "Swiss franc Switzerland",
435            Self::CHW => "WIR franc (complementary currency)",
436            Self::CLF => "Unidad de Fomento (funds code)",
437            Self::CLP => "Chilean peso Chile",
438            Self::COP => "Colombian peso Colombia",
439            Self::COU => " Unidad de Valor Real (UVR) (funds code)",
440            Self::CRC => "Costa Rican colon Costa Rica",
441            Self::CUC => "Cuban convertible peso Cuba",
442            Self::CUP => "Cuban peso Cuba",
443            Self::CVE => "Cape Verdean escudo Cabo Verde",
444            Self::CZK => "Czech koruna Czechia",
445            Self::DJF => "Djiboutian franc Djibouti",
446            Self::DKK => "Danish krone Denmark",
447            Self::DOP => "Dominican peso Dominican Republic",
448            Self::DZD => "Algerian dinar Algeria",
449            Self::EGP => "Egyptian pound Egypt",
450            Self::ERN => "Eritrean nakfa Eritrea",
451            Self::ETB => "Ethiopian birr Ethiopia",
452            Self::EUR => "Euro",
453            Self::FJD => "Fiji dollar Fiji",
454            Self::FKP => "Falkland Islands pound Falkland Islands (pegged to GBP)",
455            Self::GBP => "Pound sterling United Kingdom",
456            Self::GEL => "Georgian lari Georgia",
457            Self::GHS => "Ghanaian cedi Ghana",
458            Self::GIP => "Gibraltar pound Gibraltar (pegged to GBP)",
459            Self::GMD => "Gambian dalasi Gambia",
460            Self::GNF => "Guinean franc Guinea",
461            Self::GTQ => "Guatemalan quetzal Guatemala",
462            Self::GYD => "Guyanese dollar Guyana",
463            Self::HKD => "Hong Kong dollar Hong Kong",
464            Self::HNL => "Honduran lempira Honduras",
465            Self::HTG => "Haitian gourde Haiti",
466            Self::HUF => "Hungarian forint Hungary",
467            Self::IDR => "Indonesian rupiah Indonesia",
468            Self::ILS => "Israeli new shekel Israel",
469            Self::INR => "Indian rupee India",
470            Self::IQD => "Iraqi dinar Iraq",
471            Self::IRR => "Iranian rial Iran",
472            Self::ISK => "Icelandic kr",
473            Self::JMD => "Jamaican dollar Jamaica",
474            Self::JOD => "Jordanian dinar Jordan",
475            Self::JPY => "Japanese yen Japan",
476            Self::KES => "Kenyan shilling Kenya",
477            Self::KGS => "Kyrgyzstani som Kyrgyzstan",
478            Self::KHR => "Cambodian riel Cambodia",
479            Self::KMF => "Comoro franc Comoros",
480            Self::KPW => "North Korean won North Korea",
481            Self::KRW => "South Korean won",
482            Self::KWD => "Kuwaiti dinar Kuwait",
483            Self::KYD => "Cayman Islands dollar Cayman Islands",
484            Self::KZT => "Kazakhstani tenge Kazakhstan",
485            Self::LAK => "Lao kip Laos",
486            Self::LBP => "Lebanese pound Lebanon",
487            Self::LKR => "Sri Lankan rupee Sri Lanka",
488            Self::LRD => "Liberian dollar Liberia",
489            Self::LSL => "Lesotho loti Lesotho",
490            Self::LYD => "Libyan dinar Libya",
491            Self::MAD => "Moroccan dirham Morocco",
492            Self::MDL => "Moldovan leu Moldova",
493            Self::MGA => "Malagasy ariary",
494            Self::MKD => "Macedonian denar North Macedonia",
495            Self::MMK => "Myanmar kyat Myanmar",
496            Self::MNT => "Mongolian tögrög",
497            Self::MOP => "Macanese pataca Macau",
498            Self::MRU => "Mauritanian ouguiya",
499            Self::MUR => "Mauritian rupee Mauritius",
500            Self::MVR => "Maldivian rufiyaa Maldives",
501            Self::MWK => "Malawian kwacha Malawi",
502            Self::MXN => "Mexican peso Mexico",
503            Self::MXV => "Mexican Unidad de Inversion (UDI) (funds code)",
504            Self::MYR => "Malaysian ringgit Malaysia",
505            Self::MZN => "Mozambican metical Mozambique",
506            Self::NAD => "Namibian dollar Namibia (pegged to ZAR)",
507            Self::NGN => "Nigerian naira Nigeria",
508            Self::NIO => "Nicaraguan c",
509            Self::NOK => "Norwegian krone Norway",
510            Self::NPR => "Nepalese rupee Nepal",
511            Self::NZD => "New Zealand dollar New Zealand",
512            Self::OMR => "Omani rial Oman",
513            Self::PAB => "Panamanian balboa Panama",
514            Self::PEN => "Peruvian sol Peru",
515            Self::PGK => "Papua New Guinean kina Papua New Guinea",
516            Self::PHP => "Philippine peso",
517            Self::PKR => "Pakistani rupee Pakistan",
518            Self::PLN => "Polish z",
519            Self::PYG => "Paraguayan guaran",
520            Self::QAR => "Qatari riyal Qatar",
521            Self::RON => "Romanian leu Romania",
522            Self::RSD => "Serbian dinar Serbia",
523            Self::CNY => "Renminbi",
524            Self::RUB => "Russian ruble Russia",
525            Self::RWF => "Rwandan franc Rwanda",
526            Self::SAR => "Saudi riyal Saudi Arabia",
527            Self::SBD => "Solomon Islands dollar Solomon Islands",
528            Self::SCR => "Seychelles rupee Seychelles",
529            Self::SDG => "Sudanese pound Sudan",
530            Self::SEK => "Swedish krona (plural",
531            Self::SGD => "Singapore dollar Singapore",
532            Self::SHP => "Saint Helena pound Saint Helena (SH",
533            Self::SLE => "Sierra Leonean leone (new leone)",
534            Self::SLL => "Sierra Leonean leone (old leone)",
535            Self::SOS => "Somali shilling Somalia",
536            Self::SRD => "Surinamese dollar Suriname",
537            Self::SSP => "South Sudanese pound South Sudan",
538            Self::STN => "São Tomé and Príncipe dobra",
539            Self::SVC => "Salvadoran col",
540            Self::SYP => "Syrian pound Syria",
541            Self::SZL => "Swazi lilangeni Eswatini",
542            Self::THB => "Thai baht Thailand",
543            Self::TJS => "Tajikistani somoni Tajikistan",
544            Self::TMT => "Turkmenistan manat Turkmenistan",
545            Self::TND => "Tunisian dinar Tunisia",
546            Self::TOP => "Tongan pa",
547            Self::TRY => "Turkish lira Turkey",
548            Self::TTD => "Trinidad and Tobago dollar Trinidad and Tobago",
549            Self::TWD => "New Taiwan dollar Taiwan",
550            Self::TZS => "Tanzanian shilling Tanzania",
551            Self::UAH => "Ukrainian hryvnia Ukraine",
552            Self::UGX => "Ugandan shilling Uganda",
553            Self::USD => "United States dollar United States",
554            Self::USN => "United States dollar (next day) (funds code)",
555            Self::UYI => "Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)",
556            Self::UYU => "Uruguayan peso Uruguay",
557            Self::UYW => "Unidad previsional",
558            Self::UZS => "Uzbekistan sum Uzbekistan",
559            Self::VED => "Venezuelan digital bol",
560            Self::VES => "Venezuelan sovereign bol",
561            Self::VND => "Vietnamese",
562            Self::VUV => "Vanuatu vatu Vanuatu",
563            Self::WST => "Samoan tala Samoa",
564            Self::XAF => "CFA franc BEAC Cameroon (CM)",
565            Self::XAG => "Silver (one troy ounce)",
566            Self::XAU => "Gold (one troy ounce)",
567            Self::XBA => "European Composite Unit (bond market unit)",
568            Self::XBB => "European Monetary Unit (bond market unit)",
569            Self::XBC => "European Unit of Account 9 (bond market unit)",
570            Self::XBD => "European unit of account 17 (bond market unit)",
571            Self::XCD => "East Caribbean dollar Anguilla (AI)",
572            Self::XDR => "Special drawing rights",
573            Self::XOF => "CFA franc BCEAO Benin (BJ)",
574            Self::XPD => "Palladium (one troy ounce)",
575            Self::XPF => "CFP franc (franc Pacifique)",
576            Self::XPT => "Platinum (one troy ounce)",
577            Self::XSU => "SUCRE",
578            Self::XTS => "Code reserved for testing",
579            Self::XUA => "ADB Unit of Account",
580            Self::XXX => "No country code",
581            Self::YER => "Yemeni rial Yemen",
582            Self::ZAR => "South African rand Eswatini",
583            Self::ZMW => "Zambian kwacha Zambia",
584            Self::ZWL => "Zimbabwean dollar (fifth)",
585        }
586    }
587}
588
589impl From<Currency> for u32 {
590    fn from(val: Currency) -> Self {
591        val as u32
592    }
593}
594
595impl From<&Currency> for u32 {
596    fn from(val: &Currency) -> Self {
597        (*val).into()
598    }
599}
600
601impl From<Currency> for [i8; 4] {
602    fn from(val: Currency) -> Self {
603        let cur_str = <&str>::from(val);
604        let cur_bytes = cur_str.as_bytes();
605
606        [
607            cur_bytes[0] as i8,
608            cur_bytes[1] as i8,
609            cur_bytes[2] as i8,
610            b'\0' as i8,
611        ]
612    }
613}
614
615impl From<&Currency> for [i8; 4] {
616    fn from(val: &Currency) -> Self {
617        (*val).into()
618    }
619}
620
621impl From<Currency> for &'static str {
622    fn from(val: Currency) -> Self {
623        match val {
624            Currency::AED => "AED",
625            Currency::AFN => "AFN",
626            Currency::ALL => "ALL",
627            Currency::AMD => "AMD",
628            Currency::ANG => "ANG",
629            Currency::AOA => "AOA",
630            Currency::ARS => "ARS",
631            Currency::AUD => "AUD",
632            Currency::AWG => "AWG",
633            Currency::AZN => "AZN",
634            Currency::BAM => "BAM",
635            Currency::BBD => "BBD",
636            Currency::BDT => "BDT",
637            Currency::BGN => "BGN",
638            Currency::BHD => "BHD",
639            Currency::BIF => "BIF",
640            Currency::BMD => "BMD",
641            Currency::BND => "BND",
642            Currency::BOB => "BOB",
643            Currency::BOV => "BOV",
644            Currency::BRL => "BRL",
645            Currency::BSD => "BSD",
646            Currency::BTN => "BTN",
647            Currency::BWP => "BWP",
648            Currency::BYN => "BYN",
649            Currency::BZD => "BZD",
650            Currency::CAD => "CAD",
651            Currency::CDF => "CDF",
652            Currency::CHE => "CHE",
653            Currency::CHF => "CHF",
654            Currency::CHW => "CHW",
655            Currency::CLF => "CLF",
656            Currency::CLP => "CLP",
657            Currency::COP => "COP",
658            Currency::COU => "COU",
659            Currency::CRC => "CRC",
660            Currency::CUC => "CUC",
661            Currency::CUP => "CUP",
662            Currency::CVE => "CVE",
663            Currency::CZK => "CZK",
664            Currency::DJF => "DJF",
665            Currency::DKK => "DKK",
666            Currency::DOP => "DOP",
667            Currency::DZD => "DZD",
668            Currency::EGP => "EGP",
669            Currency::ERN => "ERN",
670            Currency::ETB => "ETB",
671            Currency::EUR => "EUR",
672            Currency::FJD => "FJD",
673            Currency::FKP => "FKP",
674            Currency::GBP => "GBP",
675            Currency::GEL => "GEL",
676            Currency::GHS => "GHS",
677            Currency::GIP => "GIP",
678            Currency::GMD => "GMD",
679            Currency::GNF => "GNF",
680            Currency::GTQ => "GTQ",
681            Currency::GYD => "GYD",
682            Currency::HKD => "HKD",
683            Currency::HNL => "HNL",
684            Currency::HTG => "HTG",
685            Currency::HUF => "HUF",
686            Currency::IDR => "IDR",
687            Currency::ILS => "ILS",
688            Currency::INR => "INR",
689            Currency::IQD => "IQD",
690            Currency::IRR => "IRR",
691            Currency::ISK => "ISK",
692            Currency::JMD => "JMD",
693            Currency::JOD => "JOD",
694            Currency::JPY => "JPY",
695            Currency::KES => "KES",
696            Currency::KGS => "KGS",
697            Currency::KHR => "KHR",
698            Currency::KMF => "KMF",
699            Currency::KPW => "KPW",
700            Currency::KRW => "KRW",
701            Currency::KWD => "KWD",
702            Currency::KYD => "KYD",
703            Currency::KZT => "KZT",
704            Currency::LAK => "LAK",
705            Currency::LBP => "LBP",
706            Currency::LKR => "LKR",
707            Currency::LRD => "LRD",
708            Currency::LSL => "LSL",
709            Currency::LYD => "LYD",
710            Currency::MAD => "MAD",
711            Currency::MDL => "MDL",
712            Currency::MGA => "MGA",
713            Currency::MKD => "MKD",
714            Currency::MMK => "MMK",
715            Currency::MNT => "MNT",
716            Currency::MOP => "MOP",
717            Currency::MRU => "MRU",
718            Currency::MUR => "MUR",
719            Currency::MVR => "MVR",
720            Currency::MWK => "MWK",
721            Currency::MXN => "MXN",
722            Currency::MXV => "MXV",
723            Currency::MYR => "MYR",
724            Currency::MZN => "MZN",
725            Currency::NAD => "NAD",
726            Currency::NGN => "NGN",
727            Currency::NIO => "NIO",
728            Currency::NOK => "NOK",
729            Currency::NPR => "NPR",
730            Currency::NZD => "NZD",
731            Currency::OMR => "OMR",
732            Currency::PAB => "PAB",
733            Currency::PEN => "PEN",
734            Currency::PGK => "PGK",
735            Currency::PHP => "PHP",
736            Currency::PKR => "PKR",
737            Currency::PLN => "PLN",
738            Currency::PYG => "PYG",
739            Currency::QAR => "QAR",
740            Currency::RON => "RON",
741            Currency::RSD => "RSD",
742            Currency::CNY => "CNY",
743            Currency::RUB => "RUB",
744            Currency::RWF => "RWF",
745            Currency::SAR => "SAR",
746            Currency::SBD => "SBD",
747            Currency::SCR => "SCR",
748            Currency::SDG => "SDG",
749            Currency::SEK => "SEK",
750            Currency::SGD => "SGD",
751            Currency::SHP => "SHP",
752            Currency::SLE => "SLE",
753            Currency::SLL => "SLL",
754            Currency::SOS => "SOS",
755            Currency::SRD => "SRD",
756            Currency::SSP => "SSP",
757            Currency::STN => "STN",
758            Currency::SVC => "SVC",
759            Currency::SYP => "SYP",
760            Currency::SZL => "SZL",
761            Currency::THB => "THB",
762            Currency::TJS => "TJS",
763            Currency::TMT => "TMT",
764            Currency::TND => "TND",
765            Currency::TOP => "TOP",
766            Currency::TRY => "TRY",
767            Currency::TTD => "TTD",
768            Currency::TWD => "TWD",
769            Currency::TZS => "TZS",
770            Currency::UAH => "UAH",
771            Currency::UGX => "UGX",
772            Currency::USD => "USD",
773            Currency::USN => "USN",
774            Currency::UYI => "UYI",
775            Currency::UYU => "UYU",
776            Currency::UYW => "UYW",
777            Currency::UZS => "UZS",
778            Currency::VED => "VED",
779            Currency::VES => "VES",
780            Currency::VND => "VND",
781            Currency::VUV => "VUV",
782            Currency::WST => "WST",
783            Currency::XAF => "XAF",
784            Currency::XAG => "XAG",
785            Currency::XAU => "XAU",
786            Currency::XBA => "XBA",
787            Currency::XBB => "XBB",
788            Currency::XBC => "XBC",
789            Currency::XBD => "XBD",
790            Currency::XCD => "XCD",
791            Currency::XDR => "XDR",
792            Currency::XOF => "XOF",
793            Currency::XPD => "XPD",
794            Currency::XPF => "XPF",
795            Currency::XPT => "XPT",
796            Currency::XSU => "XSU",
797            Currency::XTS => "XTS",
798            Currency::XUA => "XUA",
799            Currency::XXX => "XXX",
800            Currency::YER => "YER",
801            Currency::ZAR => "ZAR",
802            Currency::ZMW => "ZMW",
803            Currency::ZWL => "ZWL",
804        }
805    }
806}
807
808impl From<&Currency> for &'static str {
809    fn from(val: &Currency) -> Self {
810        (*val).into()
811    }
812}
813
814impl From<&str> for Currency {
815    fn from(val: &str) -> Self {
816        if val.len() < 3 {
817            Self::XXX
818        } else {
819            let cc = val.to_uppercase();
820            if cc.len() < 3 {
821                Self::XXX
822            } else {
823                match &cc.as_bytes()[..3] {
824                    b"AED" => Self::AED,
825                    b"AFN" => Self::AFN,
826                    b"ALL" => Self::ALL,
827                    b"AMD" => Self::AMD,
828                    b"ANG" => Self::ANG,
829                    b"AOA" => Self::AOA,
830                    b"ARS" => Self::ARS,
831                    b"AUD" => Self::AUD,
832                    b"AWG" => Self::AWG,
833                    b"AZN" => Self::AZN,
834                    b"BAM" => Self::BAM,
835                    b"BBD" => Self::BBD,
836                    b"BDT" => Self::BDT,
837                    b"BGN" => Self::BGN,
838                    b"BHD" => Self::BHD,
839                    b"BIF" => Self::BIF,
840                    b"BMD" => Self::BMD,
841                    b"BND" => Self::BND,
842                    b"BOB" => Self::BOB,
843                    b"BOV" => Self::BOV,
844                    b"BRL" => Self::BRL,
845                    b"BSD" => Self::BSD,
846                    b"BTN" => Self::BTN,
847                    b"BWP" => Self::BWP,
848                    b"BYN" => Self::BYN,
849                    b"BZD" => Self::BZD,
850                    b"CAD" => Self::CAD,
851                    b"CDF" => Self::CDF,
852                    b"CHE" => Self::CHE,
853                    b"CHF" => Self::CHF,
854                    b"CHW" => Self::CHW,
855                    b"CLF" => Self::CLF,
856                    b"CLP" => Self::CLP,
857                    b"COP" => Self::COP,
858                    b"COU" => Self::COU,
859                    b"CRC" => Self::CRC,
860                    b"CUC" => Self::CUC,
861                    b"CUP" => Self::CUP,
862                    b"CVE" => Self::CVE,
863                    b"CZK" => Self::CZK,
864                    b"DJF" => Self::DJF,
865                    b"DKK" => Self::DKK,
866                    b"DOP" => Self::DOP,
867                    b"DZD" => Self::DZD,
868                    b"EGP" => Self::EGP,
869                    b"ERN" => Self::ERN,
870                    b"ETB" => Self::ETB,
871                    b"EUR" => Self::EUR,
872                    b"FJD" => Self::FJD,
873                    b"FKP" => Self::FKP,
874                    b"GBP" => Self::GBP,
875                    b"GEL" => Self::GEL,
876                    b"GHS" => Self::GHS,
877                    b"GIP" => Self::GIP,
878                    b"GMD" => Self::GMD,
879                    b"GNF" => Self::GNF,
880                    b"GTQ" => Self::GTQ,
881                    b"GYD" => Self::GYD,
882                    b"HKD" => Self::HKD,
883                    b"HNL" => Self::HNL,
884                    b"HTG" => Self::HTG,
885                    b"HUF" => Self::HUF,
886                    b"IDR" => Self::IDR,
887                    b"ILS" => Self::ILS,
888                    b"INR" => Self::INR,
889                    b"IQD" => Self::IQD,
890                    b"IRR" => Self::IRR,
891                    b"ISK" => Self::ISK,
892                    b"JMD" => Self::JMD,
893                    b"JOD" => Self::JOD,
894                    b"JPY" => Self::JPY,
895                    b"KES" => Self::KES,
896                    b"KGS" => Self::KGS,
897                    b"KHR" => Self::KHR,
898                    b"KMF" => Self::KMF,
899                    b"KPW" => Self::KPW,
900                    b"KRW" => Self::KRW,
901                    b"KWD" => Self::KWD,
902                    b"KYD" => Self::KYD,
903                    b"KZT" => Self::KZT,
904                    b"LAK" => Self::LAK,
905                    b"LBP" => Self::LBP,
906                    b"LKR" => Self::LKR,
907                    b"LRD" => Self::LRD,
908                    b"LSL" => Self::LSL,
909                    b"LYD" => Self::LYD,
910                    b"MAD" => Self::MAD,
911                    b"MDL" => Self::MDL,
912                    b"MGA" => Self::MGA,
913                    b"MKD" => Self::MKD,
914                    b"MMK" => Self::MMK,
915                    b"MNT" => Self::MNT,
916                    b"MOP" => Self::MOP,
917                    b"MRU" => Self::MRU,
918                    b"MUR" => Self::MUR,
919                    b"MVR" => Self::MVR,
920                    b"MWK" => Self::MWK,
921                    b"MXN" => Self::MXN,
922                    b"MXV" => Self::MXV,
923                    b"MYR" => Self::MYR,
924                    b"MZN" => Self::MZN,
925                    b"NAD" => Self::NAD,
926                    b"NGN" => Self::NGN,
927                    b"NIO" => Self::NIO,
928                    b"NOK" => Self::NOK,
929                    b"NPR" => Self::NPR,
930                    b"NZD" => Self::NZD,
931                    b"OMR" => Self::OMR,
932                    b"PAB" => Self::PAB,
933                    b"PEN" => Self::PEN,
934                    b"PGK" => Self::PGK,
935                    b"PHP" => Self::PHP,
936                    b"PKR" => Self::PKR,
937                    b"PLN" => Self::PLN,
938                    b"PYG" => Self::PYG,
939                    b"QAR" => Self::QAR,
940                    b"RON" => Self::RON,
941                    b"RSD" => Self::RSD,
942                    b"CNY" => Self::CNY,
943                    b"RUB" => Self::RUB,
944                    b"RWF" => Self::RWF,
945                    b"SAR" => Self::SAR,
946                    b"SBD" => Self::SBD,
947                    b"SCR" => Self::SCR,
948                    b"SDG" => Self::SDG,
949                    b"SEK" => Self::SEK,
950                    b"SGD" => Self::SGD,
951                    b"SHP" => Self::SHP,
952                    b"SLE" => Self::SLE,
953                    b"SLL" => Self::SLL,
954                    b"SOS" => Self::SOS,
955                    b"SRD" => Self::SRD,
956                    b"SSP" => Self::SSP,
957                    b"STN" => Self::STN,
958                    b"SVC" => Self::SVC,
959                    b"SYP" => Self::SYP,
960                    b"SZL" => Self::SZL,
961                    b"THB" => Self::THB,
962                    b"TJS" => Self::TJS,
963                    b"TMT" => Self::TMT,
964                    b"TND" => Self::TND,
965                    b"TOP" => Self::TOP,
966                    b"TRY" => Self::TRY,
967                    b"TTD" => Self::TTD,
968                    b"TWD" => Self::TWD,
969                    b"TZS" => Self::TZS,
970                    b"UAH" => Self::UAH,
971                    b"UGX" => Self::UGX,
972                    b"USD" => Self::USD,
973                    b"USN" => Self::USN,
974                    b"UYI" => Self::UYI,
975                    b"UYU" => Self::UYU,
976                    b"UYW" => Self::UYW,
977                    b"UZS" => Self::UZS,
978                    b"VED" => Self::VED,
979                    b"VES" => Self::VES,
980                    b"VND" => Self::VND,
981                    b"VUV" => Self::VUV,
982                    b"WST" => Self::WST,
983                    b"XAF" => Self::XAF,
984                    b"XAG" => Self::XAG,
985                    b"XAU" => Self::XAU,
986                    b"XBA" => Self::XBA,
987                    b"XBB" => Self::XBB,
988                    b"XBC" => Self::XBC,
989                    b"XBD" => Self::XBD,
990                    b"XCD" => Self::XCD,
991                    b"XDR" => Self::XDR,
992                    b"XOF" => Self::XOF,
993                    b"XPD" => Self::XPD,
994                    b"XPF" => Self::XPF,
995                    b"XPT" => Self::XPT,
996                    b"XSU" => Self::XSU,
997                    b"XTS" => Self::XTS,
998                    b"XUA" => Self::XUA,
999                    b"XXX" => Self::XXX,
1000                    b"YER" => Self::YER,
1001                    b"ZAR" => Self::ZAR,
1002                    b"ZMW" => Self::ZMW,
1003                    b"ZWL" => Self::ZWL,
1004                    _ => Self::XXX,
1005                }
1006            }
1007        }
1008    }
1009}
1010
1011impl From<&[i8]> for Currency {
1012    fn from(val: &[i8]) -> Self {
1013        if val.len() < 3 {
1014            Self::XXX
1015        } else {
1016            std::str::from_utf8(&[val[0] as u8, val[1] as u8, val[2] as u8])
1017                .unwrap_or("XXX")
1018                .into()
1019        }
1020    }
1021}
1022
1023impl<const N: usize> From<&[i8; N]> for Currency {
1024    fn from(val: &[i8; N]) -> Self {
1025        val.as_ref().into()
1026    }
1027}
1028
1029impl<const N: usize> From<[i8; N]> for Currency {
1030    fn from(val: [i8; N]) -> Self {
1031        val.as_ref().into()
1032    }
1033}
1034
1035impl From<&[u8]> for Currency {
1036    fn from(val: &[u8]) -> Self {
1037        if val.len() < 3 {
1038            Self::XXX
1039        } else {
1040            std::str::from_utf8(&[val[0], val[1], val[2]])
1041                .unwrap_or("XXX")
1042                .into()
1043        }
1044    }
1045}
1046
1047impl<const N: usize> From<&[u8; N]> for Currency {
1048    fn from(val: &[u8; N]) -> Self {
1049        val.as_ref().into()
1050    }
1051}
1052
1053impl<const N: usize> From<[u8; N]> for Currency {
1054    fn from(val: [u8; N]) -> Self {
1055        val.as_ref().into()
1056    }
1057}
1058
1059impl fmt::Display for Currency {
1060    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1061        write!(f, r#""{}""#, <&str>::from(self))
1062    }
1063}
1064
1065#[cfg(test)]
1066mod tests {
1067    use super::*;
1068
1069    #[test]
1070    fn test_from_valid_str() {
1071        let valid_code_strs = [
1072            "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD",
1073            "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP",
1074            "BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "COP", "COU", "CRC",
1075            "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR",
1076            "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL",
1077            "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES",
1078            "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD",
1079            "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR",
1080            "MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR",
1081            "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "CNY", "RUB",
1082            "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLE", "SLL", "SOS", "SRD",
1083            "SSP", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD",
1084            "TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", "VED", "VES",
1085            "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR",
1086            "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMW", "ZWL",
1087        ];
1088        let valid_codes = [
1089            Currency::AED,
1090            Currency::AFN,
1091            Currency::ALL,
1092            Currency::AMD,
1093            Currency::ANG,
1094            Currency::AOA,
1095            Currency::ARS,
1096            Currency::AUD,
1097            Currency::AWG,
1098            Currency::AZN,
1099            Currency::BAM,
1100            Currency::BBD,
1101            Currency::BDT,
1102            Currency::BGN,
1103            Currency::BHD,
1104            Currency::BIF,
1105            Currency::BMD,
1106            Currency::BND,
1107            Currency::BOB,
1108            Currency::BOV,
1109            Currency::BRL,
1110            Currency::BSD,
1111            Currency::BTN,
1112            Currency::BWP,
1113            Currency::BYN,
1114            Currency::BZD,
1115            Currency::CAD,
1116            Currency::CDF,
1117            Currency::CHE,
1118            Currency::CHF,
1119            Currency::CHW,
1120            Currency::CLF,
1121            Currency::CLP,
1122            Currency::COP,
1123            Currency::COU,
1124            Currency::CRC,
1125            Currency::CUC,
1126            Currency::CUP,
1127            Currency::CVE,
1128            Currency::CZK,
1129            Currency::DJF,
1130            Currency::DKK,
1131            Currency::DOP,
1132            Currency::DZD,
1133            Currency::EGP,
1134            Currency::ERN,
1135            Currency::ETB,
1136            Currency::EUR,
1137            Currency::FJD,
1138            Currency::FKP,
1139            Currency::GBP,
1140            Currency::GEL,
1141            Currency::GHS,
1142            Currency::GIP,
1143            Currency::GMD,
1144            Currency::GNF,
1145            Currency::GTQ,
1146            Currency::GYD,
1147            Currency::HKD,
1148            Currency::HNL,
1149            Currency::HTG,
1150            Currency::HUF,
1151            Currency::IDR,
1152            Currency::ILS,
1153            Currency::INR,
1154            Currency::IQD,
1155            Currency::IRR,
1156            Currency::ISK,
1157            Currency::JMD,
1158            Currency::JOD,
1159            Currency::JPY,
1160            Currency::KES,
1161            Currency::KGS,
1162            Currency::KHR,
1163            Currency::KMF,
1164            Currency::KPW,
1165            Currency::KRW,
1166            Currency::KWD,
1167            Currency::KYD,
1168            Currency::KZT,
1169            Currency::LAK,
1170            Currency::LBP,
1171            Currency::LKR,
1172            Currency::LRD,
1173            Currency::LSL,
1174            Currency::LYD,
1175            Currency::MAD,
1176            Currency::MDL,
1177            Currency::MGA,
1178            Currency::MKD,
1179            Currency::MMK,
1180            Currency::MNT,
1181            Currency::MOP,
1182            Currency::MRU,
1183            Currency::MUR,
1184            Currency::MVR,
1185            Currency::MWK,
1186            Currency::MXN,
1187            Currency::MXV,
1188            Currency::MYR,
1189            Currency::MZN,
1190            Currency::NAD,
1191            Currency::NGN,
1192            Currency::NIO,
1193            Currency::NOK,
1194            Currency::NPR,
1195            Currency::NZD,
1196            Currency::OMR,
1197            Currency::PAB,
1198            Currency::PEN,
1199            Currency::PGK,
1200            Currency::PHP,
1201            Currency::PKR,
1202            Currency::PLN,
1203            Currency::PYG,
1204            Currency::QAR,
1205            Currency::RON,
1206            Currency::RSD,
1207            Currency::CNY,
1208            Currency::RUB,
1209            Currency::RWF,
1210            Currency::SAR,
1211            Currency::SBD,
1212            Currency::SCR,
1213            Currency::SDG,
1214            Currency::SEK,
1215            Currency::SGD,
1216            Currency::SHP,
1217            Currency::SLE,
1218            Currency::SLL,
1219            Currency::SOS,
1220            Currency::SRD,
1221            Currency::SSP,
1222            Currency::STN,
1223            Currency::SVC,
1224            Currency::SYP,
1225            Currency::SZL,
1226            Currency::THB,
1227            Currency::TJS,
1228            Currency::TMT,
1229            Currency::TND,
1230            Currency::TOP,
1231            Currency::TRY,
1232            Currency::TTD,
1233            Currency::TWD,
1234            Currency::TZS,
1235            Currency::UAH,
1236            Currency::UGX,
1237            Currency::USD,
1238            Currency::USN,
1239            Currency::UYI,
1240            Currency::UYU,
1241            Currency::UYW,
1242            Currency::UZS,
1243            Currency::VED,
1244            Currency::VES,
1245            Currency::VND,
1246            Currency::VUV,
1247            Currency::WST,
1248            Currency::XAF,
1249            Currency::XAG,
1250            Currency::XAU,
1251            Currency::XBA,
1252            Currency::XBB,
1253            Currency::XBC,
1254            Currency::XBD,
1255            Currency::XCD,
1256            Currency::XDR,
1257            Currency::XOF,
1258            Currency::XPD,
1259            Currency::XPF,
1260            Currency::XPT,
1261            Currency::XSU,
1262            Currency::XTS,
1263            Currency::XUA,
1264            Currency::XXX,
1265            Currency::YER,
1266            Currency::ZAR,
1267            Currency::ZMW,
1268            Currency::ZWL,
1269        ];
1270
1271        valid_code_strs
1272            .iter()
1273            .zip(valid_codes.iter())
1274            .for_each(|(&code_str, &code)| {
1275                assert_eq!(Currency::from(code_str), code);
1276            });
1277    }
1278
1279    #[test]
1280    #[cfg(feature = "slow-tests")]
1281    fn test_from_all_str() {
1282        let valid_codes = [
1283            "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD",
1284            "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP",
1285            "BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "COP", "COU", "CRC",
1286            "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR",
1287            "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL",
1288            "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES",
1289            "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD",
1290            "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR",
1291            "MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR",
1292            "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "CNY", "RUB",
1293            "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLE", "SLL", "SOS", "SRD",
1294            "SSP", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD",
1295            "TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", "VED", "VES",
1296            "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR",
1297            "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "YER", "ZAR", "ZMW", "ZWL",
1298        ];
1299
1300        for i in 0..=u8::MAX {
1301            let att = &[i];
1302            assert_eq!(Currency::from(att), Currency::XXX);
1303
1304            for j in 0..=u8::MAX {
1305                let att = &[i, j];
1306                assert_eq!(Currency::from(att), Currency::XXX);
1307
1308                for k in 0..=u8::MAX {
1309                    let att = &[i, j, k];
1310                    if valid_codes.contains(
1311                        &std::str::from_utf8(att)
1312                            .unwrap_or("___")
1313                            .to_uppercase()
1314                            .as_str(),
1315                    ) {
1316                        assert_ne!(Currency::from(att), Currency::XXX);
1317                    } else {
1318                        assert_eq!(Currency::from(att), Currency::XXX);
1319                    }
1320                }
1321            }
1322        }
1323    }
1324}