#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
#[cfg(not(feature = "std"))]
use core as std;
#[cfg(feature = "std")]
use std;
use std::fmt;
#[repr(u32)]
#[rustfmt::skip]
#[allow(clippy::zero_prefixed_literal)]
#[derive(Clone, Copy, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum Currency {
AED = 784,
AFN = 971,
ALL = 008,
AMD = 051,
ANG = 532,
AOA = 973,
ARS = 032,
AUD = 036,
AWG = 533,
AZN = 944,
BAM = 977,
BBD = 052,
BDT = 050,
BGN = 975,
BHD = 048,
BIF = 108,
BMD = 060,
BND = 096,
BOB = 068,
BOV = 984,
BRL = 986,
BSD = 044,
BTN = 064,
BWP = 072,
BYN = 933,
BZD = 084,
CAD = 124,
CDF = 976,
CHE = 947,
CHF = 756,
CHW = 948,
CLF = 990,
CLP = 152,
COP = 170,
COU = 970,
CRC = 188,
CUC = 931,
CUP = 192,
CVE = 132,
CZK = 203,
DJF = 262,
DKK = 208,
DOP = 214,
DZD = 012,
EGP = 818,
ERN = 232,
ETB = 230,
EUR = 978,
FJD = 242,
FKP = 238,
GBP = 826,
GEL = 981,
GHS = 936,
GIP = 292,
GMD = 270,
GNF = 324,
GTQ = 320,
GYD = 328,
HKD = 344,
HNL = 340,
HTG = 332,
HUF = 348,
IDR = 360,
ILS = 376,
INR = 356,
IQD = 368,
IRR = 364,
ISK = 352,
JMD = 388,
JOD = 400,
JPY = 392,
KES = 404,
KGS = 417,
KHR = 116,
KMF = 174,
KPW = 408,
KRW = 410,
KWD = 414,
KYD = 136,
KZT = 398,
LAK = 418,
LBP = 422,
LKR = 144,
LRD = 430,
LSL = 426,
LYD = 434,
MAD = 504,
MDL = 498,
MGA = 969,
MKD = 807,
MMK = 104,
MNT = 496,
MOP = 446,
MRU = 929,
MUR = 480,
MVR = 462,
MWK = 454,
MXN = 484,
MXV = 979,
MYR = 458,
MZN = 943,
NAD = 516,
NGN = 566,
NIO = 558,
NOK = 578,
NPR = 524,
NZD = 554,
OMR = 512,
PAB = 590,
PEN = 604,
PGK = 598,
PHP = 608,
PKR = 586,
PLN = 985,
PYG = 600,
QAR = 634,
RON = 946,
RSD = 941,
CNY = 156,
RUB = 643,
RWF = 646,
SAR = 682,
SBD = 090,
SCR = 690,
SDG = 938,
SEK = 752,
SGD = 702,
SHP = 654,
SLE = 925,
SLL = 694,
SOS = 706,
SRD = 968,
SSP = 728,
STN = 930,
SVC = 222,
SYP = 760,
SZL = 748,
THB = 764,
TJS = 972,
TMT = 934,
TND = 788,
TOP = 776,
TRY = 949,
TTD = 780,
TWD = 901,
TZS = 834,
UAH = 980,
UGX = 800,
USD = 840,
USN = 997,
UYI = 940,
UYU = 858,
UYW = 927,
UZS = 860,
VED = 926,
VES = 928,
VND = 704,
VUV = 548,
WST = 882,
XAF = 950,
XAG = 961,
XAU = 959,
XBA = 955,
XBB = 956,
XBC = 957,
XBD = 958,
XCD = 951,
XDR = 960,
XOF = 952,
XPD = 964,
XPF = 953,
XPT = 962,
XSU = 994,
XTS = 963,
XUA = 965,
#[default]
XXX = 999,
YER = 886,
ZAR = 710,
ZMW = 967,
ZWL = 932,
}
impl Currency {
pub const LEN: usize = 3;
pub const fn new() -> Self {
Self::XXX
}
pub const fn name(&self) -> &'static str {
match self {
Self::AED => "United Arab Emirates dirham United Arab Emirates",
Self::AFN => "Afghan afghani Afghanistan",
Self::ALL => "Albanian lek Albania",
Self::AMD => "Armenian dram Armenia",
Self::ANG => "Netherlands Antillean guilder Cura",
Self::AOA => "Angolan kwanza Angola",
Self::ARS => "Argentine peso Argentina",
Self::AUD => "Australian dollar Australia",
Self::AWG => "Aruban florin Aruba",
Self::AZN => "Azerbaijani manat Azerbaijan",
Self::BAM => "Bosnia and Herzegovina convertible mark Bosnia and Herzegovina",
Self::BBD => "Barbados dollar Barbados",
Self::BDT => "Bangladeshi taka Bangladesh",
Self::BGN => "Bulgarian lev Bulgaria",
Self::BHD => "Bahraini dinar Bahrain",
Self::BIF => "Burundian franc Burundi",
Self::BMD => "Bermudian dollar Bermuda",
Self::BND => "Brunei dollar Brunei",
Self::BOB => "Boliviano Bolivia",
Self::BOV => "Bolivian Mvdol (funds code)",
Self::BRL => "Brazilian real Brazil",
Self::BSD => "Bahamian dollar Bahamas",
Self::BTN => "Bhutanese ngultrum Bhutan",
Self::BWP => "Botswana pula Botswana",
Self::BYN => "Belarusian ruble Belarus",
Self::BZD => "Belize dollar Belize",
Self::CAD => "Canadian dollar Canada",
Self::CDF => "Congolese franc Democratic Republic of the Congo",
Self::CHE => "WIR euro (complementary currency)",
Self::CHF => "Swiss franc Switzerland",
Self::CHW => "WIR franc (complementary currency)",
Self::CLF => "Unidad de Fomento (funds code)",
Self::CLP => "Chilean peso Chile",
Self::COP => "Colombian peso Colombia",
Self::COU => " Unidad de Valor Real (UVR) (funds code)",
Self::CRC => "Costa Rican colon Costa Rica",
Self::CUC => "Cuban convertible peso Cuba",
Self::CUP => "Cuban peso Cuba",
Self::CVE => "Cape Verdean escudo Cabo Verde",
Self::CZK => "Czech koruna Czechia",
Self::DJF => "Djiboutian franc Djibouti",
Self::DKK => "Danish krone Denmark",
Self::DOP => "Dominican peso Dominican Republic",
Self::DZD => "Algerian dinar Algeria",
Self::EGP => "Egyptian pound Egypt",
Self::ERN => "Eritrean nakfa Eritrea",
Self::ETB => "Ethiopian birr Ethiopia",
Self::EUR => "Euro",
Self::FJD => "Fiji dollar Fiji",
Self::FKP => "Falkland Islands pound Falkland Islands (pegged to GBP)",
Self::GBP => "Pound sterling United Kingdom",
Self::GEL => "Georgian lari Georgia",
Self::GHS => "Ghanaian cedi Ghana",
Self::GIP => "Gibraltar pound Gibraltar (pegged to GBP)",
Self::GMD => "Gambian dalasi Gambia",
Self::GNF => "Guinean franc Guinea",
Self::GTQ => "Guatemalan quetzal Guatemala",
Self::GYD => "Guyanese dollar Guyana",
Self::HKD => "Hong Kong dollar Hong Kong",
Self::HNL => "Honduran lempira Honduras",
Self::HTG => "Haitian gourde Haiti",
Self::HUF => "Hungarian forint Hungary",
Self::IDR => "Indonesian rupiah Indonesia",
Self::ILS => "Israeli new shekel Israel",
Self::INR => "Indian rupee India",
Self::IQD => "Iraqi dinar Iraq",
Self::IRR => "Iranian rial Iran",
Self::ISK => "Icelandic kr",
Self::JMD => "Jamaican dollar Jamaica",
Self::JOD => "Jordanian dinar Jordan",
Self::JPY => "Japanese yen Japan",
Self::KES => "Kenyan shilling Kenya",
Self::KGS => "Kyrgyzstani som Kyrgyzstan",
Self::KHR => "Cambodian riel Cambodia",
Self::KMF => "Comoro franc Comoros",
Self::KPW => "North Korean won North Korea",
Self::KRW => "South Korean won",
Self::KWD => "Kuwaiti dinar Kuwait",
Self::KYD => "Cayman Islands dollar Cayman Islands",
Self::KZT => "Kazakhstani tenge Kazakhstan",
Self::LAK => "Lao kip Laos",
Self::LBP => "Lebanese pound Lebanon",
Self::LKR => "Sri Lankan rupee Sri Lanka",
Self::LRD => "Liberian dollar Liberia",
Self::LSL => "Lesotho loti Lesotho",
Self::LYD => "Libyan dinar Libya",
Self::MAD => "Moroccan dirham Morocco",
Self::MDL => "Moldovan leu Moldova",
Self::MGA => "Malagasy ariary",
Self::MKD => "Macedonian denar North Macedonia",
Self::MMK => "Myanmar kyat Myanmar",
Self::MNT => "Mongolian tögrög",
Self::MOP => "Macanese pataca Macau",
Self::MRU => "Mauritanian ouguiya",
Self::MUR => "Mauritian rupee Mauritius",
Self::MVR => "Maldivian rufiyaa Maldives",
Self::MWK => "Malawian kwacha Malawi",
Self::MXN => "Mexican peso Mexico",
Self::MXV => "Mexican Unidad de Inversion (UDI) (funds code)",
Self::MYR => "Malaysian ringgit Malaysia",
Self::MZN => "Mozambican metical Mozambique",
Self::NAD => "Namibian dollar Namibia (pegged to ZAR)",
Self::NGN => "Nigerian naira Nigeria",
Self::NIO => "Nicaraguan c",
Self::NOK => "Norwegian krone Norway",
Self::NPR => "Nepalese rupee Nepal",
Self::NZD => "New Zealand dollar New Zealand",
Self::OMR => "Omani rial Oman",
Self::PAB => "Panamanian balboa Panama",
Self::PEN => "Peruvian sol Peru",
Self::PGK => "Papua New Guinean kina Papua New Guinea",
Self::PHP => "Philippine peso",
Self::PKR => "Pakistani rupee Pakistan",
Self::PLN => "Polish z",
Self::PYG => "Paraguayan guaran",
Self::QAR => "Qatari riyal Qatar",
Self::RON => "Romanian leu Romania",
Self::RSD => "Serbian dinar Serbia",
Self::CNY => "Renminbi",
Self::RUB => "Russian ruble Russia",
Self::RWF => "Rwandan franc Rwanda",
Self::SAR => "Saudi riyal Saudi Arabia",
Self::SBD => "Solomon Islands dollar Solomon Islands",
Self::SCR => "Seychelles rupee Seychelles",
Self::SDG => "Sudanese pound Sudan",
Self::SEK => "Swedish krona (plural",
Self::SGD => "Singapore dollar Singapore",
Self::SHP => "Saint Helena pound Saint Helena (SH",
Self::SLE => "Sierra Leonean leone (new leone)",
Self::SLL => "Sierra Leonean leone (old leone)",
Self::SOS => "Somali shilling Somalia",
Self::SRD => "Surinamese dollar Suriname",
Self::SSP => "South Sudanese pound South Sudan",
Self::STN => "São Tomé and Príncipe dobra",
Self::SVC => "Salvadoran col",
Self::SYP => "Syrian pound Syria",
Self::SZL => "Swazi lilangeni Eswatini",
Self::THB => "Thai baht Thailand",
Self::TJS => "Tajikistani somoni Tajikistan",
Self::TMT => "Turkmenistan manat Turkmenistan",
Self::TND => "Tunisian dinar Tunisia",
Self::TOP => "Tongan pa",
Self::TRY => "Turkish lira Turkey",
Self::TTD => "Trinidad and Tobago dollar Trinidad and Tobago",
Self::TWD => "New Taiwan dollar Taiwan",
Self::TZS => "Tanzanian shilling Tanzania",
Self::UAH => "Ukrainian hryvnia Ukraine",
Self::UGX => "Ugandan shilling Uganda",
Self::USD => "United States dollar United States",
Self::USN => "United States dollar (next day) (funds code)",
Self::UYI => "Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)",
Self::UYU => "Uruguayan peso Uruguay",
Self::UYW => "Unidad previsional",
Self::UZS => "Uzbekistan sum Uzbekistan",
Self::VED => "Venezuelan digital bol",
Self::VES => "Venezuelan sovereign bol",
Self::VND => "Vietnamese",
Self::VUV => "Vanuatu vatu Vanuatu",
Self::WST => "Samoan tala Samoa",
Self::XAF => "CFA franc BEAC Cameroon (CM)",
Self::XAG => "Silver (one troy ounce)",
Self::XAU => "Gold (one troy ounce)",
Self::XBA => "European Composite Unit (bond market unit)",
Self::XBB => "European Monetary Unit (bond market unit)",
Self::XBC => "European Unit of Account 9 (bond market unit)",
Self::XBD => "European unit of account 17 (bond market unit)",
Self::XCD => "East Caribbean dollar Anguilla (AI)",
Self::XDR => "Special drawing rights",
Self::XOF => "CFA franc BCEAO Benin (BJ)",
Self::XPD => "Palladium (one troy ounce)",
Self::XPF => "CFP franc (franc Pacifique)",
Self::XPT => "Platinum (one troy ounce)",
Self::XSU => "SUCRE",
Self::XTS => "Code reserved for testing",
Self::XUA => "ADB Unit of Account",
Self::XXX => "No country code",
Self::YER => "Yemeni rial Yemen",
Self::ZAR => "South African rand Eswatini",
Self::ZMW => "Zambian kwacha Zambia",
Self::ZWL => "Zimbabwean dollar (fifth)",
}
}
}
impl From<Currency> for u32 {
fn from(val: Currency) -> Self {
val as u32
}
}
impl From<&Currency> for u32 {
fn from(val: &Currency) -> Self {
(*val).into()
}
}
impl From<Currency> for [i8; 4] {
fn from(val: Currency) -> Self {
let cur_str = <&str>::from(val);
let cur_bytes = cur_str.as_bytes();
[
cur_bytes[0] as i8,
cur_bytes[1] as i8,
cur_bytes[2] as i8,
b'\0' as i8,
]
}
}
impl From<&Currency> for [i8; 4] {
fn from(val: &Currency) -> Self {
(*val).into()
}
}
impl From<Currency> for &'static str {
fn from(val: Currency) -> Self {
match val {
Currency::AED => "AED",
Currency::AFN => "AFN",
Currency::ALL => "ALL",
Currency::AMD => "AMD",
Currency::ANG => "ANG",
Currency::AOA => "AOA",
Currency::ARS => "ARS",
Currency::AUD => "AUD",
Currency::AWG => "AWG",
Currency::AZN => "AZN",
Currency::BAM => "BAM",
Currency::BBD => "BBD",
Currency::BDT => "BDT",
Currency::BGN => "BGN",
Currency::BHD => "BHD",
Currency::BIF => "BIF",
Currency::BMD => "BMD",
Currency::BND => "BND",
Currency::BOB => "BOB",
Currency::BOV => "BOV",
Currency::BRL => "BRL",
Currency::BSD => "BSD",
Currency::BTN => "BTN",
Currency::BWP => "BWP",
Currency::BYN => "BYN",
Currency::BZD => "BZD",
Currency::CAD => "CAD",
Currency::CDF => "CDF",
Currency::CHE => "CHE",
Currency::CHF => "CHF",
Currency::CHW => "CHW",
Currency::CLF => "CLF",
Currency::CLP => "CLP",
Currency::COP => "COP",
Currency::COU => "COU",
Currency::CRC => "CRC",
Currency::CUC => "CUC",
Currency::CUP => "CUP",
Currency::CVE => "CVE",
Currency::CZK => "CZK",
Currency::DJF => "DJF",
Currency::DKK => "DKK",
Currency::DOP => "DOP",
Currency::DZD => "DZD",
Currency::EGP => "EGP",
Currency::ERN => "ERN",
Currency::ETB => "ETB",
Currency::EUR => "EUR",
Currency::FJD => "FJD",
Currency::FKP => "FKP",
Currency::GBP => "GBP",
Currency::GEL => "GEL",
Currency::GHS => "GHS",
Currency::GIP => "GIP",
Currency::GMD => "GMD",
Currency::GNF => "GNF",
Currency::GTQ => "GTQ",
Currency::GYD => "GYD",
Currency::HKD => "HKD",
Currency::HNL => "HNL",
Currency::HTG => "HTG",
Currency::HUF => "HUF",
Currency::IDR => "IDR",
Currency::ILS => "ILS",
Currency::INR => "INR",
Currency::IQD => "IQD",
Currency::IRR => "IRR",
Currency::ISK => "ISK",
Currency::JMD => "JMD",
Currency::JOD => "JOD",
Currency::JPY => "JPY",
Currency::KES => "KES",
Currency::KGS => "KGS",
Currency::KHR => "KHR",
Currency::KMF => "KMF",
Currency::KPW => "KPW",
Currency::KRW => "KRW",
Currency::KWD => "KWD",
Currency::KYD => "KYD",
Currency::KZT => "KZT",
Currency::LAK => "LAK",
Currency::LBP => "LBP",
Currency::LKR => "LKR",
Currency::LRD => "LRD",
Currency::LSL => "LSL",
Currency::LYD => "LYD",
Currency::MAD => "MAD",
Currency::MDL => "MDL",
Currency::MGA => "MGA",
Currency::MKD => "MKD",
Currency::MMK => "MMK",
Currency::MNT => "MNT",
Currency::MOP => "MOP",
Currency::MRU => "MRU",
Currency::MUR => "MUR",
Currency::MVR => "MVR",
Currency::MWK => "MWK",
Currency::MXN => "MXN",
Currency::MXV => "MXV",
Currency::MYR => "MYR",
Currency::MZN => "MZN",
Currency::NAD => "NAD",
Currency::NGN => "NGN",
Currency::NIO => "NIO",
Currency::NOK => "NOK",
Currency::NPR => "NPR",
Currency::NZD => "NZD",
Currency::OMR => "OMR",
Currency::PAB => "PAB",
Currency::PEN => "PEN",
Currency::PGK => "PGK",
Currency::PHP => "PHP",
Currency::PKR => "PKR",
Currency::PLN => "PLN",
Currency::PYG => "PYG",
Currency::QAR => "QAR",
Currency::RON => "RON",
Currency::RSD => "RSD",
Currency::CNY => "CNY",
Currency::RUB => "RUB",
Currency::RWF => "RWF",
Currency::SAR => "SAR",
Currency::SBD => "SBD",
Currency::SCR => "SCR",
Currency::SDG => "SDG",
Currency::SEK => "SEK",
Currency::SGD => "SGD",
Currency::SHP => "SHP",
Currency::SLE => "SLE",
Currency::SLL => "SLL",
Currency::SOS => "SOS",
Currency::SRD => "SRD",
Currency::SSP => "SSP",
Currency::STN => "STN",
Currency::SVC => "SVC",
Currency::SYP => "SYP",
Currency::SZL => "SZL",
Currency::THB => "THB",
Currency::TJS => "TJS",
Currency::TMT => "TMT",
Currency::TND => "TND",
Currency::TOP => "TOP",
Currency::TRY => "TRY",
Currency::TTD => "TTD",
Currency::TWD => "TWD",
Currency::TZS => "TZS",
Currency::UAH => "UAH",
Currency::UGX => "UGX",
Currency::USD => "USD",
Currency::USN => "USN",
Currency::UYI => "UYI",
Currency::UYU => "UYU",
Currency::UYW => "UYW",
Currency::UZS => "UZS",
Currency::VED => "VED",
Currency::VES => "VES",
Currency::VND => "VND",
Currency::VUV => "VUV",
Currency::WST => "WST",
Currency::XAF => "XAF",
Currency::XAG => "XAG",
Currency::XAU => "XAU",
Currency::XBA => "XBA",
Currency::XBB => "XBB",
Currency::XBC => "XBC",
Currency::XBD => "XBD",
Currency::XCD => "XCD",
Currency::XDR => "XDR",
Currency::XOF => "XOF",
Currency::XPD => "XPD",
Currency::XPF => "XPF",
Currency::XPT => "XPT",
Currency::XSU => "XSU",
Currency::XTS => "XTS",
Currency::XUA => "XUA",
Currency::XXX => "XXX",
Currency::YER => "YER",
Currency::ZAR => "ZAR",
Currency::ZMW => "ZMW",
Currency::ZWL => "ZWL",
}
}
}
impl From<&Currency> for &'static str {
fn from(val: &Currency) -> Self {
(*val).into()
}
}
impl From<&str> for Currency {
fn from(val: &str) -> Self {
if val.len() < 3 {
Self::XXX
} else {
let cc = val.to_uppercase();
if cc.len() < 3 {
Self::XXX
} else {
match &cc.as_bytes()[..3] {
b"AED" => Self::AED,
b"AFN" => Self::AFN,
b"ALL" => Self::ALL,
b"AMD" => Self::AMD,
b"ANG" => Self::ANG,
b"AOA" => Self::AOA,
b"ARS" => Self::ARS,
b"AUD" => Self::AUD,
b"AWG" => Self::AWG,
b"AZN" => Self::AZN,
b"BAM" => Self::BAM,
b"BBD" => Self::BBD,
b"BDT" => Self::BDT,
b"BGN" => Self::BGN,
b"BHD" => Self::BHD,
b"BIF" => Self::BIF,
b"BMD" => Self::BMD,
b"BND" => Self::BND,
b"BOB" => Self::BOB,
b"BOV" => Self::BOV,
b"BRL" => Self::BRL,
b"BSD" => Self::BSD,
b"BTN" => Self::BTN,
b"BWP" => Self::BWP,
b"BYN" => Self::BYN,
b"BZD" => Self::BZD,
b"CAD" => Self::CAD,
b"CDF" => Self::CDF,
b"CHE" => Self::CHE,
b"CHF" => Self::CHF,
b"CHW" => Self::CHW,
b"CLF" => Self::CLF,
b"CLP" => Self::CLP,
b"COP" => Self::COP,
b"COU" => Self::COU,
b"CRC" => Self::CRC,
b"CUC" => Self::CUC,
b"CUP" => Self::CUP,
b"CVE" => Self::CVE,
b"CZK" => Self::CZK,
b"DJF" => Self::DJF,
b"DKK" => Self::DKK,
b"DOP" => Self::DOP,
b"DZD" => Self::DZD,
b"EGP" => Self::EGP,
b"ERN" => Self::ERN,
b"ETB" => Self::ETB,
b"EUR" => Self::EUR,
b"FJD" => Self::FJD,
b"FKP" => Self::FKP,
b"GBP" => Self::GBP,
b"GEL" => Self::GEL,
b"GHS" => Self::GHS,
b"GIP" => Self::GIP,
b"GMD" => Self::GMD,
b"GNF" => Self::GNF,
b"GTQ" => Self::GTQ,
b"GYD" => Self::GYD,
b"HKD" => Self::HKD,
b"HNL" => Self::HNL,
b"HTG" => Self::HTG,
b"HUF" => Self::HUF,
b"IDR" => Self::IDR,
b"ILS" => Self::ILS,
b"INR" => Self::INR,
b"IQD" => Self::IQD,
b"IRR" => Self::IRR,
b"ISK" => Self::ISK,
b"JMD" => Self::JMD,
b"JOD" => Self::JOD,
b"JPY" => Self::JPY,
b"KES" => Self::KES,
b"KGS" => Self::KGS,
b"KHR" => Self::KHR,
b"KMF" => Self::KMF,
b"KPW" => Self::KPW,
b"KRW" => Self::KRW,
b"KWD" => Self::KWD,
b"KYD" => Self::KYD,
b"KZT" => Self::KZT,
b"LAK" => Self::LAK,
b"LBP" => Self::LBP,
b"LKR" => Self::LKR,
b"LRD" => Self::LRD,
b"LSL" => Self::LSL,
b"LYD" => Self::LYD,
b"MAD" => Self::MAD,
b"MDL" => Self::MDL,
b"MGA" => Self::MGA,
b"MKD" => Self::MKD,
b"MMK" => Self::MMK,
b"MNT" => Self::MNT,
b"MOP" => Self::MOP,
b"MRU" => Self::MRU,
b"MUR" => Self::MUR,
b"MVR" => Self::MVR,
b"MWK" => Self::MWK,
b"MXN" => Self::MXN,
b"MXV" => Self::MXV,
b"MYR" => Self::MYR,
b"MZN" => Self::MZN,
b"NAD" => Self::NAD,
b"NGN" => Self::NGN,
b"NIO" => Self::NIO,
b"NOK" => Self::NOK,
b"NPR" => Self::NPR,
b"NZD" => Self::NZD,
b"OMR" => Self::OMR,
b"PAB" => Self::PAB,
b"PEN" => Self::PEN,
b"PGK" => Self::PGK,
b"PHP" => Self::PHP,
b"PKR" => Self::PKR,
b"PLN" => Self::PLN,
b"PYG" => Self::PYG,
b"QAR" => Self::QAR,
b"RON" => Self::RON,
b"RSD" => Self::RSD,
b"CNY" => Self::CNY,
b"RUB" => Self::RUB,
b"RWF" => Self::RWF,
b"SAR" => Self::SAR,
b"SBD" => Self::SBD,
b"SCR" => Self::SCR,
b"SDG" => Self::SDG,
b"SEK" => Self::SEK,
b"SGD" => Self::SGD,
b"SHP" => Self::SHP,
b"SLE" => Self::SLE,
b"SLL" => Self::SLL,
b"SOS" => Self::SOS,
b"SRD" => Self::SRD,
b"SSP" => Self::SSP,
b"STN" => Self::STN,
b"SVC" => Self::SVC,
b"SYP" => Self::SYP,
b"SZL" => Self::SZL,
b"THB" => Self::THB,
b"TJS" => Self::TJS,
b"TMT" => Self::TMT,
b"TND" => Self::TND,
b"TOP" => Self::TOP,
b"TRY" => Self::TRY,
b"TTD" => Self::TTD,
b"TWD" => Self::TWD,
b"TZS" => Self::TZS,
b"UAH" => Self::UAH,
b"UGX" => Self::UGX,
b"USD" => Self::USD,
b"USN" => Self::USN,
b"UYI" => Self::UYI,
b"UYU" => Self::UYU,
b"UYW" => Self::UYW,
b"UZS" => Self::UZS,
b"VED" => Self::VED,
b"VES" => Self::VES,
b"VND" => Self::VND,
b"VUV" => Self::VUV,
b"WST" => Self::WST,
b"XAF" => Self::XAF,
b"XAG" => Self::XAG,
b"XAU" => Self::XAU,
b"XBA" => Self::XBA,
b"XBB" => Self::XBB,
b"XBC" => Self::XBC,
b"XBD" => Self::XBD,
b"XCD" => Self::XCD,
b"XDR" => Self::XDR,
b"XOF" => Self::XOF,
b"XPD" => Self::XPD,
b"XPF" => Self::XPF,
b"XPT" => Self::XPT,
b"XSU" => Self::XSU,
b"XTS" => Self::XTS,
b"XUA" => Self::XUA,
b"XXX" => Self::XXX,
b"YER" => Self::YER,
b"ZAR" => Self::ZAR,
b"ZMW" => Self::ZMW,
b"ZWL" => Self::ZWL,
_ => Self::XXX,
}
}
}
}
}
impl From<&[i8]> for Currency {
fn from(val: &[i8]) -> Self {
if val.len() < 3 {
Self::XXX
} else {
std::str::from_utf8(&[val[0] as u8, val[1] as u8, val[2] as u8])
.unwrap_or("XXX")
.into()
}
}
}
impl<const N: usize> From<&[i8; N]> for Currency {
fn from(val: &[i8; N]) -> Self {
val.as_ref().into()
}
}
impl<const N: usize> From<[i8; N]> for Currency {
fn from(val: [i8; N]) -> Self {
val.as_ref().into()
}
}
impl From<&[u8]> for Currency {
fn from(val: &[u8]) -> Self {
if val.len() < 3 {
Self::XXX
} else {
std::str::from_utf8(&[val[0], val[1], val[2]])
.unwrap_or("XXX")
.into()
}
}
}
impl<const N: usize> From<&[u8; N]> for Currency {
fn from(val: &[u8; N]) -> Self {
val.as_ref().into()
}
}
impl<const N: usize> From<[u8; N]> for Currency {
fn from(val: [u8; N]) -> Self {
val.as_ref().into()
}
}
impl fmt::Display for Currency {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, r#""{}""#, <&str>::from(self))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_from_valid_str() {
let valid_code_strs = [
"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD",
"BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP",
"BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "COP", "COU", "CRC",
"CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR",
"FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL",
"HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES",
"KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD",
"LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR",
"MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR",
"PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "CNY", "RUB",
"RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLE", "SLL", "SOS", "SRD",
"SSP", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD",
"TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", "VED", "VES",
"VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR",
"XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMW", "ZWL",
];
let valid_codes = [
Currency::AED,
Currency::AFN,
Currency::ALL,
Currency::AMD,
Currency::ANG,
Currency::AOA,
Currency::ARS,
Currency::AUD,
Currency::AWG,
Currency::AZN,
Currency::BAM,
Currency::BBD,
Currency::BDT,
Currency::BGN,
Currency::BHD,
Currency::BIF,
Currency::BMD,
Currency::BND,
Currency::BOB,
Currency::BOV,
Currency::BRL,
Currency::BSD,
Currency::BTN,
Currency::BWP,
Currency::BYN,
Currency::BZD,
Currency::CAD,
Currency::CDF,
Currency::CHE,
Currency::CHF,
Currency::CHW,
Currency::CLF,
Currency::CLP,
Currency::COP,
Currency::COU,
Currency::CRC,
Currency::CUC,
Currency::CUP,
Currency::CVE,
Currency::CZK,
Currency::DJF,
Currency::DKK,
Currency::DOP,
Currency::DZD,
Currency::EGP,
Currency::ERN,
Currency::ETB,
Currency::EUR,
Currency::FJD,
Currency::FKP,
Currency::GBP,
Currency::GEL,
Currency::GHS,
Currency::GIP,
Currency::GMD,
Currency::GNF,
Currency::GTQ,
Currency::GYD,
Currency::HKD,
Currency::HNL,
Currency::HTG,
Currency::HUF,
Currency::IDR,
Currency::ILS,
Currency::INR,
Currency::IQD,
Currency::IRR,
Currency::ISK,
Currency::JMD,
Currency::JOD,
Currency::JPY,
Currency::KES,
Currency::KGS,
Currency::KHR,
Currency::KMF,
Currency::KPW,
Currency::KRW,
Currency::KWD,
Currency::KYD,
Currency::KZT,
Currency::LAK,
Currency::LBP,
Currency::LKR,
Currency::LRD,
Currency::LSL,
Currency::LYD,
Currency::MAD,
Currency::MDL,
Currency::MGA,
Currency::MKD,
Currency::MMK,
Currency::MNT,
Currency::MOP,
Currency::MRU,
Currency::MUR,
Currency::MVR,
Currency::MWK,
Currency::MXN,
Currency::MXV,
Currency::MYR,
Currency::MZN,
Currency::NAD,
Currency::NGN,
Currency::NIO,
Currency::NOK,
Currency::NPR,
Currency::NZD,
Currency::OMR,
Currency::PAB,
Currency::PEN,
Currency::PGK,
Currency::PHP,
Currency::PKR,
Currency::PLN,
Currency::PYG,
Currency::QAR,
Currency::RON,
Currency::RSD,
Currency::CNY,
Currency::RUB,
Currency::RWF,
Currency::SAR,
Currency::SBD,
Currency::SCR,
Currency::SDG,
Currency::SEK,
Currency::SGD,
Currency::SHP,
Currency::SLE,
Currency::SLL,
Currency::SOS,
Currency::SRD,
Currency::SSP,
Currency::STN,
Currency::SVC,
Currency::SYP,
Currency::SZL,
Currency::THB,
Currency::TJS,
Currency::TMT,
Currency::TND,
Currency::TOP,
Currency::TRY,
Currency::TTD,
Currency::TWD,
Currency::TZS,
Currency::UAH,
Currency::UGX,
Currency::USD,
Currency::USN,
Currency::UYI,
Currency::UYU,
Currency::UYW,
Currency::UZS,
Currency::VED,
Currency::VES,
Currency::VND,
Currency::VUV,
Currency::WST,
Currency::XAF,
Currency::XAG,
Currency::XAU,
Currency::XBA,
Currency::XBB,
Currency::XBC,
Currency::XBD,
Currency::XCD,
Currency::XDR,
Currency::XOF,
Currency::XPD,
Currency::XPF,
Currency::XPT,
Currency::XSU,
Currency::XTS,
Currency::XUA,
Currency::XXX,
Currency::YER,
Currency::ZAR,
Currency::ZMW,
Currency::ZWL,
];
valid_code_strs
.iter()
.zip(valid_codes.iter())
.for_each(|(&code_str, &code)| {
assert_eq!(Currency::from(code_str), code);
});
}
#[test]
#[cfg(feature = "slow-tests")]
fn test_from_all_str() {
let valid_codes = [
"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD",
"BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP",
"BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "COP", "COU", "CRC",
"CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR",
"FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL",
"HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES",
"KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD",
"LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR",
"MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR",
"PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "CNY", "RUB",
"RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLE", "SLL", "SOS", "SRD",
"SSP", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD",
"TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", "VED", "VES",
"VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR",
"XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "YER", "ZAR", "ZMW", "ZWL",
];
for i in 0..=u8::MAX {
let att = &[i];
assert_eq!(Currency::from(att), Currency::XXX);
for j in 0..=u8::MAX {
let att = &[i, j];
assert_eq!(Currency::from(att), Currency::XXX);
for k in 0..=u8::MAX {
let att = &[i, j, k];
if valid_codes.contains(
&std::str::from_utf8(att)
.unwrap_or("___")
.to_uppercase()
.as_str(),
) {
assert_ne!(Currency::from(att), Currency::XXX);
} else {
assert_eq!(Currency::from(att), Currency::XXX);
}
}
}
}
}
}