use anyhow::{anyhow, Result}; use once_cell::sync::OnceCell; use std::{collections::BTreeMap, sync::Arc}; static COUNTRY_CACHE: OnceCell>> = OnceCell::new(); pub fn cached_countries<'a>() -> Result<&'a Arc>> { if COUNTRY_CACHE.get().is_none() { let all_countries: BTreeMap = BTreeMap::from_iter( [ ("Afghanistan".to_string(), "AF".to_string()), ("Åland Islands".to_string(), "AX".to_string()), ("Albania".to_string(), "AL".to_string()), ("Algeria".to_string(), "DZ".to_string()), ("American Samoa".to_string(), "AS".to_string()), ("Andorra".to_string(), "AD".to_string()), ("Angola".to_string(), "AO".to_string()), ("Anguilla".to_string(), "AI".to_string()), ("Antarctica".to_string(), "AQ".to_string()), ("Antigua and Barbuda".to_string(), "AG".to_string()), ("Argentina".to_string(), "AR".to_string()), ("Armenia".to_string(), "AM".to_string()), ("Aruba".to_string(), "AW".to_string()), ("Australia".to_string(), "AU".to_string()), ("Austria".to_string(), "AT".to_string()), ("Azerbaijan".to_string(), "AZ".to_string()), ("Bahamas".to_string(), "BS".to_string()), ("Bahrain".to_string(), "BH".to_string()), ("Bangladesh".to_string(), "BD".to_string()), ("Barbados".to_string(), "BB".to_string()), ("Belarus".to_string(), "BY".to_string()), ("Belgium".to_string(), "BE".to_string()), ("Belize".to_string(), "BZ".to_string()), ("Benin".to_string(), "BJ".to_string()), ("Bermuda".to_string(), "BM".to_string()), ("Bhutan".to_string(), "BT".to_string()), ( "Bolivia, Plurinational State of".to_string(), "BO".to_string(), ), ( "Bonaire, Sint Eustatius and Saba".to_string(), "BQ".to_string(), ), ("Bosnia and Herzegovina".to_string(), "BA".to_string()), ("Botswana".to_string(), "BW".to_string()), ("Bouvet Island".to_string(), "BV".to_string()), ("Brazil".to_string(), "BR".to_string()), ( "British Indian Ocean Territory".to_string(), "IO".to_string(), ), ("Brunei Darussalam".to_string(), "BN".to_string()), ("Bulgaria".to_string(), "BG".to_string()), ("Burkina Faso".to_string(), "BF".to_string()), ("Burundi".to_string(), "BI".to_string()), ("Cabo Verde".to_string(), "CV".to_string()), ("Cambodia".to_string(), "KH".to_string()), ("Cameroon".to_string(), "CM".to_string()), ("Canada".to_string(), "CA".to_string()), ("Cayman Islands".to_string(), "KY".to_string()), ("Central African Republic".to_string(), "CF".to_string()), ("Chad".to_string(), "TD".to_string()), ("Chile".to_string(), "CL".to_string()), ("China".to_string(), "CN".to_string()), ("Christmas Island".to_string(), "CX".to_string()), ("Cocos (Keeling) Islands".to_string(), "CC".to_string()), ("Colombia".to_string(), "CO".to_string()), ("Comoros".to_string(), "KM".to_string()), ("Congo".to_string(), "CG".to_string()), ( "Congo, Democratic Republic of the".to_string(), "CD".to_string(), ), ("Cook Islands".to_string(), "CK".to_string()), ("Costa Rica".to_string(), "CR".to_string()), ("Côte d'Ivoire".to_string(), "CI".to_string()), ("Croatia".to_string(), "HR".to_string()), ("Cuba".to_string(), "CU".to_string()), ("Curaçao".to_string(), "CW".to_string()), ("Cyprus".to_string(), "CY".to_string()), ("Czechia".to_string(), "CZ".to_string()), ("Denmark".to_string(), "DK".to_string()), ("Djibouti".to_string(), "DJ".to_string()), ("Dominica".to_string(), "DM".to_string()), ("Dominican Republic".to_string(), "DO".to_string()), ("Ecuador".to_string(), "EC".to_string()), ("Egypt".to_string(), "EG".to_string()), ("El Salvador".to_string(), "SV".to_string()), ("Equatorial Guinea".to_string(), "GQ".to_string()), ("Eritrea".to_string(), "ER".to_string()), ("Estonia".to_string(), "EE".to_string()), ("Eswatini".to_string(), "SZ".to_string()), ("Ethiopia".to_string(), "ET".to_string()), ("Falkland Islands (Malvinas)".to_string(), "FK".to_string()), ("Faroe Islands".to_string(), "FO".to_string()), ("Fiji".to_string(), "FJ".to_string()), ("Finland".to_string(), "FI".to_string()), ("France".to_string(), "FR".to_string()), ("French Guiana".to_string(), "GF".to_string()), ("French Polynesia".to_string(), "PF".to_string()), ("French Southern Territories".to_string(), "TF".to_string()), ("Gabon".to_string(), "GA".to_string()), ("Gambia".to_string(), "GM".to_string()), ("Georgia".to_string(), "GE".to_string()), ("Germany".to_string(), "DE".to_string()), ("Ghana".to_string(), "GH".to_string()), ("Gibraltar".to_string(), "GI".to_string()), ("Greece".to_string(), "GR".to_string()), ("Greenland".to_string(), "GL".to_string()), ("Grenada".to_string(), "GD".to_string()), ("Guadeloupe".to_string(), "GP".to_string()), ("Guam".to_string(), "GU".to_string()), ("Guatemala".to_string(), "GT".to_string()), ("Guernsey".to_string(), "GG".to_string()), ("Guinea".to_string(), "GN".to_string()), ("Guinea-Bissau".to_string(), "GW".to_string()), ("Guyana".to_string(), "GY".to_string()), ("Haiti".to_string(), "HT".to_string()), ( "Heard Island and McDonald Islands".to_string(), "HM".to_string(), ), ("Holy See".to_string(), "VA".to_string()), ("Honduras".to_string(), "HN".to_string()), ("Hong Kong".to_string(), "HK".to_string()), ("Hungary".to_string(), "HU".to_string()), ("Iceland".to_string(), "IS".to_string()), ("India".to_string(), "IN".to_string()), ("Indonesia".to_string(), "ID".to_string()), ("Iran, Islamic Republic of".to_string(), "IR".to_string()), ("Iraq".to_string(), "IQ".to_string()), ("Ireland".to_string(), "IE".to_string()), ("Isle of Man".to_string(), "IM".to_string()), ("Israel".to_string(), "IL".to_string()), ("Italy".to_string(), "IT".to_string()), ("Jamaica".to_string(), "JM".to_string()), ("Japan".to_string(), "JP".to_string()), ("Jersey".to_string(), "JE".to_string()), ("Jordan".to_string(), "JO".to_string()), ("Kazakhstan".to_string(), "KZ".to_string()), ("Kenya".to_string(), "KE".to_string()), ("Kiribati".to_string(), "KI".to_string()), ( "Korea, Democratic People's Republic of".to_string(), "KP".to_string(), ), ("Korea, Republic of".to_string(), "KR".to_string()), ("Kuwait".to_string(), "KW".to_string()), ("Kyrgyzstan".to_string(), "KG".to_string()), ( "Lao People's Democratic Republic".to_string(), "LA".to_string(), ), ("Latvia".to_string(), "LV".to_string()), ("Lebanon".to_string(), "LB".to_string()), ("Lesotho".to_string(), "LS".to_string()), ("Liberia".to_string(), "LR".to_string()), ("Libya".to_string(), "LY".to_string()), ("Liechtenstein".to_string(), "LI".to_string()), ("Lithuania".to_string(), "LT".to_string()), ("Luxembourg".to_string(), "LU".to_string()), ("Macao".to_string(), "MO".to_string()), ("Madagascar".to_string(), "MG".to_string()), ("Malawi".to_string(), "MW".to_string()), ("Malaysia".to_string(), "MY".to_string()), ("Maldives".to_string(), "MV".to_string()), ("Mali".to_string(), "ML".to_string()), ("Malta".to_string(), "MT".to_string()), ("Marshall Islands".to_string(), "MH".to_string()), ("Martinique".to_string(), "MQ".to_string()), ("Mauritania".to_string(), "MR".to_string()), ("Mauritius".to_string(), "MU".to_string()), ("Mayotte".to_string(), "YT".to_string()), ("Mexico".to_string(), "MX".to_string()), ( "Micronesia, Federated States of".to_string(), "FM".to_string(), ), ("Moldova, Republic of".to_string(), "MD".to_string()), ("Monaco".to_string(), "MC".to_string()), ("Mongolia".to_string(), "MN".to_string()), ("Montenegro".to_string(), "ME".to_string()), ("Montserrat".to_string(), "MS".to_string()), ("Morocco".to_string(), "MA".to_string()), ("Mozambique".to_string(), "MZ".to_string()), ("Myanmar".to_string(), "MM".to_string()), ("Namibia".to_string(), "NA".to_string()), ("Nauru".to_string(), "NR".to_string()), ("Nepal".to_string(), "NP".to_string()), ("Netherlands, Kingdom of the".to_string(), "NL".to_string()), ("New Caledonia".to_string(), "NC".to_string()), ("New Zealand".to_string(), "NZ".to_string()), ("Nicaragua".to_string(), "NI".to_string()), ("Niger".to_string(), "NE".to_string()), ("Nigeria".to_string(), "NG".to_string()), ("Niue".to_string(), "NU".to_string()), ("Norfolk Island".to_string(), "NF".to_string()), ("North Macedonia".to_string(), "MK".to_string()), ("Northern Mariana Islands".to_string(), "MP".to_string()), ("Norway".to_string(), "NO".to_string()), ("Oman".to_string(), "OM".to_string()), ("Pakistan".to_string(), "PK".to_string()), ("Palau".to_string(), "PW".to_string()), ("Palestine, State of".to_string(), "PS".to_string()), ("Panama".to_string(), "PA".to_string()), ("Papua New Guinea".to_string(), "PG".to_string()), ("Paraguay".to_string(), "PY".to_string()), ("Peru".to_string(), "PE".to_string()), ("Philippines".to_string(), "PH".to_string()), ("Pitcairn".to_string(), "PN".to_string()), ("Poland".to_string(), "PL".to_string()), ("Portugal".to_string(), "PT".to_string()), ("Puerto Rico".to_string(), "PR".to_string()), ("Qatar".to_string(), "QA".to_string()), ("Réunion".to_string(), "RE".to_string()), ("Romania".to_string(), "RO".to_string()), ("Russian Federation".to_string(), "RU".to_string()), ("Rwanda".to_string(), "RW".to_string()), ("Saint Barthélemy".to_string(), "BL".to_string()), ( "Saint Helena, Ascension and Tristan da Cunha".to_string(), "SH".to_string(), ), ("Saint Kitts and Nevis".to_string(), "KN".to_string()), ("Saint Lucia".to_string(), "LC".to_string()), ("Saint Martin (French part)".to_string(), "MF".to_string()), ("Saint Pierre and Miquelon".to_string(), "PM".to_string()), ( "Saint Vincent and the Grenadines".to_string(), "VC".to_string(), ), ("Samoa".to_string(), "WS".to_string()), ("San Marino".to_string(), "SM".to_string()), ("Sao Tome and Principe".to_string(), "ST".to_string()), ("Saudi Arabia".to_string(), "SA".to_string()), ("Senegal".to_string(), "SN".to_string()), ("Serbia".to_string(), "RS".to_string()), ("Seychelles".to_string(), "SC".to_string()), ("Sierra Leone".to_string(), "SL".to_string()), ("Singapore".to_string(), "SG".to_string()), ("Sint Maarten (Dutch part)".to_string(), "SX".to_string()), ("Slovakia".to_string(), "SK".to_string()), ("Slovenia".to_string(), "SI".to_string()), ("Solomon Islands".to_string(), "SB".to_string()), ("Somalia".to_string(), "SO".to_string()), ("South Africa".to_string(), "ZA".to_string()), ( "South Georgia and the South Sandwich Islands".to_string(), "GS".to_string(), ), ("South Sudan".to_string(), "SS".to_string()), ("Spain".to_string(), "ES".to_string()), ("Sri Lanka".to_string(), "LK".to_string()), ("Sudan".to_string(), "SD".to_string()), ("Suriname".to_string(), "SR".to_string()), ("Svalbard and Jan Mayen".to_string(), "SJ".to_string()), ("Sweden".to_string(), "SE".to_string()), ("Switzerland".to_string(), "CH".to_string()), ("Syrian Arab Republic".to_string(), "SY".to_string()), ("Taiwan, Province of China".to_string(), "TW".to_string()), ("Tajikistan".to_string(), "TJ".to_string()), ("Tanzania, United Republic of".to_string(), "TZ".to_string()), ("Thailand".to_string(), "TH".to_string()), ("Timor-Leste".to_string(), "TL".to_string()), ("Togo".to_string(), "TG".to_string()), ("Tokelau".to_string(), "TK".to_string()), ("Tonga".to_string(), "TO".to_string()), ("Trinidad and Tobago".to_string(), "TT".to_string()), ("Tunisia".to_string(), "TN".to_string()), ("Türkiye".to_string(), "TR".to_string()), ("Turkmenistan".to_string(), "TM".to_string()), ("Turks and Caicos Islands".to_string(), "TC".to_string()), ("Tuvalu".to_string(), "TV".to_string()), ("Uganda".to_string(), "UG".to_string()), ("Ukraine".to_string(), "UA".to_string()), ("United Arab Emirates".to_string(), "AE".to_string()), ( "United Kingdom of Great Britain and Northern Ireland".to_string(), "GB".to_string(), ), ("United States of America".to_string(), "US".to_string()), ( "United States Minor Outlying Islands".to_string(), "UM".to_string(), ), ("Uruguay".to_string(), "UY".to_string()), ("Uzbekistan".to_string(), "UZ".to_string()), ("Vanuatu".to_string(), "VU".to_string()), ( "Venezuela, Bolivarian Republic of".to_string(), "VE".to_string(), ), ("Viet Nam".to_string(), "VN".to_string()), ("Virgin Islands (British)".to_string(), "VG".to_string()), ("Virgin Islands (U.S.)".to_string(), "VI".to_string()), ("Wallis and Futuna".to_string(), "WF".to_string()), ("Western Sahara".to_string(), "EH".to_string()), ("Yemen".to_string(), "YE".to_string()), ("Zambia".to_string(), "ZM".to_string()), ("Zimbabwe".to_string(), "ZW".to_string()), ] .iter() // This is lazy, I know. .map(|(name, code)| (code.clone(), name.clone())), ); let _ = COUNTRY_CACHE.set(Arc::new(all_countries)); } // Ensure we have a value, even in case of race conditions if COUNTRY_CACHE.get().is_none() { // In the unlikely event that another thread didn't successfully initialize, // we'll try once more with a new map instance let fallback_countries = BTreeMap::from([ ("US".to_string(), "United States of America".to_string()), ("GB".to_string(), "United Kingdom".to_string()), ("CA".to_string(), "Canada".to_string()), ]); let _ = COUNTRY_CACHE.set(Arc::new(fallback_countries)); } // This should never fail now COUNTRY_CACHE .get() .ok_or(anyhow!("COUNTRY_CACHE initialization failed")) }