#[cfg(test)]
#[path = "tests/country.rs"]
mod tests;
use crate::{
currency::CurrencyCode,
language::LanguageCode,
};
use core::{
fmt::{Debug, Display, self},
str::FromStr,
};
use rubedo::{
std::AsStr,
sugar::{s, vh},
};
use serde::{Deserialize, Serialize};
use std::{
collections::{HashMap, HashSet},
sync::LazyLock,
};
use velcro::hash_map;
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
static COUNTRIES: LazyLock<HashMap<Country, CountryInfo>> = LazyLock::new(|| {
hash_map!{
Country::AD: CountryInfo { code: CountryCode::AD, name: s!("Andorra"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: CA ] },
Country::AE: CountryInfo { code: CountryCode::AE, name: s!("United Arab Emirates"), currencies: vh![ CurrencyCode: AED ], languages: vh![ LanguageCode: AR ] },
Country::AF: CountryInfo { code: CountryCode::AF, name: s!("Afghanistan"), currencies: vh![ CurrencyCode: AFN ], languages: vh![ LanguageCode: FA, PS ] },
Country::AG: CountryInfo { code: CountryCode::AG, name: s!("Antigua and Barbuda"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::AI: CountryInfo { code: CountryCode::AI, name: s!("Anguilla"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::AL: CountryInfo { code: CountryCode::AL, name: s!("Albania"), currencies: vh![ CurrencyCode: ALL ], languages: vh![ LanguageCode: SQ ] },
Country::AM: CountryInfo { code: CountryCode::AM, name: s!("Armenia"), currencies: vh![ CurrencyCode: AMD ], languages: vh![ LanguageCode: HY ] },
Country::AO: CountryInfo { code: CountryCode::AO, name: s!("Angola"), currencies: vh![ CurrencyCode: AOA ], languages: vh![ LanguageCode: PT ] },
Country::AQ: CountryInfo { code: CountryCode::AQ, name: s!("Antarctica"), currencies: vh![], languages: vh![] },
Country::AR: CountryInfo { code: CountryCode::AR, name: s!("Argentina"), currencies: vh![ CurrencyCode: ARS ], languages: vh![ LanguageCode: ES ] },
Country::AS: CountryInfo { code: CountryCode::AS, name: s!("American Samoa"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN, SM ] },
Country::AT: CountryInfo { code: CountryCode::AT, name: s!("Austria"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: DE ] },
Country::AU: CountryInfo { code: CountryCode::AU, name: s!("Australia"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN ] },
Country::AW: CountryInfo { code: CountryCode::AW, name: s!("Aruba"), currencies: vh![ CurrencyCode: AWG ], languages: vh![ LanguageCode: NL ] },
Country::AX: CountryInfo { code: CountryCode::AX, name: s!("Åland Islands"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: SV ] },
Country::AZ: CountryInfo { code: CountryCode::AZ, name: s!("Azerbaijan"), currencies: vh![ CurrencyCode: AZN ], languages: vh![ LanguageCode: AZ ] },
Country::BA: CountryInfo { code: CountryCode::BA, name: s!("Bosnia and Herzegovina"), currencies: vh![ CurrencyCode: BAM ], languages: vh![ LanguageCode: BS, HR, SR ] },
Country::BB: CountryInfo { code: CountryCode::BB, name: s!("Barbados"), currencies: vh![ CurrencyCode: BBD ], languages: vh![ LanguageCode: EN ] },
Country::BD: CountryInfo { code: CountryCode::BD, name: s!("Bangladesh"), currencies: vh![ CurrencyCode: BDT ], languages: vh![ LanguageCode: BN ] },
Country::BE: CountryInfo { code: CountryCode::BE, name: s!("Belgium"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: DE, FR, NL ] },
Country::BF: CountryInfo { code: CountryCode::BF, name: s!("Burkina Faso"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::BG: CountryInfo { code: CountryCode::BG, name: s!("Bulgaria"), currencies: vh![ CurrencyCode: BGN ], languages: vh![ LanguageCode: BG ] },
Country::BH: CountryInfo { code: CountryCode::BH, name: s!("Bahrain"), currencies: vh![ CurrencyCode: BHD ], languages: vh![ LanguageCode: AR ] },
Country::BI: CountryInfo { code: CountryCode::BI, name: s!("Burundi"), currencies: vh![ CurrencyCode: BIF ], languages: vh![ LanguageCode: EN, FR, RN ] },
Country::BJ: CountryInfo { code: CountryCode::BJ, name: s!("Benin"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::BL: CountryInfo { code: CountryCode::BL, name: s!("Saint Barthélemy"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::BM: CountryInfo { code: CountryCode::BM, name: s!("Bermuda"), currencies: vh![ CurrencyCode: BMD ], languages: vh![ LanguageCode: EN ] },
Country::BN: CountryInfo { code: CountryCode::BN, name: s!("Brunei Darussalam"), currencies: vh![ CurrencyCode: BND ], languages: vh![ LanguageCode: MS ] },
Country::BO: CountryInfo { code: CountryCode::BO, name: s!("Bolivia (Plurinational State of)"), currencies: vh![ CurrencyCode: BOB, BOV ], languages: vh![ LanguageCode: AY, ES, GN, QU ] },
Country::BQ: CountryInfo { code: CountryCode::BQ, name: s!("Bonaire, Sint Eustatius and Saba"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: NL ] },
Country::BR: CountryInfo { code: CountryCode::BR, name: s!("Brazil"), currencies: vh![ CurrencyCode: BRL ], languages: vh![ LanguageCode: PT ] },
Country::BS: CountryInfo { code: CountryCode::BS, name: s!("Bahamas"), currencies: vh![ CurrencyCode: BSD ], languages: vh![ LanguageCode: EN ] },
Country::BT: CountryInfo { code: CountryCode::BT, name: s!("Bhutan"), currencies: vh![ CurrencyCode: BTN, INR ], languages: vh![ LanguageCode: DZ ] },
Country::BV: CountryInfo { code: CountryCode::BV, name: s!("Bouvet Island"), currencies: vh![ CurrencyCode: NOK ], languages: vh![ LanguageCode: NO ] },
Country::BW: CountryInfo { code: CountryCode::BW, name: s!("Botswana"), currencies: vh![ CurrencyCode: BWP ], languages: vh![ LanguageCode: EN ] },
Country::BY: CountryInfo { code: CountryCode::BY, name: s!("Belarus"), currencies: vh![ CurrencyCode: BYN ], languages: vh![ LanguageCode: BE, RU ] },
Country::BZ: CountryInfo { code: CountryCode::BZ, name: s!("Belize"), currencies: vh![ CurrencyCode: BZD ], languages: vh![ LanguageCode: EN ] },
Country::CA: CountryInfo { code: CountryCode::CA, name: s!("Canada"), currencies: vh![ CurrencyCode: CAD ], languages: vh![ LanguageCode: EN, FR ] },
Country::CC: CountryInfo { code: CountryCode::CC, name: s!("Cocos (Keeling) Islands"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN, MS ] },
Country::CD: CountryInfo { code: CountryCode::CD, name: s!("Congo, Democratic Republic of the"), currencies: vh![ CurrencyCode: CDF ], languages: vh![ LanguageCode: FR ] },
Country::CF: CountryInfo { code: CountryCode::CF, name: s!("Central African Republic"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: FR, SG ] },
Country::CG: CountryInfo { code: CountryCode::CG, name: s!("Congo"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: FR ] },
Country::CH: CountryInfo { code: CountryCode::CH, name: s!("Switzerland"), currencies: vh![ CurrencyCode: CHE, CHF, CHW ], languages: vh![ LanguageCode: DE, FR, IT, RM ] },
Country::CI: CountryInfo { code: CountryCode::CI, name: s!("Côte d'Ivoire"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::CK: CountryInfo { code: CountryCode::CK, name: s!("Cook Islands"), currencies: vh![ CurrencyCode: NZD ], languages: vh![ LanguageCode: EN ] },
Country::CL: CountryInfo { code: CountryCode::CL, name: s!("Chile"), currencies: vh![ CurrencyCode: CLF, CLP ], languages: vh![ LanguageCode: ES ] },
Country::CM: CountryInfo { code: CountryCode::CM, name: s!("Cameroon"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: EN, FR ] },
Country::CN: CountryInfo { code: CountryCode::CN, name: s!("China"), currencies: vh![ CurrencyCode: CNY ], languages: vh![ LanguageCode: ZH ] },
Country::CO: CountryInfo { code: CountryCode::CO, name: s!("Colombia"), currencies: vh![ CurrencyCode: COP, COU ], languages: vh![ LanguageCode: ES ] },
Country::CR: CountryInfo { code: CountryCode::CR, name: s!("Costa Rica"), currencies: vh![ CurrencyCode: CRC ], languages: vh![ LanguageCode: ES ] },
Country::CU: CountryInfo { code: CountryCode::CU, name: s!("Cuba"), currencies: vh![ CurrencyCode: CUP ], languages: vh![ LanguageCode: ES ] },
Country::CV: CountryInfo { code: CountryCode::CV, name: s!("Cabo Verde"), currencies: vh![ CurrencyCode: CVE ], languages: vh![ LanguageCode: PT ] },
Country::CW: CountryInfo { code: CountryCode::CW, name: s!("Curaçao"), currencies: vh![ CurrencyCode: ANG ], languages: vh![ LanguageCode: EN, NL ] },
Country::CX: CountryInfo { code: CountryCode::CX, name: s!("Christmas Island"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN, MS, ZH ] },
Country::CY: CountryInfo { code: CountryCode::CY, name: s!("Cyprus"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: EL, TR ] },
Country::CZ: CountryInfo { code: CountryCode::CZ, name: s!("Czechia"), currencies: vh![ CurrencyCode: CZK ], languages: vh![ LanguageCode: CS, SK ] },
Country::DE: CountryInfo { code: CountryCode::DE, name: s!("Germany"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: DE ] },
Country::DJ: CountryInfo { code: CountryCode::DJ, name: s!("Djibouti"), currencies: vh![ CurrencyCode: DJF ], languages: vh![ LanguageCode: AR, FR ] },
Country::DK: CountryInfo { code: CountryCode::DK, name: s!("Denmark"), currencies: vh![ CurrencyCode: DKK ], languages: vh![ LanguageCode: DA ] },
Country::DM: CountryInfo { code: CountryCode::DM, name: s!("Dominica"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::DO: CountryInfo { code: CountryCode::DO, name: s!("Dominican Republic"), currencies: vh![ CurrencyCode: DOP ], languages: vh![ LanguageCode: ES ] },
Country::DZ: CountryInfo { code: CountryCode::DZ, name: s!("Algeria"), currencies: vh![ CurrencyCode: DZD ], languages: vh![ LanguageCode: AR ] },
Country::EC: CountryInfo { code: CountryCode::EC, name: s!("Ecuador"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: ES, QU ] },
Country::EE: CountryInfo { code: CountryCode::EE, name: s!("Estonia"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: ET ] },
Country::EG: CountryInfo { code: CountryCode::EG, name: s!("Egypt"), currencies: vh![ CurrencyCode: EGP ], languages: vh![ LanguageCode: AR ] },
Country::EH: CountryInfo { code: CountryCode::EH, name: s!("Western Sahara"), currencies: vh![ CurrencyCode: MAD ], languages: vh![ LanguageCode: AR, ES ] },
Country::ER: CountryInfo { code: CountryCode::ER, name: s!("Eritrea"), currencies: vh![ CurrencyCode: ERN ], languages: vh![ LanguageCode: TI ] },
Country::ES: CountryInfo { code: CountryCode::ES, name: s!("Spain"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: ES ] },
Country::ET: CountryInfo { code: CountryCode::ET, name: s!("Ethiopia"), currencies: vh![ CurrencyCode: ETB ], languages: vh![ LanguageCode: AA, AM, OM, SO, TI ] },
Country::FI: CountryInfo { code: CountryCode::FI, name: s!("Finland"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FI, SV ] },
Country::FJ: CountryInfo { code: CountryCode::FJ, name: s!("Fiji"), currencies: vh![ CurrencyCode: FJD ], languages: vh![ LanguageCode: EN, FJ ] },
Country::FK: CountryInfo { code: CountryCode::FK, name: s!("Falkland Islands (Malvinas)"), currencies: vh![ CurrencyCode: FKP ], languages: vh![ LanguageCode: EN ] },
Country::FM: CountryInfo { code: CountryCode::FM, name: s!("Micronesia (Federated States of)"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::FO: CountryInfo { code: CountryCode::FO, name: s!("Faroe Islands"), currencies: vh![ CurrencyCode: DKK ], languages: vh![ LanguageCode: DA, FO ] },
Country::FR: CountryInfo { code: CountryCode::FR, name: s!("France"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::GA: CountryInfo { code: CountryCode::GA, name: s!("Gabon"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: FR ] },
Country::GB: CountryInfo { code: CountryCode::GB, name: s!("United Kingdom of Great Britain and Northern Ireland"), currencies: vh![ CurrencyCode: GBP ], languages: vh![ LanguageCode: EN ] },
Country::GD: CountryInfo { code: CountryCode::GD, name: s!("Grenada"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::GE: CountryInfo { code: CountryCode::GE, name: s!("Georgia"), currencies: vh![ CurrencyCode: GEL ], languages: vh![ LanguageCode: KA ] },
Country::GF: CountryInfo { code: CountryCode::GF, name: s!("French Guiana"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::GG: CountryInfo { code: CountryCode::GG, name: s!("Guernsey"), currencies: vh![ CurrencyCode: GBP ], languages: vh![ LanguageCode: EN ] },
Country::GH: CountryInfo { code: CountryCode::GH, name: s!("Ghana"), currencies: vh![ CurrencyCode: GHS ], languages: vh![ LanguageCode: EN ] },
Country::GI: CountryInfo { code: CountryCode::GI, name: s!("Gibraltar"), currencies: vh![ CurrencyCode: GIP ], languages: vh![ LanguageCode: EN ] },
Country::GL: CountryInfo { code: CountryCode::GL, name: s!("Greenland"), currencies: vh![ CurrencyCode: DKK ], languages: vh![ LanguageCode: DA, EN ] },
Country::GM: CountryInfo { code: CountryCode::GM, name: s!("Gambia"), currencies: vh![ CurrencyCode: GMD ], languages: vh![ LanguageCode: EN ] },
Country::GN: CountryInfo { code: CountryCode::GN, name: s!("Guinea"), currencies: vh![ CurrencyCode: GNF ], languages: vh![ LanguageCode: FR ] },
Country::GP: CountryInfo { code: CountryCode::GP, name: s!("Guadeloupe"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::GQ: CountryInfo { code: CountryCode::GQ, name: s!("Equatorial Guinea"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: ES, FR, PT ] },
Country::GR: CountryInfo { code: CountryCode::GR, name: s!("Greece"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: EL ] },
Country::GS: CountryInfo { code: CountryCode::GS, name: s!("South Georgia and the South Sandwich Islands"), currencies: vh![], languages: vh![ LanguageCode: EN ] },
Country::GT: CountryInfo { code: CountryCode::GT, name: s!("Guatemala"), currencies: vh![ CurrencyCode: GTQ ], languages: vh![ LanguageCode: ES ] },
Country::GU: CountryInfo { code: CountryCode::GU, name: s!("Guam"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: CH, EN ] },
Country::GW: CountryInfo { code: CountryCode::GW, name: s!("Guinea-Bissau"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: PT ] },
Country::GY: CountryInfo { code: CountryCode::GY, name: s!("Guyana"), currencies: vh![ CurrencyCode: GYD ], languages: vh![ LanguageCode: EN ] },
Country::HK: CountryInfo { code: CountryCode::HK, name: s!("Hong Kong"), currencies: vh![ CurrencyCode: HKD ], languages: vh![ LanguageCode: EN, ZH ] },
Country::HM: CountryInfo { code: CountryCode::HM, name: s!("Heard Island and McDonald Islands"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN ] },
Country::HN: CountryInfo { code: CountryCode::HN, name: s!("Honduras"), currencies: vh![ CurrencyCode: HNL ], languages: vh![ LanguageCode: ES ] },
Country::HR: CountryInfo { code: CountryCode::HR, name: s!("Croatia"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: HR ] },
Country::HT: CountryInfo { code: CountryCode::HT, name: s!("Haiti"), currencies: vh![ CurrencyCode: HTG ], languages: vh![ LanguageCode: FR, HT ] },
Country::HU: CountryInfo { code: CountryCode::HU, name: s!("Hungary"), currencies: vh![ CurrencyCode: HUF ], languages: vh![ LanguageCode: HU ] },
Country::ID: CountryInfo { code: CountryCode::ID, name: s!("Indonesia"), currencies: vh![ CurrencyCode: IDR ], languages: vh![ LanguageCode: ID ] },
Country::IE: CountryInfo { code: CountryCode::IE, name: s!("Ireland"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: EN, GA ] },
Country::IL: CountryInfo { code: CountryCode::IL, name: s!("Israel"), currencies: vh![ CurrencyCode: ILS ], languages: vh![ LanguageCode: HE ] },
Country::IM: CountryInfo { code: CountryCode::IM, name: s!("Isle of Man"), currencies: vh![ CurrencyCode: GBP ], languages: vh![ LanguageCode: EN, GV ] },
Country::IN: CountryInfo { code: CountryCode::IN, name: s!("India"), currencies: vh![ CurrencyCode: INR ], languages: vh![ LanguageCode: EN, HI ] },
Country::IO: CountryInfo { code: CountryCode::IO, name: s!("British Indian Ocean Territory"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::IQ: CountryInfo { code: CountryCode::IQ, name: s!("Iraq"), currencies: vh![ CurrencyCode: IQD ], languages: vh![ LanguageCode: AR, KU ] },
Country::IR: CountryInfo { code: CountryCode::IR, name: s!("Iran (Islamic Republic of)"), currencies: vh![ CurrencyCode: IRR ], languages: vh![ LanguageCode: FA ] },
Country::IS: CountryInfo { code: CountryCode::IS, name: s!("Iceland"), currencies: vh![ CurrencyCode: ISK ], languages: vh![ LanguageCode: IS ] },
Country::IT: CountryInfo { code: CountryCode::IT, name: s!("Italy"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: IT ] },
Country::JE: CountryInfo { code: CountryCode::JE, name: s!("Jersey"), currencies: vh![ CurrencyCode: GBP ], languages: vh![ LanguageCode: EN, FR ] },
Country::JM: CountryInfo { code: CountryCode::JM, name: s!("Jamaica"), currencies: vh![ CurrencyCode: JMD ], languages: vh![ LanguageCode: EN ] },
Country::JO: CountryInfo { code: CountryCode::JO, name: s!("Jordan"), currencies: vh![ CurrencyCode: JOD ], languages: vh![ LanguageCode: AR ] },
Country::JP: CountryInfo { code: CountryCode::JP, name: s!("Japan"), currencies: vh![ CurrencyCode: JPY ], languages: vh![ LanguageCode: JA ] },
Country::KE: CountryInfo { code: CountryCode::KE, name: s!("Kenya"), currencies: vh![ CurrencyCode: KES ], languages: vh![ LanguageCode: EN, SW ] },
Country::KG: CountryInfo { code: CountryCode::KG, name: s!("Kyrgyzstan"), currencies: vh![ CurrencyCode: KGS ], languages: vh![ LanguageCode: KY, RU ] },
Country::KH: CountryInfo { code: CountryCode::KH, name: s!("Cambodia"), currencies: vh![ CurrencyCode: KHR ], languages: vh![ LanguageCode: KM ] },
Country::KI: CountryInfo { code: CountryCode::KI, name: s!("Kiribati"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN ] },
Country::KM: CountryInfo { code: CountryCode::KM, name: s!("Comoros"), currencies: vh![ CurrencyCode: KMF ], languages: vh![ LanguageCode: AR, FR ] },
Country::KN: CountryInfo { code: CountryCode::KN, name: s!("Saint Kitts and Nevis"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::KP: CountryInfo { code: CountryCode::KP, name: s!("Korea (Democratic People's Republic of)"), currencies: vh![ CurrencyCode: KPW ], languages: vh![ LanguageCode: KO ] },
Country::KR: CountryInfo { code: CountryCode::KR, name: s!("Korea, Republic of"), currencies: vh![ CurrencyCode: KRW ], languages: vh![ LanguageCode: KO ] },
Country::KW: CountryInfo { code: CountryCode::KW, name: s!("Kuwait"), currencies: vh![ CurrencyCode: KWD ], languages: vh![ LanguageCode: AR ] },
Country::KY: CountryInfo { code: CountryCode::KY, name: s!("Cayman Islands"), currencies: vh![ CurrencyCode: KYD ], languages: vh![ LanguageCode: EN ] },
Country::KZ: CountryInfo { code: CountryCode::KZ, name: s!("Kazakhstan"), currencies: vh![ CurrencyCode: KZT ], languages: vh![ LanguageCode: KK, RU ] },
Country::LA: CountryInfo { code: CountryCode::LA, name: s!("Lao People's Democratic Republic"), currencies: vh![ CurrencyCode: LAK ], languages: vh![ LanguageCode: LO ] },
Country::LB: CountryInfo { code: CountryCode::LB, name: s!("Lebanon"), currencies: vh![ CurrencyCode: LBP ], languages: vh![ LanguageCode: AR ] },
Country::LC: CountryInfo { code: CountryCode::LC, name: s!("Saint Lucia"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::LI: CountryInfo { code: CountryCode::LI, name: s!("Liechtenstein"), currencies: vh![ CurrencyCode: CHF ], languages: vh![ LanguageCode: DE ] },
Country::LK: CountryInfo { code: CountryCode::LK, name: s!("Sri Lanka"), currencies: vh![ CurrencyCode: LKR ], languages: vh![ LanguageCode: SI, TA ] },
Country::LR: CountryInfo { code: CountryCode::LR, name: s!("Liberia"), currencies: vh![ CurrencyCode: LRD ], languages: vh![ LanguageCode: EN ] },
Country::LS: CountryInfo { code: CountryCode::LS, name: s!("Lesotho"), currencies: vh![ CurrencyCode: LSL, ZAR ], languages: vh![ LanguageCode: EN, ST ] },
Country::LT: CountryInfo { code: CountryCode::LT, name: s!("Lithuania"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: LT ] },
Country::LU: CountryInfo { code: CountryCode::LU, name: s!("Luxembourg"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: DE, FR, LB ] },
Country::LV: CountryInfo { code: CountryCode::LV, name: s!("Latvia"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: LV ] },
Country::LY: CountryInfo { code: CountryCode::LY, name: s!("Libya"), currencies: vh![ CurrencyCode: LYD ], languages: vh![ LanguageCode: AR ] },
Country::MA: CountryInfo { code: CountryCode::MA, name: s!("Morocco"), currencies: vh![ CurrencyCode: MAD ], languages: vh![ LanguageCode: AR ] },
Country::MC: CountryInfo { code: CountryCode::MC, name: s!("Monaco"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::MD: CountryInfo { code: CountryCode::MD, name: s!("Moldova, Republic of"), currencies: vh![ CurrencyCode: MDL ], languages: vh![ LanguageCode: RO ] },
Country::ME: CountryInfo { code: CountryCode::ME, name: s!("Montenegro"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: HR, SR ] },
Country::MF: CountryInfo { code: CountryCode::MF, name: s!("Saint Martin (French part)"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::MG: CountryInfo { code: CountryCode::MG, name: s!("Madagascar"), currencies: vh![ CurrencyCode: MGA ], languages: vh![ LanguageCode: FR, MG ] },
Country::MH: CountryInfo { code: CountryCode::MH, name: s!("Marshall Islands"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN, MH ] },
Country::MK: CountryInfo { code: CountryCode::MK, name: s!("North Macedonia"), currencies: vh![ CurrencyCode: MKD ], languages: vh![ LanguageCode: MK, SQ ] },
Country::ML: CountryInfo { code: CountryCode::ML, name: s!("Mali"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: BM, FF ] },
Country::MM: CountryInfo { code: CountryCode::MM, name: s!("Myanmar"), currencies: vh![ CurrencyCode: MMK ], languages: vh![ LanguageCode: MY ] },
Country::MN: CountryInfo { code: CountryCode::MN, name: s!("Mongolia"), currencies: vh![ CurrencyCode: MNT ], languages: vh![ LanguageCode: MN ] },
Country::MO: CountryInfo { code: CountryCode::MO, name: s!("Macao"), currencies: vh![ CurrencyCode: MOP ], languages: vh![ LanguageCode: PT, ZH ] },
Country::MP: CountryInfo { code: CountryCode::MP, name: s!("Northern Mariana Islands"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: CH, EN ] },
Country::MQ: CountryInfo { code: CountryCode::MQ, name: s!("Martinique"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::MR: CountryInfo { code: CountryCode::MR, name: s!("Mauritania"), currencies: vh![ CurrencyCode: MRU ], languages: vh![ LanguageCode: AR ] },
Country::MS: CountryInfo { code: CountryCode::MS, name: s!("Montserrat"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::MT: CountryInfo { code: CountryCode::MT, name: s!("Malta"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: EN, MT ] },
Country::MU: CountryInfo { code: CountryCode::MU, name: s!("Mauritius"), currencies: vh![ CurrencyCode: MUR ], languages: vh![ LanguageCode: EN ] },
Country::MV: CountryInfo { code: CountryCode::MV, name: s!("Maldives"), currencies: vh![ CurrencyCode: MVR ], languages: vh![ LanguageCode: DV ] },
Country::MW: CountryInfo { code: CountryCode::MW, name: s!("Malawi"), currencies: vh![ CurrencyCode: MWK ], languages: vh![ LanguageCode: EN, NY ] },
Country::MX: CountryInfo { code: CountryCode::MX, name: s!("Mexico"), currencies: vh![ CurrencyCode: MXN, MXV ], languages: vh![ LanguageCode: ES ] },
Country::MY: CountryInfo { code: CountryCode::MY, name: s!("Malaysia"), currencies: vh![ CurrencyCode: MYR ], languages: vh![ LanguageCode: MS ] },
Country::MZ: CountryInfo { code: CountryCode::MZ, name: s!("Mozambique"), currencies: vh![ CurrencyCode: MZN ], languages: vh![ LanguageCode: PT ] },
Country::NA: CountryInfo { code: CountryCode::NA, name: s!("Namibia"), currencies: vh![ CurrencyCode: NAD, ZAR ], languages: vh![ LanguageCode: EN ] },
Country::NC: CountryInfo { code: CountryCode::NC, name: s!("New Caledonia"), currencies: vh![ CurrencyCode: XPF ], languages: vh![ LanguageCode: FR ] },
Country::NE: CountryInfo { code: CountryCode::NE, name: s!("Niger"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::NF: CountryInfo { code: CountryCode::NF, name: s!("Norfolk Island"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN ] },
Country::NG: CountryInfo { code: CountryCode::NG, name: s!("Nigeria"), currencies: vh![ CurrencyCode: NGN ], languages: vh![ LanguageCode: EN ] },
Country::NI: CountryInfo { code: CountryCode::NI, name: s!("Nicaragua"), currencies: vh![ CurrencyCode: NIO ], languages: vh![ LanguageCode: ES ] },
Country::NL: CountryInfo { code: CountryCode::NL, name: s!("Netherlands, Kingdom of the"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: NL ] },
Country::NO: CountryInfo { code: CountryCode::NO, name: s!("Norway"), currencies: vh![ CurrencyCode: NOK ], languages: vh![ LanguageCode: NO ] },
Country::NP: CountryInfo { code: CountryCode::NP, name: s!("Nepal"), currencies: vh![ CurrencyCode: NPR ], languages: vh![ LanguageCode: NE ] },
Country::NR: CountryInfo { code: CountryCode::NR, name: s!("Nauru"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN, NA ] },
Country::NU: CountryInfo { code: CountryCode::NU, name: s!("Niue"), currencies: vh![ CurrencyCode: NZD ], languages: vh![ LanguageCode: EN ] },
Country::NZ: CountryInfo { code: CountryCode::NZ, name: s!("New Zealand"), currencies: vh![ CurrencyCode: NZD ], languages: vh![ LanguageCode: EN, MI ] },
Country::OM: CountryInfo { code: CountryCode::OM, name: s!("Oman"), currencies: vh![ CurrencyCode: OMR ], languages: vh![ LanguageCode: AR ] },
Country::PA: CountryInfo { code: CountryCode::PA, name: s!("Panama"), currencies: vh![ CurrencyCode: PAB, USD ], languages: vh![ LanguageCode: ES ] },
Country::PE: CountryInfo { code: CountryCode::PE, name: s!("Peru"), currencies: vh![ CurrencyCode: PEN ], languages: vh![ LanguageCode: AY, ES, QU ] },
Country::PF: CountryInfo { code: CountryCode::PF, name: s!("French Polynesia"), currencies: vh![ CurrencyCode: XPF ], languages: vh![ LanguageCode: FR ] },
Country::PG: CountryInfo { code: CountryCode::PG, name: s!("Papua New Guinea"), currencies: vh![ CurrencyCode: PGK ], languages: vh![ LanguageCode: EN, HO ] },
Country::PH: CountryInfo { code: CountryCode::PH, name: s!("Philippines"), currencies: vh![ CurrencyCode: PHP ], languages: vh![ LanguageCode: EN, TL ] },
Country::PK: CountryInfo { code: CountryCode::PK, name: s!("Pakistan"), currencies: vh![ CurrencyCode: PKR ], languages: vh![ LanguageCode: EN, UR ] },
Country::PL: CountryInfo { code: CountryCode::PL, name: s!("Poland"), currencies: vh![ CurrencyCode: PLN ], languages: vh![ LanguageCode: PL ] },
Country::PM: CountryInfo { code: CountryCode::PM, name: s!("Saint Pierre and Miquelon"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::PN: CountryInfo { code: CountryCode::PN, name: s!("Pitcairn"), currencies: vh![ CurrencyCode: NZD ], languages: vh![ LanguageCode: EN ] },
Country::PR: CountryInfo { code: CountryCode::PR, name: s!("Puerto Rico"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN, ES ] },
Country::PS: CountryInfo { code: CountryCode::PS, name: s!("Palestine, State of"), currencies: vh![], languages: vh![ LanguageCode: AR ] },
Country::PT: CountryInfo { code: CountryCode::PT, name: s!("Portugal"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: PT ] },
Country::PW: CountryInfo { code: CountryCode::PW, name: s!("Palau"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::PY: CountryInfo { code: CountryCode::PY, name: s!("Paraguay"), currencies: vh![ CurrencyCode: PYG ], languages: vh![ LanguageCode: ES, GN ] },
Country::QA: CountryInfo { code: CountryCode::QA, name: s!("Qatar"), currencies: vh![ CurrencyCode: QAR ], languages: vh![ LanguageCode: AR ] },
Country::RE: CountryInfo { code: CountryCode::RE, name: s!("Réunion"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::RO: CountryInfo { code: CountryCode::RO, name: s!("Romania"), currencies: vh![ CurrencyCode: RON ], languages: vh![ LanguageCode: RO ] },
Country::RS: CountryInfo { code: CountryCode::RS, name: s!("Serbia"), currencies: vh![ CurrencyCode: RSD ], languages: vh![ LanguageCode: SR ] },
Country::RU: CountryInfo { code: CountryCode::RU, name: s!("Russian Federation"), currencies: vh![ CurrencyCode: RUB ], languages: vh![ LanguageCode: RU ] },
Country::RW: CountryInfo { code: CountryCode::RW, name: s!("Rwanda"), currencies: vh![ CurrencyCode: RWF ], languages: vh![ LanguageCode: EN, FR, RW, SW ] },
Country::SA: CountryInfo { code: CountryCode::SA, name: s!("Saudi Arabia"), currencies: vh![ CurrencyCode: SAR ], languages: vh![ LanguageCode: AR ] },
Country::SB: CountryInfo { code: CountryCode::SB, name: s!("Solomon Islands"), currencies: vh![ CurrencyCode: SBD ], languages: vh![ LanguageCode: EN ] },
Country::SC: CountryInfo { code: CountryCode::SC, name: s!("Seychelles"), currencies: vh![ CurrencyCode: SCR ], languages: vh![ LanguageCode: EN, FR ] },
Country::SD: CountryInfo { code: CountryCode::SD, name: s!("Sudan"), currencies: vh![ CurrencyCode: SDG ], languages: vh![ LanguageCode: AR, EN ] },
Country::SE: CountryInfo { code: CountryCode::SE, name: s!("Sweden"), currencies: vh![ CurrencyCode: SEK ], languages: vh![ LanguageCode: SV ] },
Country::SG: CountryInfo { code: CountryCode::SG, name: s!("Singapore"), currencies: vh![ CurrencyCode: SGD ], languages: vh![ LanguageCode: EN, MS, TA, ZH ] },
Country::SH: CountryInfo { code: CountryCode::SH, name: s!("Saint Helena, Ascension and Tristan da Cunha"), currencies: vh![ CurrencyCode: GBP, SHP ], languages: vh![ LanguageCode: EN ] },
Country::SI: CountryInfo { code: CountryCode::SI, name: s!("Slovenia"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: SL ] },
Country::SJ: CountryInfo { code: CountryCode::SJ, name: s!("Svalbard and Jan Mayen"), currencies: vh![ CurrencyCode: NOK ], languages: vh![ LanguageCode: NO ] },
Country::SK: CountryInfo { code: CountryCode::SK, name: s!("Slovakia"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: SK ] },
Country::SL: CountryInfo { code: CountryCode::SL, name: s!("Sierra Leone"), currencies: vh![ CurrencyCode: SLE, SLL ], languages: vh![ LanguageCode: EN ] },
Country::SM: CountryInfo { code: CountryCode::SM, name: s!("San Marino"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: IT ] },
Country::SN: CountryInfo { code: CountryCode::SN, name: s!("Senegal"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::SO: CountryInfo { code: CountryCode::SO, name: s!("Somalia"), currencies: vh![ CurrencyCode: SOS ], languages: vh![ LanguageCode: AR, SO ] },
Country::SR: CountryInfo { code: CountryCode::SR, name: s!("Suriname"), currencies: vh![ CurrencyCode: SRD ], languages: vh![ LanguageCode: NL ] },
Country::SS: CountryInfo { code: CountryCode::SS, name: s!("South Sudan"), currencies: vh![ CurrencyCode: SSP ], languages: vh![ LanguageCode: EN ] },
Country::ST: CountryInfo { code: CountryCode::ST, name: s!("Sao Tome and Principe"), currencies: vh![ CurrencyCode: STN ], languages: vh![ LanguageCode: PT ] },
Country::SV: CountryInfo { code: CountryCode::SV, name: s!("El Salvador"), currencies: vh![ CurrencyCode: SVC, USD ], languages: vh![ LanguageCode: ES ] },
Country::SX: CountryInfo { code: CountryCode::SX, name: s!("Sint Maarten (Dutch part)"), currencies: vh![ CurrencyCode: ANG ], languages: vh![ LanguageCode: EN, NL ] },
Country::SY: CountryInfo { code: CountryCode::SY, name: s!("Syrian Arab Republic"), currencies: vh![ CurrencyCode: SYP ], languages: vh![ LanguageCode: AR ] },
Country::SZ: CountryInfo { code: CountryCode::SZ, name: s!("Eswatini"), currencies: vh![ CurrencyCode: SZL, ZAR ], languages: vh![ LanguageCode: EN, SS ] },
Country::TC: CountryInfo { code: CountryCode::TC, name: s!("Turks and Caicos Islands"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::TD: CountryInfo { code: CountryCode::TD, name: s!("Chad"), currencies: vh![ CurrencyCode: XAF ], languages: vh![ LanguageCode: AR, FR ] },
Country::TF: CountryInfo { code: CountryCode::TF, name: s!("French Southern Territories"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::TG: CountryInfo { code: CountryCode::TG, name: s!("Togo"), currencies: vh![ CurrencyCode: XOF ], languages: vh![ LanguageCode: FR ] },
Country::TH: CountryInfo { code: CountryCode::TH, name: s!("Thailand"), currencies: vh![ CurrencyCode: THB ], languages: vh![ LanguageCode: TH ] },
Country::TJ: CountryInfo { code: CountryCode::TJ, name: s!("Tajikistan"), currencies: vh![ CurrencyCode: TJS ], languages: vh![ LanguageCode: TG ] },
Country::TK: CountryInfo { code: CountryCode::TK, name: s!("Tokelau"), currencies: vh![ CurrencyCode: NZD ], languages: vh![ LanguageCode: EN ] },
Country::TL: CountryInfo { code: CountryCode::TL, name: s!("Timor-Leste"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: PT ] },
Country::TM: CountryInfo { code: CountryCode::TM, name: s!("Turkmenistan"), currencies: vh![ CurrencyCode: TMT ], languages: vh![ LanguageCode: TK ] },
Country::TN: CountryInfo { code: CountryCode::TN, name: s!("Tunisia"), currencies: vh![ CurrencyCode: TND ], languages: vh![ LanguageCode: AR ] },
Country::TO: CountryInfo { code: CountryCode::TO, name: s!("Tonga"), currencies: vh![ CurrencyCode: TOP ], languages: vh![ LanguageCode: EN, TO ] },
Country::TR: CountryInfo { code: CountryCode::TR, name: s!("Türkiye"), currencies: vh![ CurrencyCode: TRY ], languages: vh![ LanguageCode: TR ] },
Country::TT: CountryInfo { code: CountryCode::TT, name: s!("Trinidad and Tobago"), currencies: vh![ CurrencyCode: TTD ], languages: vh![ LanguageCode: EN ] },
Country::TV: CountryInfo { code: CountryCode::TV, name: s!("Tuvalu"), currencies: vh![ CurrencyCode: AUD ], languages: vh![ LanguageCode: EN ] },
Country::TW: CountryInfo { code: CountryCode::TW, name: s!("Taiwan, Province of China"), currencies: vh![ CurrencyCode: TWD ], languages: vh![ LanguageCode: ZH ] },
Country::TZ: CountryInfo { code: CountryCode::TZ, name: s!("Tanzania, United Republic of"), currencies: vh![ CurrencyCode: TZS ], languages: vh![ LanguageCode: EN, SW ] },
Country::UA: CountryInfo { code: CountryCode::UA, name: s!("Ukraine"), currencies: vh![ CurrencyCode: UAH ], languages: vh![ LanguageCode: UK ] },
Country::UG: CountryInfo { code: CountryCode::UG, name: s!("Uganda"), currencies: vh![ CurrencyCode: UGX ], languages: vh![ LanguageCode: EN, SW ] },
Country::UM: CountryInfo { code: CountryCode::UM, name: s!("United States Minor Outlying Islands"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::US: CountryInfo { code: CountryCode::US, name: s!("United States of America"), currencies: vh![ CurrencyCode: USD, USN ], languages: vh![ LanguageCode: EN ] },
Country::UY: CountryInfo { code: CountryCode::UY, name: s!("Uruguay"), currencies: vh![ CurrencyCode: UYI, UYU, UYW ], languages: vh![ LanguageCode: ES ] },
Country::UZ: CountryInfo { code: CountryCode::UZ, name: s!("Uzbekistan"), currencies: vh![ CurrencyCode: UZS ], languages: vh![ LanguageCode: UZ ] },
Country::VA: CountryInfo { code: CountryCode::VA, name: s!("Holy See"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: IT, LA ] },
Country::VC: CountryInfo { code: CountryCode::VC, name: s!("Saint Vincent and the Grenadines"), currencies: vh![ CurrencyCode: XCD ], languages: vh![ LanguageCode: EN ] },
Country::VE: CountryInfo { code: CountryCode::VE, name: s!("Venezuela (Bolivarian Republic of)"), currencies: vh![ CurrencyCode: VED, VES ], languages: vh![ LanguageCode: ES ] },
Country::VG: CountryInfo { code: CountryCode::VG, name: s!("Virgin Islands (British)"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::VI: CountryInfo { code: CountryCode::VI, name: s!("Virgin Islands (U.S.)"), currencies: vh![ CurrencyCode: USD ], languages: vh![ LanguageCode: EN ] },
Country::VN: CountryInfo { code: CountryCode::VN, name: s!("Viet Nam"), currencies: vh![ CurrencyCode: VND ], languages: vh![ LanguageCode: VI ] },
Country::VU: CountryInfo { code: CountryCode::VU, name: s!("Vanuatu"), currencies: vh![ CurrencyCode: VUV ], languages: vh![ LanguageCode: BI, EN, FR ] },
Country::WF: CountryInfo { code: CountryCode::WF, name: s!("Wallis and Futuna"), currencies: vh![ CurrencyCode: XPF ], languages: vh![ LanguageCode: FR ] },
Country::WS: CountryInfo { code: CountryCode::WS, name: s!("Samoa"), currencies: vh![ CurrencyCode: WST ], languages: vh![ LanguageCode: EN, SM ] },
Country::YE: CountryInfo { code: CountryCode::YE, name: s!("Yemen"), currencies: vh![ CurrencyCode: YER ], languages: vh![ LanguageCode: AR ] },
Country::YT: CountryInfo { code: CountryCode::YT, name: s!("Mayotte"), currencies: vh![ CurrencyCode: EUR ], languages: vh![ LanguageCode: FR ] },
Country::ZA: CountryInfo { code: CountryCode::ZA, name: s!("South Africa"), currencies: vh![ CurrencyCode: ZAR ], languages: vh![ LanguageCode: AF, EN, NR, SS, ST, TN, TS, VE, XH, ZU ] },
Country::ZM: CountryInfo { code: CountryCode::ZM, name: s!("Zambia"), currencies: vh![ CurrencyCode: ZMW ], languages: vh![ LanguageCode: EN ] },
Country::ZW: CountryInfo { code: CountryCode::ZW, name: s!("Zimbabwe"), currencies: vh![ CurrencyCode: ZWL ], languages: vh![ LanguageCode: EN, NR, NY, SN, ST, TN, VE, XH ] },
}
});
#[expect(clippy::doc_markdown, reason = "False positives")]
#[derive(Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(into = "String", try_from = "String")]
#[non_exhaustive]
pub enum Country {
AD,
AE,
AF,
AG,
AI,
AL,
AM,
AO,
AQ,
AR,
AS,
AT,
AU,
AW,
AX,
AZ,
BA,
BB,
BD,
BE,
BF,
BG,
BH,
BI,
BJ,
BL,
BM,
BN,
BO,
BQ,
BR,
BS,
BT,
BV,
BW,
BY,
BZ,
CA,
CC,
CD,
CF,
CG,
CH,
CI,
CK,
CL,
CM,
CN,
CO,
CR,
CU,
CV,
CW,
CX,
CY,
CZ,
DE,
DJ,
DK,
DM,
DO,
DZ,
EC,
EE,
EG,
EH,
ER,
ES,
ET,
FI,
FJ,
FK,
FM,
FO,
FR,
GA,
GB,
GD,
GE,
GF,
GG,
GH,
GI,
GL,
GM,
GN,
GP,
GQ,
GR,
GS,
GT,
GU,
GW,
GY,
HK,
HM,
HN,
HR,
HT,
HU,
ID,
IE,
IL,
IM,
IN,
IO,
IQ,
IR,
IS,
IT,
JE,
JM,
JO,
JP,
KE,
KG,
KH,
KI,
KM,
KN,
KP,
KR,
KW,
KY,
KZ,
LA,
LB,
LC,
LI,
LK,
LR,
LS,
LT,
LU,
LV,
LY,
MA,
MC,
MD,
ME,
MF,
MG,
MH,
MK,
ML,
MM,
MN,
MO,
MP,
MQ,
MR,
MS,
MT,
MU,
MV,
MW,
MX,
MY,
MZ,
NA,
NC,
NE,
NF,
NG,
NI,
NL,
NO,
NP,
NR,
NU,
NZ,
OM,
PA,
PE,
PF,
PG,
PH,
PK,
PL,
PM,
PN,
PR,
PS,
PT,
PW,
PY,
QA,
RE,
RO,
RS,
RU,
RW,
SA,
SB,
SC,
SD,
SE,
SG,
SH,
SI,
SJ,
SK,
SL,
SM,
SN,
SO,
SR,
SS,
ST,
SV,
SX,
SY,
SZ,
TC,
TD,
TF,
TG,
TH,
TJ,
TK,
TL,
TM,
TN,
TO,
TR,
TT,
TV,
TW,
TZ,
UA,
UG,
UM,
US,
UY,
UZ,
VA,
VC,
VE,
VG,
VI,
VN,
VU,
WF,
WS,
YE,
YT,
ZA,
ZM,
ZW,
}
impl Country {
pub fn all() -> Vec<Self> {
COUNTRIES.keys().copied().collect()
}
#[must_use]
fn info(self) -> &'static CountryInfo {
#[expect(clippy::unwrap_used, reason = "Infallible")]
COUNTRIES.get(&self).unwrap()
}
#[must_use]
pub fn name(&self) -> &str {
&self.info().name
}
#[must_use]
pub fn code(&self) -> CountryCode {
self.info().code
}
#[must_use]
pub fn currencies(&self) -> &HashSet<CurrencyCode> {
&self.info().currencies
}
#[must_use]
pub fn languages(&self) -> &HashSet<LanguageCode> {
&self.info().languages
}
}
impl AsStr for Country {
fn as_str(&self) -> &str {
&self.info().name
}
}
impl Debug for Country {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.info().code.as_str(), self.as_str())
}
}
impl Display for Country {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl From<Country> for String {
fn from(country: Country) -> Self {
country.to_string()
}
}
impl FromStr for Country {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
COUNTRIES
.values()
.find(|info| info.name == s)
.map_or_else(
|| Err(format!("Invalid Country: {s}")),
|info| Ok(info.code.country())
)
}
}
impl TryFrom<String> for Country {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
value.as_str().parse()
}
}
#[expect(clippy::doc_markdown, reason = "False positives")]
#[expect(clippy::zero_prefixed_literal, reason = "Zeroes aid readability here")]
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[repr(u16)]
#[serde(into = "String", try_from = "String")]
#[non_exhaustive]
pub enum CountryCode {
AD = 020,
AE = 784,
AF = 004,
AG = 028,
AI = 660,
AL = 008,
AM = 051,
AO = 024,
AQ = 010,
AR = 032,
AS = 016,
AT = 040,
AU = 036,
AW = 533,
AX = 248,
AZ = 031,
BA = 070,
BB = 052,
BD = 050,
BE = 056,
BF = 854,
BG = 100,
BH = 048,
BI = 108,
BJ = 204,
BL = 652,
BM = 060,
BN = 096,
BO = 068,
BQ = 535,
BR = 076,
BS = 044,
BT = 064,
BV = 074,
BW = 072,
BY = 112,
BZ = 084,
CA = 124,
CC = 166,
CD = 180,
CF = 140,
CG = 178,
CH = 756,
CI = 384,
CK = 184,
CL = 152,
CM = 120,
CN = 156,
CO = 170,
CR = 188,
CU = 192,
CV = 132,
CW = 531,
CX = 162,
CY = 196,
CZ = 203,
DE = 276,
DJ = 262,
DK = 208,
DM = 212,
DO = 214,
DZ = 012,
EC = 218,
EE = 233,
EG = 818,
EH = 732,
ER = 232,
ES = 724,
ET = 231,
FI = 246,
FJ = 242,
FK = 238,
FM = 583,
FO = 234,
FR = 250,
GA = 266,
GB = 826,
GD = 308,
GE = 268,
GF = 254,
GG = 831,
GH = 288,
GI = 292,
GL = 304,
GM = 270,
GN = 324,
GP = 312,
GQ = 226,
GR = 300,
GS = 239,
GT = 320,
GU = 316,
GW = 624,
GY = 328,
HK = 344,
HM = 334,
HN = 340,
HR = 191,
HT = 332,
HU = 348,
ID = 360,
IE = 372,
IL = 376,
IM = 833,
IN = 356,
IO = 086,
IQ = 368,
IR = 364,
IS = 352,
IT = 380,
JE = 832,
JM = 388,
JO = 400,
JP = 392,
KE = 404,
KG = 417,
KH = 116,
KI = 296,
KM = 174,
KN = 659,
KP = 408,
KR = 410,
KW = 414,
KY = 136,
KZ = 398,
LA = 418,
LB = 422,
LC = 662,
LI = 438,
LK = 144,
LR = 430,
LS = 426,
LT = 440,
LU = 442,
LV = 428,
LY = 434,
MA = 504,
MC = 492,
MD = 498,
ME = 499,
MF = 663,
MG = 450,
MH = 584,
MK = 807,
ML = 466,
MM = 104,
MN = 496,
MO = 446,
MP = 580,
MQ = 474,
MR = 478,
MS = 500,
MT = 470,
MU = 480,
MV = 462,
MW = 454,
MX = 484,
MY = 458,
MZ = 508,
NA = 516,
NC = 540,
NE = 562,
NF = 574,
NG = 566,
NI = 558,
NL = 528,
NO = 578,
NP = 524,
NR = 520,
NU = 570,
NZ = 554,
OM = 512,
PA = 591,
PE = 604,
PF = 258,
PG = 598,
PH = 608,
PK = 586,
PL = 616,
PM = 666,
PN = 612,
PR = 630,
PS = 275,
PT = 620,
PW = 585,
PY = 600,
QA = 634,
RE = 638,
RO = 642,
RS = 688,
RU = 643,
RW = 646,
SA = 682,
SB = 090,
SC = 690,
SD = 729,
SE = 752,
SG = 702,
SH = 654,
SI = 705,
SJ = 744,
SK = 703,
SL = 694,
SM = 674,
SN = 686,
SO = 706,
SR = 740,
SS = 728,
ST = 678,
SV = 222,
SX = 534,
SY = 760,
SZ = 748,
TC = 796,
TD = 148,
TF = 260,
TG = 768,
TH = 764,
TJ = 762,
TK = 772,
TL = 626,
TM = 795,
TN = 788,
TO = 776,
TR = 792,
TT = 780,
TV = 798,
TW = 158,
TZ = 834,
UA = 804,
UG = 800,
UM = 581,
US = 840,
UY = 858,
UZ = 860,
VA = 336,
VC = 670,
VE = 862,
VG = 092,
VI = 850,
VN = 704,
VU = 548,
WF = 876,
WS = 882,
YE = 887,
YT = 175,
ZA = 710,
ZM = 894,
ZW = 716,
ABW = 1_533,
AFG = 1_004,
AGO = 1_024,
AIA = 1_660,
ALA = 1_248,
ALB = 1_008,
AND = 1_020,
ARE = 1_784,
ARG = 1_032,
ARM = 1_051,
ASM = 1_016,
ATA = 1_010,
ATF = 1_260,
ATG = 1_028,
AUS = 1_036,
AUT = 1_040,
AZE = 1_031,
BDI = 1_108,
BEL = 1_056,
BEN = 1_204,
BES = 1_535,
BFA = 1_854,
BGD = 1_050,
BGR = 1_100,
BHR = 1_048,
BHS = 1_044,
BIH = 1_070,
BLM = 1_652,
BLR = 1_112,
BLZ = 1_084,
BMU = 1_060,
BOL = 1_068,
BRA = 1_076,
BRB = 1_052,
BRN = 1_096,
BTN = 1_064,
BVT = 1_074,
BWA = 1_072,
CAF = 1_140,
CAN = 1_124,
CCK = 1_166,
CHE = 1_756,
CHL = 1_152,
CHN = 1_156,
CIV = 1_384,
CMR = 1_120,
COD = 1_180,
COG = 1_178,
COK = 1_184,
COL = 1_170,
COM = 1_174,
CPV = 1_132,
CRI = 1_188,
CUB = 1_192,
CUW = 1_531,
CXR = 1_162,
CYM = 1_136,
CYP = 1_196,
CZE = 1_203,
DEU = 1_276,
DJI = 1_262,
DMA = 1_212,
DNK = 1_208,
DOM = 1_214,
DZA = 1_012,
ECU = 1_218,
EGY = 1_818,
ERI = 1_232,
ESH = 1_732,
ESP = 1_724,
EST = 1_233,
ETH = 1_231,
FIN = 1_246,
FJI = 1_242,
FLK = 1_238,
FRA = 1_250,
FRO = 1_234,
FSM = 1_583,
GAB = 1_266,
GBR = 1_826,
GEO = 1_268,
GGY = 1_831,
GHA = 1_288,
GIB = 1_292,
GIN = 1_324,
GLP = 1_312,
GMB = 1_270,
GNB = 1_624,
GNQ = 1_226,
GRC = 1_300,
GRD = 1_308,
GRL = 1_304,
GTM = 1_320,
GUF = 1_254,
GUM = 1_316,
GUY = 1_328,
HKG = 1_344,
HMD = 1_334,
HND = 1_340,
HRV = 1_191,
HTI = 1_332,
HUN = 1_348,
IDN = 1_360,
IMN = 1_833,
IND = 1_356,
IOT = 1_086,
IRL = 1_372,
IRN = 1_364,
IRQ = 1_368,
ISL = 1_352,
ISR = 1_376,
ITA = 1_380,
JAM = 1_388,
JEY = 1_832,
JOR = 1_400,
JPN = 1_392,
KAZ = 1_398,
KEN = 1_404,
KGZ = 1_417,
KHM = 1_116,
KIR = 1_296,
KNA = 1_659,
KOR = 1_410,
KWT = 1_414,
LAO = 1_418,
LBN = 1_422,
LBR = 1_430,
LBY = 1_434,
LCA = 1_662,
LIE = 1_438,
LKA = 1_144,
LSO = 1_426,
LTU = 1_440,
LUX = 1_442,
LVA = 1_428,
MAC = 1_446,
MAF = 1_663,
MAR = 1_504,
MCO = 1_492,
MDA = 1_498,
MDG = 1_450,
MDV = 1_462,
MEX = 1_484,
MHL = 1_584,
MKD = 1_807,
MLI = 1_466,
MLT = 1_470,
MMR = 1_104,
MNE = 1_499,
MNG = 1_496,
MNP = 1_580,
MOZ = 1_508,
MRT = 1_478,
MSR = 1_500,
MTQ = 1_474,
MUS = 1_480,
MWI = 1_454,
MYS = 1_458,
MYT = 1_175,
NAM = 1_516,
NCL = 1_540,
NER = 1_562,
NFK = 1_574,
NGA = 1_566,
NIC = 1_558,
NIU = 1_570,
NLD = 1_528,
NOR = 1_578,
NPL = 1_524,
NRU = 1_520,
NZL = 1_554,
OMN = 1_512,
PAK = 1_586,
PAN = 1_591,
PCN = 1_612,
PER = 1_604,
PHL = 1_608,
PLW = 1_585,
PNG = 1_598,
POL = 1_616,
PRI = 1_630,
PRK = 1_408,
PRT = 1_620,
PRY = 1_600,
PSE = 1_275,
PYF = 1_258,
QAT = 1_634,
REU = 1_638,
ROU = 1_642,
RUS = 1_643,
RWA = 1_646,
SAU = 1_682,
SDN = 1_729,
SEN = 1_686,
SGP = 1_702,
SGS = 1_239,
SHN = 1_654,
SJM = 1_744,
SLB = 1_090,
SLE = 1_694,
SLV = 1_222,
SMR = 1_674,
SOM = 1_706,
SPM = 1_666,
SRB = 1_688,
SSD = 1_728,
STP = 1_678,
SUR = 1_740,
SVK = 1_703,
SVN = 1_705,
SWE = 1_752,
SWZ = 1_748,
SXM = 1_534,
SYC = 1_690,
SYR = 1_760,
TCA = 1_796,
TCD = 1_148,
TGO = 1_768,
THA = 1_764,
TJK = 1_762,
TKL = 1_772,
TKM = 1_795,
TLS = 1_626,
TON = 1_776,
TTO = 1_780,
TUN = 1_788,
TUR = 1_792,
TUV = 1_798,
TWN = 1_158,
TZA = 1_834,
UGA = 1_800,
UKR = 1_804,
UMI = 1_581,
URY = 1_858,
USA = 1_840,
UZB = 1_860,
VAT = 1_336,
VCT = 1_670,
VEN = 1_862,
VGB = 1_092,
VIR = 1_850,
VNM = 1_704,
VUT = 1_548,
WLF = 1_876,
WSM = 1_882,
YEM = 1_887,
ZAF = 1_710,
ZMB = 1_894,
ZWE = 1_716,
}
impl CountryCode {
pub fn all() -> Vec<Self> {
COUNTRIES.values().map(|info| info.code).collect()
}
#[expect(clippy::too_many_lines, reason = "Data not logic")]
#[expect(clippy::match_same_arms, reason = "Clearer to maintain two lists")]
#[must_use]
pub const fn country(&self) -> Country {
match *self {
Self::AD => Country::AD,
Self::AE => Country::AE,
Self::AF => Country::AF,
Self::AG => Country::AG,
Self::AI => Country::AI,
Self::AL => Country::AL,
Self::AM => Country::AM,
Self::AO => Country::AO,
Self::AQ => Country::AQ,
Self::AR => Country::AR,
Self::AS => Country::AS,
Self::AT => Country::AT,
Self::AU => Country::AU,
Self::AW => Country::AW,
Self::AX => Country::AX,
Self::AZ => Country::AZ,
Self::BA => Country::BA,
Self::BB => Country::BB,
Self::BD => Country::BD,
Self::BE => Country::BE,
Self::BF => Country::BF,
Self::BG => Country::BG,
Self::BH => Country::BH,
Self::BI => Country::BI,
Self::BJ => Country::BJ,
Self::BL => Country::BL,
Self::BM => Country::BM,
Self::BN => Country::BN,
Self::BO => Country::BO,
Self::BQ => Country::BQ,
Self::BR => Country::BR,
Self::BS => Country::BS,
Self::BT => Country::BT,
Self::BV => Country::BV,
Self::BW => Country::BW,
Self::BY => Country::BY,
Self::BZ => Country::BZ,
Self::CA => Country::CA,
Self::CC => Country::CC,
Self::CD => Country::CD,
Self::CF => Country::CF,
Self::CG => Country::CG,
Self::CH => Country::CH,
Self::CI => Country::CI,
Self::CK => Country::CK,
Self::CL => Country::CL,
Self::CM => Country::CM,
Self::CN => Country::CN,
Self::CO => Country::CO,
Self::CR => Country::CR,
Self::CU => Country::CU,
Self::CV => Country::CV,
Self::CW => Country::CW,
Self::CX => Country::CX,
Self::CY => Country::CY,
Self::CZ => Country::CZ,
Self::DE => Country::DE,
Self::DJ => Country::DJ,
Self::DK => Country::DK,
Self::DM => Country::DM,
Self::DO => Country::DO,
Self::DZ => Country::DZ,
Self::EC => Country::EC,
Self::EE => Country::EE,
Self::EG => Country::EG,
Self::EH => Country::EH,
Self::ER => Country::ER,
Self::ES => Country::ES,
Self::ET => Country::ET,
Self::FI => Country::FI,
Self::FJ => Country::FJ,
Self::FK => Country::FK,
Self::FM => Country::FM,
Self::FO => Country::FO,
Self::FR => Country::FR,
Self::GA => Country::GA,
Self::GB => Country::GB,
Self::GD => Country::GD,
Self::GE => Country::GE,
Self::GF => Country::GF,
Self::GG => Country::GG,
Self::GH => Country::GH,
Self::GI => Country::GI,
Self::GL => Country::GL,
Self::GM => Country::GM,
Self::GN => Country::GN,
Self::GP => Country::GP,
Self::GQ => Country::GQ,
Self::GR => Country::GR,
Self::GS => Country::GS,
Self::GT => Country::GT,
Self::GU => Country::GU,
Self::GW => Country::GW,
Self::GY => Country::GY,
Self::HK => Country::HK,
Self::HM => Country::HM,
Self::HN => Country::HN,
Self::HR => Country::HR,
Self::HT => Country::HT,
Self::HU => Country::HU,
Self::ID => Country::ID,
Self::IE => Country::IE,
Self::IL => Country::IL,
Self::IM => Country::IM,
Self::IN => Country::IN,
Self::IO => Country::IO,
Self::IQ => Country::IQ,
Self::IR => Country::IR,
Self::IS => Country::IS,
Self::IT => Country::IT,
Self::JE => Country::JE,
Self::JM => Country::JM,
Self::JO => Country::JO,
Self::JP => Country::JP,
Self::KE => Country::KE,
Self::KG => Country::KG,
Self::KH => Country::KH,
Self::KI => Country::KI,
Self::KM => Country::KM,
Self::KN => Country::KN,
Self::KP => Country::KP,
Self::KR => Country::KR,
Self::KW => Country::KW,
Self::KY => Country::KY,
Self::KZ => Country::KZ,
Self::LA => Country::LA,
Self::LB => Country::LB,
Self::LC => Country::LC,
Self::LI => Country::LI,
Self::LK => Country::LK,
Self::LR => Country::LR,
Self::LS => Country::LS,
Self::LT => Country::LT,
Self::LU => Country::LU,
Self::LV => Country::LV,
Self::LY => Country::LY,
Self::MA => Country::MA,
Self::MC => Country::MC,
Self::MD => Country::MD,
Self::ME => Country::ME,
Self::MF => Country::MF,
Self::MG => Country::MG,
Self::MH => Country::MH,
Self::MK => Country::MK,
Self::ML => Country::ML,
Self::MM => Country::MM,
Self::MN => Country::MN,
Self::MO => Country::MO,
Self::MP => Country::MP,
Self::MQ => Country::MQ,
Self::MR => Country::MR,
Self::MS => Country::MS,
Self::MT => Country::MT,
Self::MU => Country::MU,
Self::MV => Country::MV,
Self::MW => Country::MW,
Self::MX => Country::MX,
Self::MY => Country::MY,
Self::MZ => Country::MZ,
Self::NA => Country::NA,
Self::NC => Country::NC,
Self::NE => Country::NE,
Self::NF => Country::NF,
Self::NG => Country::NG,
Self::NI => Country::NI,
Self::NL => Country::NL,
Self::NO => Country::NO,
Self::NP => Country::NP,
Self::NR => Country::NR,
Self::NU => Country::NU,
Self::NZ => Country::NZ,
Self::OM => Country::OM,
Self::PA => Country::PA,
Self::PE => Country::PE,
Self::PF => Country::PF,
Self::PG => Country::PG,
Self::PH => Country::PH,
Self::PK => Country::PK,
Self::PL => Country::PL,
Self::PM => Country::PM,
Self::PN => Country::PN,
Self::PR => Country::PR,
Self::PS => Country::PS,
Self::PT => Country::PT,
Self::PW => Country::PW,
Self::PY => Country::PY,
Self::QA => Country::QA,
Self::RE => Country::RE,
Self::RO => Country::RO,
Self::RS => Country::RS,
Self::RU => Country::RU,
Self::RW => Country::RW,
Self::SA => Country::SA,
Self::SB => Country::SB,
Self::SC => Country::SC,
Self::SD => Country::SD,
Self::SE => Country::SE,
Self::SG => Country::SG,
Self::SH => Country::SH,
Self::SI => Country::SI,
Self::SJ => Country::SJ,
Self::SK => Country::SK,
Self::SL => Country::SL,
Self::SM => Country::SM,
Self::SN => Country::SN,
Self::SO => Country::SO,
Self::SR => Country::SR,
Self::SS => Country::SS,
Self::ST => Country::ST,
Self::SV => Country::SV,
Self::SX => Country::SX,
Self::SY => Country::SY,
Self::SZ => Country::SZ,
Self::TC => Country::TC,
Self::TD => Country::TD,
Self::TF => Country::TF,
Self::TG => Country::TG,
Self::TH => Country::TH,
Self::TJ => Country::TJ,
Self::TK => Country::TK,
Self::TL => Country::TL,
Self::TM => Country::TM,
Self::TN => Country::TN,
Self::TO => Country::TO,
Self::TR => Country::TR,
Self::TT => Country::TT,
Self::TV => Country::TV,
Self::TW => Country::TW,
Self::TZ => Country::TZ,
Self::UA => Country::UA,
Self::UG => Country::UG,
Self::UM => Country::UM,
Self::US => Country::US,
Self::UY => Country::UY,
Self::UZ => Country::UZ,
Self::VA => Country::VA,
Self::VC => Country::VC,
Self::VE => Country::VE,
Self::VG => Country::VG,
Self::VI => Country::VI,
Self::VN => Country::VN,
Self::VU => Country::VU,
Self::WF => Country::WF,
Self::WS => Country::WS,
Self::YE => Country::YE,
Self::YT => Country::YT,
Self::ZA => Country::ZA,
Self::ZM => Country::ZM,
Self::ZW => Country::ZW,
Self::ABW => Country::AW,
Self::AFG => Country::AF,
Self::AGO => Country::AO,
Self::AIA => Country::AI,
Self::ALA => Country::AX,
Self::ALB => Country::AL,
Self::AND => Country::AD,
Self::ARE => Country::AE,
Self::ARG => Country::AR,
Self::ARM => Country::AM,
Self::ASM => Country::AS,
Self::ATA => Country::AQ,
Self::ATF => Country::TF,
Self::ATG => Country::AG,
Self::AUS => Country::AU,
Self::AUT => Country::AT,
Self::AZE => Country::AZ,
Self::BDI => Country::BI,
Self::BEL => Country::BE,
Self::BEN => Country::BJ,
Self::BES => Country::BQ,
Self::BFA => Country::BF,
Self::BGD => Country::BD,
Self::BGR => Country::BG,
Self::BHR => Country::BH,
Self::BHS => Country::BS,
Self::BIH => Country::BA,
Self::BLM => Country::BL,
Self::BLR => Country::BY,
Self::BLZ => Country::BZ,
Self::BMU => Country::BM,
Self::BOL => Country::BO,
Self::BRA => Country::BR,
Self::BRB => Country::BB,
Self::BRN => Country::BN,
Self::BTN => Country::BT,
Self::BVT => Country::BV,
Self::BWA => Country::BW,
Self::CAF => Country::CF,
Self::CAN => Country::CA,
Self::CCK => Country::CC,
Self::CHE => Country::CH,
Self::CHL => Country::CL,
Self::CHN => Country::CN,
Self::CIV => Country::CI,
Self::CMR => Country::CM,
Self::COD => Country::CD,
Self::COG => Country::CG,
Self::COK => Country::CK,
Self::COL => Country::CO,
Self::COM => Country::KM,
Self::CPV => Country::CV,
Self::CRI => Country::CR,
Self::CUB => Country::CU,
Self::CUW => Country::CW,
Self::CXR => Country::CX,
Self::CYM => Country::KY,
Self::CYP => Country::CY,
Self::CZE => Country::CZ,
Self::DEU => Country::DE,
Self::DJI => Country::DJ,
Self::DMA => Country::DM,
Self::DNK => Country::DK,
Self::DOM => Country::DO,
Self::DZA => Country::DZ,
Self::ECU => Country::EC,
Self::EGY => Country::EG,
Self::ERI => Country::ER,
Self::ESH => Country::EH,
Self::ESP => Country::ES,
Self::EST => Country::EE,
Self::ETH => Country::ET,
Self::FIN => Country::FI,
Self::FJI => Country::FJ,
Self::FLK => Country::FK,
Self::FRA => Country::FR,
Self::FRO => Country::FO,
Self::FSM => Country::FM,
Self::GAB => Country::GA,
Self::GBR => Country::GB,
Self::GEO => Country::GE,
Self::GGY => Country::GG,
Self::GHA => Country::GH,
Self::GIB => Country::GI,
Self::GIN => Country::GN,
Self::GLP => Country::GP,
Self::GMB => Country::GM,
Self::GNB => Country::GW,
Self::GNQ => Country::GQ,
Self::GRC => Country::GR,
Self::GRD => Country::GD,
Self::GRL => Country::GL,
Self::GTM => Country::GT,
Self::GUF => Country::GF,
Self::GUM => Country::GU,
Self::GUY => Country::GY,
Self::HKG => Country::HK,
Self::HMD => Country::HM,
Self::HND => Country::HN,
Self::HRV => Country::HR,
Self::HTI => Country::HT,
Self::HUN => Country::HU,
Self::IDN => Country::ID,
Self::IMN => Country::IM,
Self::IND => Country::IN,
Self::IOT => Country::IO,
Self::IRL => Country::IE,
Self::IRN => Country::IR,
Self::IRQ => Country::IQ,
Self::ISL => Country::IS,
Self::ISR => Country::IL,
Self::ITA => Country::IT,
Self::JAM => Country::JM,
Self::JEY => Country::JE,
Self::JOR => Country::JO,
Self::JPN => Country::JP,
Self::KAZ => Country::KZ,
Self::KEN => Country::KE,
Self::KGZ => Country::KG,
Self::KHM => Country::KH,
Self::KIR => Country::KI,
Self::KNA => Country::KN,
Self::KOR => Country::KR,
Self::KWT => Country::KW,
Self::LAO => Country::LA,
Self::LBN => Country::LB,
Self::LBR => Country::LR,
Self::LBY => Country::LY,
Self::LCA => Country::LC,
Self::LIE => Country::LI,
Self::LKA => Country::LK,
Self::LSO => Country::LS,
Self::LTU => Country::LT,
Self::LUX => Country::LU,
Self::LVA => Country::LV,
Self::MAC => Country::MO,
Self::MAF => Country::MF,
Self::MAR => Country::MA,
Self::MCO => Country::MC,
Self::MDA => Country::MD,
Self::MDG => Country::MG,
Self::MDV => Country::MV,
Self::MEX => Country::MX,
Self::MHL => Country::MH,
Self::MKD => Country::MK,
Self::MLI => Country::ML,
Self::MLT => Country::MT,
Self::MMR => Country::MM,
Self::MNE => Country::ME,
Self::MNG => Country::MN,
Self::MNP => Country::MP,
Self::MOZ => Country::MZ,
Self::MRT => Country::MR,
Self::MSR => Country::MS,
Self::MTQ => Country::MQ,
Self::MUS => Country::MU,
Self::MWI => Country::MW,
Self::MYS => Country::MY,
Self::MYT => Country::YT,
Self::NAM => Country::NA,
Self::NCL => Country::NC,
Self::NER => Country::NE,
Self::NFK => Country::NF,
Self::NGA => Country::NG,
Self::NIC => Country::NI,
Self::NIU => Country::NU,
Self::NLD => Country::NL,
Self::NOR => Country::NO,
Self::NPL => Country::NP,
Self::NRU => Country::NR,
Self::NZL => Country::NZ,
Self::OMN => Country::OM,
Self::PAK => Country::PK,
Self::PAN => Country::PA,
Self::PCN => Country::PN,
Self::PER => Country::PE,
Self::PHL => Country::PH,
Self::PLW => Country::PW,
Self::PNG => Country::PG,
Self::POL => Country::PL,
Self::PRI => Country::PR,
Self::PRK => Country::KP,
Self::PRT => Country::PT,
Self::PRY => Country::PY,
Self::PSE => Country::PS,
Self::PYF => Country::PF,
Self::QAT => Country::QA,
Self::REU => Country::RE,
Self::ROU => Country::RO,
Self::RUS => Country::RU,
Self::RWA => Country::RW,
Self::SAU => Country::SA,
Self::SDN => Country::SD,
Self::SEN => Country::SN,
Self::SGP => Country::SG,
Self::SGS => Country::GS,
Self::SHN => Country::SH,
Self::SJM => Country::SJ,
Self::SLB => Country::SB,
Self::SLE => Country::SL,
Self::SLV => Country::SV,
Self::SMR => Country::SM,
Self::SOM => Country::SO,
Self::SPM => Country::PM,
Self::SRB => Country::RS,
Self::SSD => Country::SS,
Self::STP => Country::ST,
Self::SUR => Country::SR,
Self::SVK => Country::SK,
Self::SVN => Country::SI,
Self::SWE => Country::SE,
Self::SWZ => Country::SZ,
Self::SXM => Country::SX,
Self::SYC => Country::SC,
Self::SYR => Country::SY,
Self::TCA => Country::TC,
Self::TCD => Country::TD,
Self::TGO => Country::TG,
Self::THA => Country::TH,
Self::TJK => Country::TJ,
Self::TKL => Country::TK,
Self::TKM => Country::TM,
Self::TLS => Country::TL,
Self::TON => Country::TO,
Self::TTO => Country::TT,
Self::TUN => Country::TN,
Self::TUR => Country::TR,
Self::TUV => Country::TV,
Self::TWN => Country::TW,
Self::TZA => Country::TZ,
Self::UGA => Country::UG,
Self::UKR => Country::UA,
Self::UMI => Country::UM,
Self::URY => Country::UY,
Self::USA => Country::US,
Self::UZB => Country::UZ,
Self::VAT => Country::VA,
Self::VCT => Country::VC,
Self::VEN => Country::VE,
Self::VGB => Country::VG,
Self::VIR => Country::VI,
Self::VNM => Country::VN,
Self::VUT => Country::VU,
Self::WLF => Country::WF,
Self::WSM => Country::WS,
Self::YEM => Country::YE,
Self::ZAF => Country::ZA,
Self::ZMB => Country::ZM,
Self::ZWE => Country::ZW,
}
}
#[must_use]
pub const fn is_alpha2(&self) -> bool {
(*self as u16) < 1_000
}
#[must_use]
pub const fn is_alpha3(&self) -> bool {
(*self as u16) >= 1_000
}
#[expect(clippy::missing_panics_doc, reason = "Infallible")]
#[must_use]
pub fn to_alpha2(&self) -> Self {
let code = *self as u16;
if code >= 1_000 {
#[expect(clippy::arithmetic_side_effects, reason = "Range is controlled")]
#[expect(clippy::unwrap_used, reason = "Infallible")]
Self::try_from(code - 1_000).unwrap()
} else {
*self
}
}
#[expect(clippy::too_many_lines, reason = "Data not logic")]
#[must_use]
pub const fn to_alpha3(&self) -> Self {
#[expect(clippy::wildcard_enum_match_arm,
reason = "Need to match partial set, everything unmatched is the other type of code (to improve in future)"
)]
match *self {
Self::AW => Self::ABW,
Self::AF => Self::AFG,
Self::AO => Self::AGO,
Self::AI => Self::AIA,
Self::AX => Self::ALA,
Self::AL => Self::ALB,
Self::AD => Self::AND,
Self::AE => Self::ARE,
Self::AR => Self::ARG,
Self::AM => Self::ARM,
Self::AS => Self::ASM,
Self::AQ => Self::ATA,
Self::TF => Self::ATF,
Self::AG => Self::ATG,
Self::AU => Self::AUS,
Self::AT => Self::AUT,
Self::AZ => Self::AZE,
Self::BI => Self::BDI,
Self::BE => Self::BEL,
Self::BJ => Self::BEN,
Self::BQ => Self::BES,
Self::BF => Self::BFA,
Self::BD => Self::BGD,
Self::BG => Self::BGR,
Self::BH => Self::BHR,
Self::BS => Self::BHS,
Self::BA => Self::BIH,
Self::BL => Self::BLM,
Self::BY => Self::BLR,
Self::BZ => Self::BLZ,
Self::BM => Self::BMU,
Self::BO => Self::BOL,
Self::BR => Self::BRA,
Self::BB => Self::BRB,
Self::BN => Self::BRN,
Self::BT => Self::BTN,
Self::BV => Self::BVT,
Self::BW => Self::BWA,
Self::CF => Self::CAF,
Self::CA => Self::CAN,
Self::CC => Self::CCK,
Self::CH => Self::CHE,
Self::CL => Self::CHL,
Self::CN => Self::CHN,
Self::CI => Self::CIV,
Self::CM => Self::CMR,
Self::CD => Self::COD,
Self::CG => Self::COG,
Self::CK => Self::COK,
Self::CO => Self::COL,
Self::KM => Self::COM,
Self::CV => Self::CPV,
Self::CR => Self::CRI,
Self::CU => Self::CUB,
Self::CW => Self::CUW,
Self::CX => Self::CXR,
Self::KY => Self::CYM,
Self::CY => Self::CYP,
Self::CZ => Self::CZE,
Self::DE => Self::DEU,
Self::DJ => Self::DJI,
Self::DM => Self::DMA,
Self::DK => Self::DNK,
Self::DO => Self::DOM,
Self::DZ => Self::DZA,
Self::EC => Self::ECU,
Self::EG => Self::EGY,
Self::ER => Self::ERI,
Self::EH => Self::ESH,
Self::ES => Self::ESP,
Self::EE => Self::EST,
Self::ET => Self::ETH,
Self::FI => Self::FIN,
Self::FJ => Self::FJI,
Self::FK => Self::FLK,
Self::FR => Self::FRA,
Self::FO => Self::FRO,
Self::FM => Self::FSM,
Self::GA => Self::GAB,
Self::GB => Self::GBR,
Self::GE => Self::GEO,
Self::GG => Self::GGY,
Self::GH => Self::GHA,
Self::GI => Self::GIB,
Self::GN => Self::GIN,
Self::GP => Self::GLP,
Self::GM => Self::GMB,
Self::GW => Self::GNB,
Self::GQ => Self::GNQ,
Self::GR => Self::GRC,
Self::GD => Self::GRD,
Self::GL => Self::GRL,
Self::GT => Self::GTM,
Self::GF => Self::GUF,
Self::GU => Self::GUM,
Self::GY => Self::GUY,
Self::HK => Self::HKG,
Self::HM => Self::HMD,
Self::HN => Self::HND,
Self::HR => Self::HRV,
Self::HT => Self::HTI,
Self::HU => Self::HUN,
Self::ID => Self::IDN,
Self::IM => Self::IMN,
Self::IN => Self::IND,
Self::IO => Self::IOT,
Self::IE => Self::IRL,
Self::IR => Self::IRN,
Self::IQ => Self::IRQ,
Self::IS => Self::ISL,
Self::IL => Self::ISR,
Self::IT => Self::ITA,
Self::JM => Self::JAM,
Self::JE => Self::JEY,
Self::JO => Self::JOR,
Self::JP => Self::JPN,
Self::KZ => Self::KAZ,
Self::KE => Self::KEN,
Self::KG => Self::KGZ,
Self::KH => Self::KHM,
Self::KI => Self::KIR,
Self::KN => Self::KNA,
Self::KR => Self::KOR,
Self::KW => Self::KWT,
Self::LA => Self::LAO,
Self::LB => Self::LBN,
Self::LR => Self::LBR,
Self::LY => Self::LBY,
Self::LC => Self::LCA,
Self::LI => Self::LIE,
Self::LK => Self::LKA,
Self::LS => Self::LSO,
Self::LT => Self::LTU,
Self::LU => Self::LUX,
Self::LV => Self::LVA,
Self::MO => Self::MAC,
Self::MF => Self::MAF,
Self::MA => Self::MAR,
Self::MC => Self::MCO,
Self::MD => Self::MDA,
Self::MG => Self::MDG,
Self::MV => Self::MDV,
Self::MX => Self::MEX,
Self::MH => Self::MHL,
Self::MK => Self::MKD,
Self::ML => Self::MLI,
Self::MT => Self::MLT,
Self::MM => Self::MMR,
Self::ME => Self::MNE,
Self::MN => Self::MNG,
Self::MP => Self::MNP,
Self::MZ => Self::MOZ,
Self::MR => Self::MRT,
Self::MS => Self::MSR,
Self::MQ => Self::MTQ,
Self::MU => Self::MUS,
Self::MW => Self::MWI,
Self::MY => Self::MYS,
Self::YT => Self::MYT,
Self::NA => Self::NAM,
Self::NC => Self::NCL,
Self::NE => Self::NER,
Self::NF => Self::NFK,
Self::NG => Self::NGA,
Self::NI => Self::NIC,
Self::NU => Self::NIU,
Self::NL => Self::NLD,
Self::NO => Self::NOR,
Self::NP => Self::NPL,
Self::NR => Self::NRU,
Self::NZ => Self::NZL,
Self::OM => Self::OMN,
Self::PK => Self::PAK,
Self::PA => Self::PAN,
Self::PN => Self::PCN,
Self::PE => Self::PER,
Self::PH => Self::PHL,
Self::PW => Self::PLW,
Self::PG => Self::PNG,
Self::PL => Self::POL,
Self::PR => Self::PRI,
Self::KP => Self::PRK,
Self::PT => Self::PRT,
Self::PY => Self::PRY,
Self::PS => Self::PSE,
Self::PF => Self::PYF,
Self::QA => Self::QAT,
Self::RE => Self::REU,
Self::RO => Self::ROU,
Self::RU => Self::RUS,
Self::RW => Self::RWA,
Self::SA => Self::SAU,
Self::SD => Self::SDN,
Self::SN => Self::SEN,
Self::SG => Self::SGP,
Self::GS => Self::SGS,
Self::SH => Self::SHN,
Self::SJ => Self::SJM,
Self::SB => Self::SLB,
Self::SL => Self::SLE,
Self::SV => Self::SLV,
Self::SM => Self::SMR,
Self::SO => Self::SOM,
Self::PM => Self::SPM,
Self::RS => Self::SRB,
Self::SS => Self::SSD,
Self::ST => Self::STP,
Self::SR => Self::SUR,
Self::SK => Self::SVK,
Self::SI => Self::SVN,
Self::SE => Self::SWE,
Self::SZ => Self::SWZ,
Self::SX => Self::SXM,
Self::SC => Self::SYC,
Self::SY => Self::SYR,
Self::TC => Self::TCA,
Self::TD => Self::TCD,
Self::TG => Self::TGO,
Self::TH => Self::THA,
Self::TJ => Self::TJK,
Self::TK => Self::TKL,
Self::TM => Self::TKM,
Self::TL => Self::TLS,
Self::TO => Self::TON,
Self::TT => Self::TTO,
Self::TN => Self::TUN,
Self::TR => Self::TUR,
Self::TV => Self::TUV,
Self::TW => Self::TWN,
Self::TZ => Self::TZA,
Self::UG => Self::UGA,
Self::UA => Self::UKR,
Self::UM => Self::UMI,
Self::UY => Self::URY,
Self::US => Self::USA,
Self::UZ => Self::UZB,
Self::VA => Self::VAT,
Self::VC => Self::VCT,
Self::VE => Self::VEN,
Self::VG => Self::VGB,
Self::VI => Self::VIR,
Self::VN => Self::VNM,
Self::VU => Self::VUT,
Self::WF => Self::WLF,
Self::WS => Self::WSM,
Self::YE => Self::YEM,
Self::ZA => Self::ZAF,
Self::ZM => Self::ZMB,
Self::ZW => Self::ZWE,
_ => *self,
}
}
}
impl AsStr for CountryCode {
#[expect(clippy::too_many_lines, reason = "Data not logic")]
fn as_str(&self) -> &'static str {
match *self {
Self::AD => "AD",
Self::AE => "AE",
Self::AF => "AF",
Self::AG => "AG",
Self::AI => "AI",
Self::AL => "AL",
Self::AM => "AM",
Self::AO => "AO",
Self::AQ => "AQ",
Self::AR => "AR",
Self::AS => "AS",
Self::AT => "AT",
Self::AU => "AU",
Self::AW => "AW",
Self::AX => "AX",
Self::AZ => "AZ",
Self::BA => "BA",
Self::BB => "BB",
Self::BD => "BD",
Self::BE => "BE",
Self::BF => "BF",
Self::BG => "BG",
Self::BH => "BH",
Self::BI => "BI",
Self::BJ => "BJ",
Self::BL => "BL",
Self::BM => "BM",
Self::BN => "BN",
Self::BO => "BO",
Self::BQ => "BQ",
Self::BR => "BR",
Self::BS => "BS",
Self::BT => "BT",
Self::BV => "BV",
Self::BW => "BW",
Self::BY => "BY",
Self::BZ => "BZ",
Self::CA => "CA",
Self::CC => "CC",
Self::CD => "CD",
Self::CF => "CF",
Self::CG => "CG",
Self::CH => "CH",
Self::CI => "CI",
Self::CK => "CK",
Self::CL => "CL",
Self::CM => "CM",
Self::CN => "CN",
Self::CO => "CO",
Self::CR => "CR",
Self::CU => "CU",
Self::CV => "CV",
Self::CW => "CW",
Self::CX => "CX",
Self::CY => "CY",
Self::CZ => "CZ",
Self::DE => "DE",
Self::DJ => "DJ",
Self::DK => "DK",
Self::DM => "DM",
Self::DO => "DO",
Self::DZ => "DZ",
Self::EC => "EC",
Self::EE => "EE",
Self::EG => "EG",
Self::EH => "EH",
Self::ER => "ER",
Self::ES => "ES",
Self::ET => "ET",
Self::FI => "FI",
Self::FJ => "FJ",
Self::FK => "FK",
Self::FM => "FM",
Self::FO => "FO",
Self::FR => "FR",
Self::GA => "GA",
Self::GB => "GB",
Self::GD => "GD",
Self::GE => "GE",
Self::GF => "GF",
Self::GG => "GG",
Self::GH => "GH",
Self::GI => "GI",
Self::GL => "GL",
Self::GM => "GM",
Self::GN => "GN",
Self::GP => "GP",
Self::GQ => "GQ",
Self::GR => "GR",
Self::GS => "GS",
Self::GT => "GT",
Self::GU => "GU",
Self::GW => "GW",
Self::GY => "GY",
Self::HK => "HK",
Self::HM => "HM",
Self::HN => "HN",
Self::HR => "HR",
Self::HT => "HT",
Self::HU => "HU",
Self::ID => "ID",
Self::IE => "IE",
Self::IL => "IL",
Self::IM => "IM",
Self::IN => "IN",
Self::IO => "IO",
Self::IQ => "IQ",
Self::IR => "IR",
Self::IS => "IS",
Self::IT => "IT",
Self::JE => "JE",
Self::JM => "JM",
Self::JO => "JO",
Self::JP => "JP",
Self::KE => "KE",
Self::KG => "KG",
Self::KH => "KH",
Self::KI => "KI",
Self::KM => "KM",
Self::KN => "KN",
Self::KP => "KP",
Self::KR => "KR",
Self::KW => "KW",
Self::KY => "KY",
Self::KZ => "KZ",
Self::LA => "LA",
Self::LB => "LB",
Self::LC => "LC",
Self::LI => "LI",
Self::LK => "LK",
Self::LR => "LR",
Self::LS => "LS",
Self::LT => "LT",
Self::LU => "LU",
Self::LV => "LV",
Self::LY => "LY",
Self::MA => "MA",
Self::MC => "MC",
Self::MD => "MD",
Self::ME => "ME",
Self::MF => "MF",
Self::MG => "MG",
Self::MH => "MH",
Self::MK => "MK",
Self::ML => "ML",
Self::MM => "MM",
Self::MN => "MN",
Self::MO => "MO",
Self::MP => "MP",
Self::MQ => "MQ",
Self::MR => "MR",
Self::MS => "MS",
Self::MT => "MT",
Self::MU => "MU",
Self::MV => "MV",
Self::MW => "MW",
Self::MX => "MX",
Self::MY => "MY",
Self::MZ => "MZ",
Self::NA => "NA",
Self::NC => "NC",
Self::NE => "NE",
Self::NF => "NF",
Self::NG => "NG",
Self::NI => "NI",
Self::NL => "NL",
Self::NO => "NO",
Self::NP => "NP",
Self::NR => "NR",
Self::NU => "NU",
Self::NZ => "NZ",
Self::OM => "OM",
Self::PA => "PA",
Self::PE => "PE",
Self::PF => "PF",
Self::PG => "PG",
Self::PH => "PH",
Self::PK => "PK",
Self::PL => "PL",
Self::PM => "PM",
Self::PN => "PN",
Self::PR => "PR",
Self::PS => "PS",
Self::PT => "PT",
Self::PW => "PW",
Self::PY => "PY",
Self::QA => "QA",
Self::RE => "RE",
Self::RO => "RO",
Self::RS => "RS",
Self::RU => "RU",
Self::RW => "RW",
Self::SA => "SA",
Self::SB => "SB",
Self::SC => "SC",
Self::SD => "SD",
Self::SE => "SE",
Self::SG => "SG",
Self::SH => "SH",
Self::SI => "SI",
Self::SJ => "SJ",
Self::SK => "SK",
Self::SL => "SL",
Self::SM => "SM",
Self::SN => "SN",
Self::SO => "SO",
Self::SR => "SR",
Self::SS => "SS",
Self::ST => "ST",
Self::SV => "SV",
Self::SX => "SX",
Self::SY => "SY",
Self::SZ => "SZ",
Self::TC => "TC",
Self::TD => "TD",
Self::TF => "TF",
Self::TG => "TG",
Self::TH => "TH",
Self::TJ => "TJ",
Self::TK => "TK",
Self::TL => "TL",
Self::TM => "TM",
Self::TN => "TN",
Self::TO => "TO",
Self::TR => "TR",
Self::TT => "TT",
Self::TV => "TV",
Self::TW => "TW",
Self::TZ => "TZ",
Self::UA => "UA",
Self::UG => "UG",
Self::UM => "UM",
Self::US => "US",
Self::UY => "UY",
Self::UZ => "UZ",
Self::VA => "VA",
Self::VC => "VC",
Self::VE => "VE",
Self::VG => "VG",
Self::VI => "VI",
Self::VN => "VN",
Self::VU => "VU",
Self::WF => "WF",
Self::WS => "WS",
Self::YE => "YE",
Self::YT => "YT",
Self::ZA => "ZA",
Self::ZM => "ZM",
Self::ZW => "ZW",
Self::ABW => "ABW",
Self::AFG => "AFG",
Self::AGO => "AGO",
Self::AIA => "AIA",
Self::ALA => "ALA",
Self::ALB => "ALB",
Self::AND => "AND",
Self::ARE => "ARE",
Self::ARG => "ARG",
Self::ARM => "ARM",
Self::ASM => "ASM",
Self::ATA => "ATA",
Self::ATF => "ATF",
Self::ATG => "ATG",
Self::AUS => "AUS",
Self::AUT => "AUT",
Self::AZE => "AZE",
Self::BDI => "BDI",
Self::BEL => "BEL",
Self::BEN => "BEN",
Self::BES => "BES",
Self::BFA => "BFA",
Self::BGD => "BGD",
Self::BGR => "BGR",
Self::BHR => "BHR",
Self::BHS => "BHS",
Self::BIH => "BIH",
Self::BLM => "BLM",
Self::BLR => "BLR",
Self::BLZ => "BLZ",
Self::BMU => "BMU",
Self::BOL => "BOL",
Self::BRA => "BRA",
Self::BRB => "BRB",
Self::BRN => "BRN",
Self::BTN => "BTN",
Self::BVT => "BVT",
Self::BWA => "BWA",
Self::CAF => "CAF",
Self::CAN => "CAN",
Self::CCK => "CCK",
Self::CHE => "CHE",
Self::CHL => "CHL",
Self::CHN => "CHN",
Self::CIV => "CIV",
Self::CMR => "CMR",
Self::COD => "COD",
Self::COG => "COG",
Self::COK => "COK",
Self::COL => "COL",
Self::COM => "COM",
Self::CPV => "CPV",
Self::CRI => "CRI",
Self::CUB => "CUB",
Self::CUW => "CUW",
Self::CXR => "CXR",
Self::CYM => "CYM",
Self::CYP => "CYP",
Self::CZE => "CZE",
Self::DEU => "DEU",
Self::DJI => "DJI",
Self::DMA => "DMA",
Self::DNK => "DNK",
Self::DOM => "DOM",
Self::DZA => "DZA",
Self::ECU => "ECU",
Self::EGY => "EGY",
Self::ERI => "ERI",
Self::ESH => "ESH",
Self::ESP => "ESP",
Self::EST => "EST",
Self::ETH => "ETH",
Self::FIN => "FIN",
Self::FJI => "FJI",
Self::FLK => "FLK",
Self::FRA => "FRA",
Self::FRO => "FRO",
Self::FSM => "FSM",
Self::GAB => "GAB",
Self::GBR => "GBR",
Self::GEO => "GEO",
Self::GGY => "GGY",
Self::GHA => "GHA",
Self::GIB => "GIB",
Self::GIN => "GIN",
Self::GLP => "GLP",
Self::GMB => "GMB",
Self::GNB => "GNB",
Self::GNQ => "GNQ",
Self::GRC => "GRC",
Self::GRD => "GRD",
Self::GRL => "GRL",
Self::GTM => "GTM",
Self::GUF => "GUF",
Self::GUM => "GUM",
Self::GUY => "GUY",
Self::HKG => "HKG",
Self::HMD => "HMD",
Self::HND => "HND",
Self::HRV => "HRV",
Self::HTI => "HTI",
Self::HUN => "HUN",
Self::IDN => "IDN",
Self::IMN => "IMN",
Self::IND => "IND",
Self::IOT => "IOT",
Self::IRL => "IRL",
Self::IRN => "IRN",
Self::IRQ => "IRQ",
Self::ISL => "ISL",
Self::ISR => "ISR",
Self::ITA => "ITA",
Self::JAM => "JAM",
Self::JEY => "JEY",
Self::JOR => "JOR",
Self::JPN => "JPN",
Self::KAZ => "KAZ",
Self::KEN => "KEN",
Self::KGZ => "KGZ",
Self::KHM => "KHM",
Self::KIR => "KIR",
Self::KNA => "KNA",
Self::KOR => "KOR",
Self::KWT => "KWT",
Self::LAO => "LAO",
Self::LBN => "LBN",
Self::LBR => "LBR",
Self::LBY => "LBY",
Self::LCA => "LCA",
Self::LIE => "LIE",
Self::LKA => "LKA",
Self::LSO => "LSO",
Self::LTU => "LTU",
Self::LUX => "LUX",
Self::LVA => "LVA",
Self::MAC => "MAC",
Self::MAF => "MAF",
Self::MAR => "MAR",
Self::MCO => "MCO",
Self::MDA => "MDA",
Self::MDG => "MDG",
Self::MDV => "MDV",
Self::MEX => "MEX",
Self::MHL => "MHL",
Self::MKD => "MKD",
Self::MLI => "MLI",
Self::MLT => "MLT",
Self::MMR => "MMR",
Self::MNE => "MNE",
Self::MNG => "MNG",
Self::MNP => "MNP",
Self::MOZ => "MOZ",
Self::MRT => "MRT",
Self::MSR => "MSR",
Self::MTQ => "MTQ",
Self::MUS => "MUS",
Self::MWI => "MWI",
Self::MYS => "MYS",
Self::MYT => "MYT",
Self::NAM => "NAM",
Self::NCL => "NCL",
Self::NER => "NER",
Self::NFK => "NFK",
Self::NGA => "NGA",
Self::NIC => "NIC",
Self::NIU => "NIU",
Self::NLD => "NLD",
Self::NOR => "NOR",
Self::NPL => "NPL",
Self::NRU => "NRU",
Self::NZL => "NZL",
Self::OMN => "OMN",
Self::PAK => "PAK",
Self::PAN => "PAN",
Self::PCN => "PCN",
Self::PER => "PER",
Self::PHL => "PHL",
Self::PLW => "PLW",
Self::PNG => "PNG",
Self::POL => "POL",
Self::PRI => "PRI",
Self::PRK => "PRK",
Self::PRT => "PRT",
Self::PRY => "PRY",
Self::PSE => "PSE",
Self::PYF => "PYF",
Self::QAT => "QAT",
Self::REU => "REU",
Self::ROU => "ROU",
Self::RUS => "RUS",
Self::RWA => "RWA",
Self::SAU => "SAU",
Self::SDN => "SDN",
Self::SEN => "SEN",
Self::SGP => "SGP",
Self::SGS => "SGS",
Self::SHN => "SHN",
Self::SJM => "SJM",
Self::SLB => "SLB",
Self::SLE => "SLE",
Self::SLV => "SLV",
Self::SMR => "SMR",
Self::SOM => "SOM",
Self::SPM => "SPM",
Self::SRB => "SRB",
Self::SSD => "SSD",
Self::STP => "STP",
Self::SUR => "SUR",
Self::SVK => "SVK",
Self::SVN => "SVN",
Self::SWE => "SWE",
Self::SWZ => "SWZ",
Self::SXM => "SXM",
Self::SYC => "SYC",
Self::SYR => "SYR",
Self::TCA => "TCA",
Self::TCD => "TCD",
Self::TGO => "TGO",
Self::THA => "THA",
Self::TJK => "TJK",
Self::TKL => "TKL",
Self::TKM => "TKM",
Self::TLS => "TLS",
Self::TON => "TON",
Self::TTO => "TTO",
Self::TUN => "TUN",
Self::TUR => "TUR",
Self::TUV => "TUV",
Self::TWN => "TWN",
Self::TZA => "TZA",
Self::UGA => "UGA",
Self::UKR => "UKR",
Self::UMI => "UMI",
Self::URY => "URY",
Self::USA => "USA",
Self::UZB => "UZB",
Self::VAT => "VAT",
Self::VCT => "VCT",
Self::VEN => "VEN",
Self::VGB => "VGB",
Self::VIR => "VIR",
Self::VNM => "VNM",
Self::VUT => "VUT",
Self::WLF => "WLF",
Self::WSM => "WSM",
Self::YEM => "YEM",
Self::ZAF => "ZAF",
Self::ZMB => "ZMB",
Self::ZWE => "ZWE",
}
}
}
impl Display for CountryCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl From<CountryCode> for u16 {
fn from(code: CountryCode) -> Self {
#[expect(clippy::arithmetic_side_effects, reason = "Range is controlled")]
if code as Self > 1_000 {
code as Self - 1_000
} else {
code as Self
}
}
}
impl From<CountryCode> for String {
fn from(code: CountryCode) -> Self {
code.to_string()
}
}
impl FromStr for CountryCode {
type Err = String;
#[expect(clippy::too_many_lines, reason = "Data not logic")]
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_uppercase().as_str() {
"AD" => Ok(Self::AD),
"AE" => Ok(Self::AE),
"AF" => Ok(Self::AF),
"AG" => Ok(Self::AG),
"AI" => Ok(Self::AI),
"AL" => Ok(Self::AL),
"AM" => Ok(Self::AM),
"AO" => Ok(Self::AO),
"AQ" => Ok(Self::AQ),
"AR" => Ok(Self::AR),
"AS" => Ok(Self::AS),
"AT" => Ok(Self::AT),
"AU" => Ok(Self::AU),
"AW" => Ok(Self::AW),
"AX" => Ok(Self::AX),
"AZ" => Ok(Self::AZ),
"BA" => Ok(Self::BA),
"BB" => Ok(Self::BB),
"BD" => Ok(Self::BD),
"BE" => Ok(Self::BE),
"BF" => Ok(Self::BF),
"BG" => Ok(Self::BG),
"BH" => Ok(Self::BH),
"BI" => Ok(Self::BI),
"BJ" => Ok(Self::BJ),
"BL" => Ok(Self::BL),
"BM" => Ok(Self::BM),
"BN" => Ok(Self::BN),
"BO" => Ok(Self::BO),
"BQ" => Ok(Self::BQ),
"BR" => Ok(Self::BR),
"BS" => Ok(Self::BS),
"BT" => Ok(Self::BT),
"BV" => Ok(Self::BV),
"BW" => Ok(Self::BW),
"BY" => Ok(Self::BY),
"BZ" => Ok(Self::BZ),
"CA" => Ok(Self::CA),
"CC" => Ok(Self::CC),
"CD" => Ok(Self::CD),
"CF" => Ok(Self::CF),
"CG" => Ok(Self::CG),
"CH" => Ok(Self::CH),
"CI" => Ok(Self::CI),
"CK" => Ok(Self::CK),
"CL" => Ok(Self::CL),
"CM" => Ok(Self::CM),
"CN" => Ok(Self::CN),
"CO" => Ok(Self::CO),
"CR" => Ok(Self::CR),
"CU" => Ok(Self::CU),
"CV" => Ok(Self::CV),
"CW" => Ok(Self::CW),
"CX" => Ok(Self::CX),
"CY" => Ok(Self::CY),
"CZ" => Ok(Self::CZ),
"DE" => Ok(Self::DE),
"DJ" => Ok(Self::DJ),
"DK" => Ok(Self::DK),
"DM" => Ok(Self::DM),
"DO" => Ok(Self::DO),
"DZ" => Ok(Self::DZ),
"EC" => Ok(Self::EC),
"EE" => Ok(Self::EE),
"EG" => Ok(Self::EG),
"EH" => Ok(Self::EH),
"ER" => Ok(Self::ER),
"ES" => Ok(Self::ES),
"ET" => Ok(Self::ET),
"FI" => Ok(Self::FI),
"FJ" => Ok(Self::FJ),
"FK" => Ok(Self::FK),
"FM" => Ok(Self::FM),
"FO" => Ok(Self::FO),
"FR" => Ok(Self::FR),
"GA" => Ok(Self::GA),
"GB" => Ok(Self::GB),
"GD" => Ok(Self::GD),
"GE" => Ok(Self::GE),
"GF" => Ok(Self::GF),
"GG" => Ok(Self::GG),
"GH" => Ok(Self::GH),
"GI" => Ok(Self::GI),
"GL" => Ok(Self::GL),
"GM" => Ok(Self::GM),
"GN" => Ok(Self::GN),
"GP" => Ok(Self::GP),
"GQ" => Ok(Self::GQ),
"GR" => Ok(Self::GR),
"GS" => Ok(Self::GS),
"GT" => Ok(Self::GT),
"GU" => Ok(Self::GU),
"GW" => Ok(Self::GW),
"GY" => Ok(Self::GY),
"HK" => Ok(Self::HK),
"HM" => Ok(Self::HM),
"HN" => Ok(Self::HN),
"HR" => Ok(Self::HR),
"HT" => Ok(Self::HT),
"HU" => Ok(Self::HU),
"ID" => Ok(Self::ID),
"IE" => Ok(Self::IE),
"IL" => Ok(Self::IL),
"IM" => Ok(Self::IM),
"IN" => Ok(Self::IN),
"IO" => Ok(Self::IO),
"IQ" => Ok(Self::IQ),
"IR" => Ok(Self::IR),
"IS" => Ok(Self::IS),
"IT" => Ok(Self::IT),
"JE" => Ok(Self::JE),
"JM" => Ok(Self::JM),
"JO" => Ok(Self::JO),
"JP" => Ok(Self::JP),
"KE" => Ok(Self::KE),
"KG" => Ok(Self::KG),
"KH" => Ok(Self::KH),
"KI" => Ok(Self::KI),
"KM" => Ok(Self::KM),
"KN" => Ok(Self::KN),
"KP" => Ok(Self::KP),
"KR" => Ok(Self::KR),
"KW" => Ok(Self::KW),
"KY" => Ok(Self::KY),
"KZ" => Ok(Self::KZ),
"LA" => Ok(Self::LA),
"LB" => Ok(Self::LB),
"LC" => Ok(Self::LC),
"LI" => Ok(Self::LI),
"LK" => Ok(Self::LK),
"LR" => Ok(Self::LR),
"LS" => Ok(Self::LS),
"LT" => Ok(Self::LT),
"LU" => Ok(Self::LU),
"LV" => Ok(Self::LV),
"LY" => Ok(Self::LY),
"MA" => Ok(Self::MA),
"MC" => Ok(Self::MC),
"MD" => Ok(Self::MD),
"ME" => Ok(Self::ME),
"MF" => Ok(Self::MF),
"MG" => Ok(Self::MG),
"MH" => Ok(Self::MH),
"MK" => Ok(Self::MK),
"ML" => Ok(Self::ML),
"MM" => Ok(Self::MM),
"MN" => Ok(Self::MN),
"MO" => Ok(Self::MO),
"MP" => Ok(Self::MP),
"MQ" => Ok(Self::MQ),
"MR" => Ok(Self::MR),
"MS" => Ok(Self::MS),
"MT" => Ok(Self::MT),
"MU" => Ok(Self::MU),
"MV" => Ok(Self::MV),
"MW" => Ok(Self::MW),
"MX" => Ok(Self::MX),
"MY" => Ok(Self::MY),
"MZ" => Ok(Self::MZ),
"NA" => Ok(Self::NA),
"NC" => Ok(Self::NC),
"NE" => Ok(Self::NE),
"NF" => Ok(Self::NF),
"NG" => Ok(Self::NG),
"NI" => Ok(Self::NI),
"NL" => Ok(Self::NL),
"NO" => Ok(Self::NO),
"NP" => Ok(Self::NP),
"NR" => Ok(Self::NR),
"NU" => Ok(Self::NU),
"NZ" => Ok(Self::NZ),
"OM" => Ok(Self::OM),
"PA" => Ok(Self::PA),
"PE" => Ok(Self::PE),
"PF" => Ok(Self::PF),
"PG" => Ok(Self::PG),
"PH" => Ok(Self::PH),
"PK" => Ok(Self::PK),
"PL" => Ok(Self::PL),
"PM" => Ok(Self::PM),
"PN" => Ok(Self::PN),
"PR" => Ok(Self::PR),
"PS" => Ok(Self::PS),
"PT" => Ok(Self::PT),
"PW" => Ok(Self::PW),
"PY" => Ok(Self::PY),
"QA" => Ok(Self::QA),
"RE" => Ok(Self::RE),
"RO" => Ok(Self::RO),
"RS" => Ok(Self::RS),
"RU" => Ok(Self::RU),
"RW" => Ok(Self::RW),
"SA" => Ok(Self::SA),
"SB" => Ok(Self::SB),
"SC" => Ok(Self::SC),
"SD" => Ok(Self::SD),
"SE" => Ok(Self::SE),
"SG" => Ok(Self::SG),
"SH" => Ok(Self::SH),
"SI" => Ok(Self::SI),
"SJ" => Ok(Self::SJ),
"SK" => Ok(Self::SK),
"SL" => Ok(Self::SL),
"SM" => Ok(Self::SM),
"SN" => Ok(Self::SN),
"SO" => Ok(Self::SO),
"SR" => Ok(Self::SR),
"SS" => Ok(Self::SS),
"ST" => Ok(Self::ST),
"SV" => Ok(Self::SV),
"SX" => Ok(Self::SX),
"SY" => Ok(Self::SY),
"SZ" => Ok(Self::SZ),
"TC" => Ok(Self::TC),
"TD" => Ok(Self::TD),
"TF" => Ok(Self::TF),
"TG" => Ok(Self::TG),
"TH" => Ok(Self::TH),
"TJ" => Ok(Self::TJ),
"TK" => Ok(Self::TK),
"TL" => Ok(Self::TL),
"TM" => Ok(Self::TM),
"TN" => Ok(Self::TN),
"TO" => Ok(Self::TO),
"TR" => Ok(Self::TR),
"TT" => Ok(Self::TT),
"TV" => Ok(Self::TV),
"TW" => Ok(Self::TW),
"TZ" => Ok(Self::TZ),
"UA" => Ok(Self::UA),
"UG" => Ok(Self::UG),
"UM" => Ok(Self::UM),
"US" => Ok(Self::US),
"UY" => Ok(Self::UY),
"UZ" => Ok(Self::UZ),
"VA" => Ok(Self::VA),
"VC" => Ok(Self::VC),
"VE" => Ok(Self::VE),
"VG" => Ok(Self::VG),
"VI" => Ok(Self::VI),
"VN" => Ok(Self::VN),
"VU" => Ok(Self::VU),
"WF" => Ok(Self::WF),
"WS" => Ok(Self::WS),
"YE" => Ok(Self::YE),
"YT" => Ok(Self::YT),
"ZA" => Ok(Self::ZA),
"ZM" => Ok(Self::ZM),
"ZW" => Ok(Self::ZW),
"ABW" => Ok(Self::ABW),
"AFG" => Ok(Self::AFG),
"AGO" => Ok(Self::AGO),
"AIA" => Ok(Self::AIA),
"ALA" => Ok(Self::ALA),
"ALB" => Ok(Self::ALB),
"AND" => Ok(Self::AND),
"ARE" => Ok(Self::ARE),
"ARG" => Ok(Self::ARG),
"ARM" => Ok(Self::ARM),
"ASM" => Ok(Self::ASM),
"ATA" => Ok(Self::ATA),
"ATF" => Ok(Self::ATF),
"ATG" => Ok(Self::ATG),
"AUS" => Ok(Self::AUS),
"AUT" => Ok(Self::AUT),
"AZE" => Ok(Self::AZE),
"BDI" => Ok(Self::BDI),
"BEL" => Ok(Self::BEL),
"BEN" => Ok(Self::BEN),
"BES" => Ok(Self::BES),
"BFA" => Ok(Self::BFA),
"BGD" => Ok(Self::BGD),
"BGR" => Ok(Self::BGR),
"BHR" => Ok(Self::BHR),
"BHS" => Ok(Self::BHS),
"BIH" => Ok(Self::BIH),
"BLM" => Ok(Self::BLM),
"BLR" => Ok(Self::BLR),
"BLZ" => Ok(Self::BLZ),
"BMU" => Ok(Self::BMU),
"BOL" => Ok(Self::BOL),
"BRA" => Ok(Self::BRA),
"BRB" => Ok(Self::BRB),
"BRN" => Ok(Self::BRN),
"BTN" => Ok(Self::BTN),
"BVT" => Ok(Self::BVT),
"BWA" => Ok(Self::BWA),
"CAF" => Ok(Self::CAF),
"CAN" => Ok(Self::CAN),
"CCK" => Ok(Self::CCK),
"CHE" => Ok(Self::CHE),
"CHL" => Ok(Self::CHL),
"CHN" => Ok(Self::CHN),
"CIV" => Ok(Self::CIV),
"CMR" => Ok(Self::CMR),
"COD" => Ok(Self::COD),
"COG" => Ok(Self::COG),
"COK" => Ok(Self::COK),
"COL" => Ok(Self::COL),
"COM" => Ok(Self::COM),
"CPV" => Ok(Self::CPV),
"CRI" => Ok(Self::CRI),
"CUB" => Ok(Self::CUB),
"CUW" => Ok(Self::CUW),
"CXR" => Ok(Self::CXR),
"CYM" => Ok(Self::CYM),
"CYP" => Ok(Self::CYP),
"CZE" => Ok(Self::CZE),
"DEU" => Ok(Self::DEU),
"DJI" => Ok(Self::DJI),
"DMA" => Ok(Self::DMA),
"DNK" => Ok(Self::DNK),
"DOM" => Ok(Self::DOM),
"DZA" => Ok(Self::DZA),
"ECU" => Ok(Self::ECU),
"EGY" => Ok(Self::EGY),
"ERI" => Ok(Self::ERI),
"ESH" => Ok(Self::ESH),
"ESP" => Ok(Self::ESP),
"EST" => Ok(Self::EST),
"ETH" => Ok(Self::ETH),
"FIN" => Ok(Self::FIN),
"FJI" => Ok(Self::FJI),
"FLK" => Ok(Self::FLK),
"FRA" => Ok(Self::FRA),
"FRO" => Ok(Self::FRO),
"FSM" => Ok(Self::FSM),
"GAB" => Ok(Self::GAB),
"GBR" => Ok(Self::GBR),
"GEO" => Ok(Self::GEO),
"GGY" => Ok(Self::GGY),
"GHA" => Ok(Self::GHA),
"GIB" => Ok(Self::GIB),
"GIN" => Ok(Self::GIN),
"GLP" => Ok(Self::GLP),
"GMB" => Ok(Self::GMB),
"GNB" => Ok(Self::GNB),
"GNQ" => Ok(Self::GNQ),
"GRC" => Ok(Self::GRC),
"GRD" => Ok(Self::GRD),
"GRL" => Ok(Self::GRL),
"GTM" => Ok(Self::GTM),
"GUF" => Ok(Self::GUF),
"GUM" => Ok(Self::GUM),
"GUY" => Ok(Self::GUY),
"HKG" => Ok(Self::HKG),
"HMD" => Ok(Self::HMD),
"HND" => Ok(Self::HND),
"HRV" => Ok(Self::HRV),
"HTI" => Ok(Self::HTI),
"HUN" => Ok(Self::HUN),
"IDN" => Ok(Self::IDN),
"IMN" => Ok(Self::IMN),
"IND" => Ok(Self::IND),
"IOT" => Ok(Self::IOT),
"IRL" => Ok(Self::IRL),
"IRN" => Ok(Self::IRN),
"IRQ" => Ok(Self::IRQ),
"ISL" => Ok(Self::ISL),
"ISR" => Ok(Self::ISR),
"ITA" => Ok(Self::ITA),
"JAM" => Ok(Self::JAM),
"JEY" => Ok(Self::JEY),
"JOR" => Ok(Self::JOR),
"JPN" => Ok(Self::JPN),
"KAZ" => Ok(Self::KAZ),
"KEN" => Ok(Self::KEN),
"KGZ" => Ok(Self::KGZ),
"KHM" => Ok(Self::KHM),
"KIR" => Ok(Self::KIR),
"KNA" => Ok(Self::KNA),
"KOR" => Ok(Self::KOR),
"KWT" => Ok(Self::KWT),
"LAO" => Ok(Self::LAO),
"LBN" => Ok(Self::LBN),
"LBR" => Ok(Self::LBR),
"LBY" => Ok(Self::LBY),
"LCA" => Ok(Self::LCA),
"LIE" => Ok(Self::LIE),
"LKA" => Ok(Self::LKA),
"LSO" => Ok(Self::LSO),
"LTU" => Ok(Self::LTU),
"LUX" => Ok(Self::LUX),
"LVA" => Ok(Self::LVA),
"MAC" => Ok(Self::MAC),
"MAF" => Ok(Self::MAF),
"MAR" => Ok(Self::MAR),
"MCO" => Ok(Self::MCO),
"MDA" => Ok(Self::MDA),
"MDG" => Ok(Self::MDG),
"MDV" => Ok(Self::MDV),
"MEX" => Ok(Self::MEX),
"MHL" => Ok(Self::MHL),
"MKD" => Ok(Self::MKD),
"MLI" => Ok(Self::MLI),
"MLT" => Ok(Self::MLT),
"MMR" => Ok(Self::MMR),
"MNE" => Ok(Self::MNE),
"MNG" => Ok(Self::MNG),
"MNP" => Ok(Self::MNP),
"MOZ" => Ok(Self::MOZ),
"MRT" => Ok(Self::MRT),
"MSR" => Ok(Self::MSR),
"MTQ" => Ok(Self::MTQ),
"MUS" => Ok(Self::MUS),
"MWI" => Ok(Self::MWI),
"MYS" => Ok(Self::MYS),
"MYT" => Ok(Self::MYT),
"NAM" => Ok(Self::NAM),
"NCL" => Ok(Self::NCL),
"NER" => Ok(Self::NER),
"NFK" => Ok(Self::NFK),
"NGA" => Ok(Self::NGA),
"NIC" => Ok(Self::NIC),
"NIU" => Ok(Self::NIU),
"NLD" => Ok(Self::NLD),
"NOR" => Ok(Self::NOR),
"NPL" => Ok(Self::NPL),
"NRU" => Ok(Self::NRU),
"NZL" => Ok(Self::NZL),
"OMN" => Ok(Self::OMN),
"PAK" => Ok(Self::PAK),
"PAN" => Ok(Self::PAN),
"PCN" => Ok(Self::PCN),
"PER" => Ok(Self::PER),
"PHL" => Ok(Self::PHL),
"PLW" => Ok(Self::PLW),
"PNG" => Ok(Self::PNG),
"POL" => Ok(Self::POL),
"PRI" => Ok(Self::PRI),
"PRK" => Ok(Self::PRK),
"PRT" => Ok(Self::PRT),
"PRY" => Ok(Self::PRY),
"PSE" => Ok(Self::PSE),
"PYF" => Ok(Self::PYF),
"QAT" => Ok(Self::QAT),
"REU" => Ok(Self::REU),
"ROU" => Ok(Self::ROU),
"RUS" => Ok(Self::RUS),
"RWA" => Ok(Self::RWA),
"SAU" => Ok(Self::SAU),
"SDN" => Ok(Self::SDN),
"SEN" => Ok(Self::SEN),
"SGP" => Ok(Self::SGP),
"SGS" => Ok(Self::SGS),
"SHN" => Ok(Self::SHN),
"SJM" => Ok(Self::SJM),
"SLB" => Ok(Self::SLB),
"SLE" => Ok(Self::SLE),
"SLV" => Ok(Self::SLV),
"SMR" => Ok(Self::SMR),
"SOM" => Ok(Self::SOM),
"SPM" => Ok(Self::SPM),
"SRB" => Ok(Self::SRB),
"SSD" => Ok(Self::SSD),
"STP" => Ok(Self::STP),
"SUR" => Ok(Self::SUR),
"SVK" => Ok(Self::SVK),
"SVN" => Ok(Self::SVN),
"SWE" => Ok(Self::SWE),
"SWZ" => Ok(Self::SWZ),
"SXM" => Ok(Self::SXM),
"SYC" => Ok(Self::SYC),
"SYR" => Ok(Self::SYR),
"TCA" => Ok(Self::TCA),
"TCD" => Ok(Self::TCD),
"TGO" => Ok(Self::TGO),
"THA" => Ok(Self::THA),
"TJK" => Ok(Self::TJK),
"TKL" => Ok(Self::TKL),
"TKM" => Ok(Self::TKM),
"TLS" => Ok(Self::TLS),
"TON" => Ok(Self::TON),
"TTO" => Ok(Self::TTO),
"TUN" => Ok(Self::TUN),
"TUR" => Ok(Self::TUR),
"TUV" => Ok(Self::TUV),
"TWN" => Ok(Self::TWN),
"TZA" => Ok(Self::TZA),
"UGA" => Ok(Self::UGA),
"UKR" => Ok(Self::UKR),
"UMI" => Ok(Self::UMI),
"URY" => Ok(Self::URY),
"USA" => Ok(Self::USA),
"UZB" => Ok(Self::UZB),
"VAT" => Ok(Self::VAT),
"VCT" => Ok(Self::VCT),
"VEN" => Ok(Self::VEN),
"VGB" => Ok(Self::VGB),
"VIR" => Ok(Self::VIR),
"VNM" => Ok(Self::VNM),
"VUT" => Ok(Self::VUT),
"WLF" => Ok(Self::WLF),
"WSM" => Ok(Self::WSM),
"YEM" => Ok(Self::YEM),
"ZAF" => Ok(Self::ZAF),
"ZMB" => Ok(Self::ZMB),
"ZWE" => Ok(Self::ZWE),
_ => Err(format!("Invalid CountryCode: {s}")),
}
}
}
#[expect(clippy::zero_prefixed_literal, reason = "Zeroes aid readability here")]
impl TryFrom<u16> for CountryCode {
type Error = String;
#[expect(clippy::too_many_lines, reason = "Data not logic")]
fn try_from(value: u16) -> Result<Self, Self::Error> {
match value {
004 => Ok(Self::AF),
008 => Ok(Self::AL),
010 => Ok(Self::AQ),
012 => Ok(Self::DZ),
016 => Ok(Self::AS),
020 => Ok(Self::AD),
024 => Ok(Self::AO),
028 => Ok(Self::AG),
031 => Ok(Self::AZ),
032 => Ok(Self::AR),
036 => Ok(Self::AU),
040 => Ok(Self::AT),
044 => Ok(Self::BS),
048 => Ok(Self::BH),
050 => Ok(Self::BD),
051 => Ok(Self::AM),
052 => Ok(Self::BB),
056 => Ok(Self::BE),
060 => Ok(Self::BM),
064 => Ok(Self::BT),
068 => Ok(Self::BO),
070 => Ok(Self::BA),
072 => Ok(Self::BW),
074 => Ok(Self::BV),
076 => Ok(Self::BR),
084 => Ok(Self::BZ),
086 => Ok(Self::IO),
090 => Ok(Self::SB),
092 => Ok(Self::VG),
096 => Ok(Self::BN),
100 => Ok(Self::BG),
104 => Ok(Self::MM),
108 => Ok(Self::BI),
112 => Ok(Self::BY),
116 => Ok(Self::KH),
120 => Ok(Self::CM),
124 => Ok(Self::CA),
132 => Ok(Self::CV),
136 => Ok(Self::KY),
140 => Ok(Self::CF),
144 => Ok(Self::LK),
148 => Ok(Self::TD),
152 => Ok(Self::CL),
156 => Ok(Self::CN),
158 => Ok(Self::TW),
162 => Ok(Self::CX),
166 => Ok(Self::CC),
170 => Ok(Self::CO),
174 => Ok(Self::KM),
175 => Ok(Self::YT),
178 => Ok(Self::CG),
180 => Ok(Self::CD),
184 => Ok(Self::CK),
188 => Ok(Self::CR),
191 => Ok(Self::HR),
192 => Ok(Self::CU),
196 => Ok(Self::CY),
203 => Ok(Self::CZ),
204 => Ok(Self::BJ),
208 => Ok(Self::DK),
212 => Ok(Self::DM),
214 => Ok(Self::DO),
218 => Ok(Self::EC),
222 => Ok(Self::SV),
226 => Ok(Self::GQ),
231 => Ok(Self::ET),
232 => Ok(Self::ER),
233 => Ok(Self::EE),
234 => Ok(Self::FO),
238 => Ok(Self::FK),
239 => Ok(Self::GS),
242 => Ok(Self::FJ),
246 => Ok(Self::FI),
248 => Ok(Self::AX),
250 => Ok(Self::FR),
254 => Ok(Self::GF),
258 => Ok(Self::PF),
260 => Ok(Self::TF),
262 => Ok(Self::DJ),
266 => Ok(Self::GA),
268 => Ok(Self::GE),
270 => Ok(Self::GM),
275 => Ok(Self::PS),
276 => Ok(Self::DE),
288 => Ok(Self::GH),
292 => Ok(Self::GI),
296 => Ok(Self::KI),
300 => Ok(Self::GR),
304 => Ok(Self::GL),
308 => Ok(Self::GD),
312 => Ok(Self::GP),
316 => Ok(Self::GU),
320 => Ok(Self::GT),
324 => Ok(Self::GN),
328 => Ok(Self::GY),
332 => Ok(Self::HT),
334 => Ok(Self::HM),
336 => Ok(Self::VA),
340 => Ok(Self::HN),
344 => Ok(Self::HK),
348 => Ok(Self::HU),
352 => Ok(Self::IS),
356 => Ok(Self::IN),
360 => Ok(Self::ID),
364 => Ok(Self::IR),
368 => Ok(Self::IQ),
372 => Ok(Self::IE),
376 => Ok(Self::IL),
380 => Ok(Self::IT),
384 => Ok(Self::CI),
388 => Ok(Self::JM),
392 => Ok(Self::JP),
398 => Ok(Self::KZ),
400 => Ok(Self::JO),
404 => Ok(Self::KE),
408 => Ok(Self::KP),
410 => Ok(Self::KR),
414 => Ok(Self::KW),
417 => Ok(Self::KG),
418 => Ok(Self::LA),
422 => Ok(Self::LB),
426 => Ok(Self::LS),
428 => Ok(Self::LV),
430 => Ok(Self::LR),
434 => Ok(Self::LY),
438 => Ok(Self::LI),
440 => Ok(Self::LT),
442 => Ok(Self::LU),
446 => Ok(Self::MO),
450 => Ok(Self::MG),
454 => Ok(Self::MW),
458 => Ok(Self::MY),
462 => Ok(Self::MV),
466 => Ok(Self::ML),
470 => Ok(Self::MT),
474 => Ok(Self::MQ),
478 => Ok(Self::MR),
480 => Ok(Self::MU),
484 => Ok(Self::MX),
492 => Ok(Self::MC),
496 => Ok(Self::MN),
498 => Ok(Self::MD),
499 => Ok(Self::ME),
500 => Ok(Self::MS),
504 => Ok(Self::MA),
508 => Ok(Self::MZ),
512 => Ok(Self::OM),
516 => Ok(Self::NA),
520 => Ok(Self::NR),
524 => Ok(Self::NP),
528 => Ok(Self::NL),
531 => Ok(Self::CW),
533 => Ok(Self::AW),
534 => Ok(Self::SX),
535 => Ok(Self::BQ),
540 => Ok(Self::NC),
548 => Ok(Self::VU),
554 => Ok(Self::NZ),
558 => Ok(Self::NI),
562 => Ok(Self::NE),
566 => Ok(Self::NG),
570 => Ok(Self::NU),
574 => Ok(Self::NF),
578 => Ok(Self::NO),
580 => Ok(Self::MP),
581 => Ok(Self::UM),
583 => Ok(Self::FM),
584 => Ok(Self::MH),
585 => Ok(Self::PW),
586 => Ok(Self::PK),
591 => Ok(Self::PA),
598 => Ok(Self::PG),
600 => Ok(Self::PY),
604 => Ok(Self::PE),
608 => Ok(Self::PH),
612 => Ok(Self::PN),
616 => Ok(Self::PL),
620 => Ok(Self::PT),
624 => Ok(Self::GW),
626 => Ok(Self::TL),
630 => Ok(Self::PR),
634 => Ok(Self::QA),
638 => Ok(Self::RE),
642 => Ok(Self::RO),
643 => Ok(Self::RU),
646 => Ok(Self::RW),
652 => Ok(Self::BL),
654 => Ok(Self::SH),
659 => Ok(Self::KN),
660 => Ok(Self::AI),
662 => Ok(Self::LC),
663 => Ok(Self::MF),
666 => Ok(Self::PM),
670 => Ok(Self::VC),
674 => Ok(Self::SM),
678 => Ok(Self::ST),
682 => Ok(Self::SA),
686 => Ok(Self::SN),
688 => Ok(Self::RS),
690 => Ok(Self::SC),
694 => Ok(Self::SL),
702 => Ok(Self::SG),
703 => Ok(Self::SK),
704 => Ok(Self::VN),
705 => Ok(Self::SI),
706 => Ok(Self::SO),
710 => Ok(Self::ZA),
716 => Ok(Self::ZW),
724 => Ok(Self::ES),
728 => Ok(Self::SS),
729 => Ok(Self::SD),
732 => Ok(Self::EH),
740 => Ok(Self::SR),
744 => Ok(Self::SJ),
748 => Ok(Self::SZ),
752 => Ok(Self::SE),
756 => Ok(Self::CH),
760 => Ok(Self::SY),
762 => Ok(Self::TJ),
764 => Ok(Self::TH),
768 => Ok(Self::TG),
772 => Ok(Self::TK),
776 => Ok(Self::TO),
780 => Ok(Self::TT),
784 => Ok(Self::AE),
788 => Ok(Self::TN),
792 => Ok(Self::TR),
795 => Ok(Self::TM),
796 => Ok(Self::TC),
798 => Ok(Self::TV),
800 => Ok(Self::UG),
804 => Ok(Self::UA),
807 => Ok(Self::MK),
818 => Ok(Self::EG),
826 => Ok(Self::GB),
831 => Ok(Self::GG),
832 => Ok(Self::JE),
833 => Ok(Self::IM),
834 => Ok(Self::TZ),
840 => Ok(Self::US),
850 => Ok(Self::VI),
854 => Ok(Self::BF),
858 => Ok(Self::UY),
860 => Ok(Self::UZ),
862 => Ok(Self::VE),
876 => Ok(Self::WF),
882 => Ok(Self::WS),
887 => Ok(Self::YE),
894 => Ok(Self::ZM),
_ => Err(format!("Invalid CountryCode: {value}")),
}
}
}
impl TryFrom<String> for CountryCode {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
value.as_str().parse()
}
}
#[non_exhaustive]
struct CountryInfo {
name: String,
code: CountryCode,
currencies: HashSet<CurrencyCode>,
languages: HashSet<LanguageCode>,
}