1#![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#[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 AED = 784,
32 AFN = 971,
34 ALL = 008,
36 AMD = 051,
38 ANG = 532,
40 AOA = 973,
42 ARS = 032,
44 AUD = 036,
46 AWG = 533,
48 AZN = 944,
50 BAM = 977,
52 BBD = 052,
54 BDT = 050,
56 BGN = 975,
58 BHD = 048,
60 BIF = 108,
62 BMD = 060,
64 BND = 096,
66 BOB = 068,
68 BOV = 984,
70 BRL = 986,
72 BSD = 044,
74 BTN = 064,
76 BWP = 072,
78 BYN = 933,
80 BZD = 084,
82 CAD = 124,
84 CDF = 976,
86 CHE = 947,
88 CHF = 756,
90 CHW = 948,
92 CLF = 990,
94 CLP = 152,
96 COP = 170,
98 COU = 970,
100 CRC = 188,
102 CUC = 931,
104 CUP = 192,
106 CVE = 132,
108 CZK = 203,
110 DJF = 262,
112 DKK = 208,
114 DOP = 214,
116 DZD = 012,
118 EGP = 818,
120 ERN = 232,
122 ETB = 230,
124 EUR = 978,
126 FJD = 242,
128 FKP = 238,
130 GBP = 826,
132 GEL = 981,
134 GHS = 936,
136 GIP = 292,
138 GMD = 270,
140 GNF = 324,
142 GTQ = 320,
144 GYD = 328,
146 HKD = 344,
148 HNL = 340,
150 HTG = 332,
152 HUF = 348,
154 IDR = 360,
156 ILS = 376,
158 INR = 356,
160 IQD = 368,
162 IRR = 364,
164 ISK = 352,
166 JMD = 388,
168 JOD = 400,
170 JPY = 392,
172 KES = 404,
174 KGS = 417,
176 KHR = 116,
178 KMF = 174,
180 KPW = 408,
182 KRW = 410,
184 KWD = 414,
186 KYD = 136,
188 KZT = 398,
190 LAK = 418,
192 LBP = 422,
194 LKR = 144,
196 LRD = 430,
198 LSL = 426,
200 LYD = 434,
202 MAD = 504,
204 MDL = 498,
206 MGA = 969,
208 MKD = 807,
210 MMK = 104,
212 MNT = 496,
214 MOP = 446,
216 MRU = 929,
218 MUR = 480,
220 MVR = 462,
222 MWK = 454,
224 MXN = 484,
226 MXV = 979,
228 MYR = 458,
230 MZN = 943,
232 NAD = 516,
234 NGN = 566,
236 NIO = 558,
238 NOK = 578,
240 NPR = 524,
242 NZD = 554,
244 OMR = 512,
246 PAB = 590,
248 PEN = 604,
250 PGK = 598,
252 PHP = 608,
254 PKR = 586,
256 PLN = 985,
258 PYG = 600,
260 QAR = 634,
262 RON = 946,
264 RSD = 941,
266 CNY = 156,
268 RUB = 643,
270 RWF = 646,
272 SAR = 682,
274 SBD = 090,
276 SCR = 690,
278 SDG = 938,
280 SEK = 752,
282 SGD = 702,
284 SHP = 654,
286 SLE = 925,
288 SLL = 694,
290 SOS = 706,
292 SRD = 968,
294 SSP = 728,
296 STN = 930,
298 SVC = 222,
300 SYP = 760,
302 SZL = 748,
304 THB = 764,
306 TJS = 972,
308 TMT = 934,
310 TND = 788,
312 TOP = 776,
314 TRY = 949,
316 TTD = 780,
318 TWD = 901,
320 TZS = 834,
322 UAH = 980,
324 UGX = 800,
326 USD = 840,
328 USN = 997,
330 UYI = 940,
332 UYU = 858,
334 UYW = 927,
336 UZS = 860,
338 VED = 926,
340 VES = 928,
342 VND = 704,
344 VUV = 548,
346 WST = 882,
348 XAF = 950,
350 XAG = 961,
352 XAU = 959,
354 XBA = 955,
356 XBB = 956,
358 XBC = 957,
360 XBD = 958,
362 XCD = 951,
364 XDR = 960,
366 XOF = 952,
368 XPD = 964,
370 XPF = 953,
372 XPT = 962,
374 XSU = 994,
376 XTS = 963,
378 XUA = 965,
380 #[default]
382 XXX = 999,
383 YER = 886,
385 ZAR = 710,
387 ZMW = 967,
389 ZWL = 932,
391}
392
393impl Currency {
394 pub const LEN: usize = 3;
396
397 pub const fn new() -> Self {
399 Self::XXX
400 }
401
402 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}