forked from
smokesignal.events/smokesignal
i18n+filtering fork - fluent-templates v2
1use anyhow::{anyhow, Result};
2use once_cell::sync::OnceCell;
3use std::{collections::BTreeMap, sync::Arc};
4
5static COUNTRY_CACHE: OnceCell<Arc<BTreeMap<String, String>>> = OnceCell::new();
6
7pub fn cached_countries<'a>() -> Result<&'a Arc<BTreeMap<String, String>>> {
8 if COUNTRY_CACHE.get().is_none() {
9 let all_countries: BTreeMap<String, String> = BTreeMap::from_iter(
10 [
11 ("Afghanistan".to_string(), "AF".to_string()),
12 ("Åland Islands".to_string(), "AX".to_string()),
13 ("Albania".to_string(), "AL".to_string()),
14 ("Algeria".to_string(), "DZ".to_string()),
15 ("American Samoa".to_string(), "AS".to_string()),
16 ("Andorra".to_string(), "AD".to_string()),
17 ("Angola".to_string(), "AO".to_string()),
18 ("Anguilla".to_string(), "AI".to_string()),
19 ("Antarctica".to_string(), "AQ".to_string()),
20 ("Antigua and Barbuda".to_string(), "AG".to_string()),
21 ("Argentina".to_string(), "AR".to_string()),
22 ("Armenia".to_string(), "AM".to_string()),
23 ("Aruba".to_string(), "AW".to_string()),
24 ("Australia".to_string(), "AU".to_string()),
25 ("Austria".to_string(), "AT".to_string()),
26 ("Azerbaijan".to_string(), "AZ".to_string()),
27 ("Bahamas".to_string(), "BS".to_string()),
28 ("Bahrain".to_string(), "BH".to_string()),
29 ("Bangladesh".to_string(), "BD".to_string()),
30 ("Barbados".to_string(), "BB".to_string()),
31 ("Belarus".to_string(), "BY".to_string()),
32 ("Belgium".to_string(), "BE".to_string()),
33 ("Belize".to_string(), "BZ".to_string()),
34 ("Benin".to_string(), "BJ".to_string()),
35 ("Bermuda".to_string(), "BM".to_string()),
36 ("Bhutan".to_string(), "BT".to_string()),
37 (
38 "Bolivia, Plurinational State of".to_string(),
39 "BO".to_string(),
40 ),
41 (
42 "Bonaire, Sint Eustatius and Saba".to_string(),
43 "BQ".to_string(),
44 ),
45 ("Bosnia and Herzegovina".to_string(), "BA".to_string()),
46 ("Botswana".to_string(), "BW".to_string()),
47 ("Bouvet Island".to_string(), "BV".to_string()),
48 ("Brazil".to_string(), "BR".to_string()),
49 (
50 "British Indian Ocean Territory".to_string(),
51 "IO".to_string(),
52 ),
53 ("Brunei Darussalam".to_string(), "BN".to_string()),
54 ("Bulgaria".to_string(), "BG".to_string()),
55 ("Burkina Faso".to_string(), "BF".to_string()),
56 ("Burundi".to_string(), "BI".to_string()),
57 ("Cabo Verde".to_string(), "CV".to_string()),
58 ("Cambodia".to_string(), "KH".to_string()),
59 ("Cameroon".to_string(), "CM".to_string()),
60 ("Canada".to_string(), "CA".to_string()),
61 ("Cayman Islands".to_string(), "KY".to_string()),
62 ("Central African Republic".to_string(), "CF".to_string()),
63 ("Chad".to_string(), "TD".to_string()),
64 ("Chile".to_string(), "CL".to_string()),
65 ("China".to_string(), "CN".to_string()),
66 ("Christmas Island".to_string(), "CX".to_string()),
67 ("Cocos (Keeling) Islands".to_string(), "CC".to_string()),
68 ("Colombia".to_string(), "CO".to_string()),
69 ("Comoros".to_string(), "KM".to_string()),
70 ("Congo".to_string(), "CG".to_string()),
71 (
72 "Congo, Democratic Republic of the".to_string(),
73 "CD".to_string(),
74 ),
75 ("Cook Islands".to_string(), "CK".to_string()),
76 ("Costa Rica".to_string(), "CR".to_string()),
77 ("Côte d'Ivoire".to_string(), "CI".to_string()),
78 ("Croatia".to_string(), "HR".to_string()),
79 ("Cuba".to_string(), "CU".to_string()),
80 ("Curaçao".to_string(), "CW".to_string()),
81 ("Cyprus".to_string(), "CY".to_string()),
82 ("Czechia".to_string(), "CZ".to_string()),
83 ("Denmark".to_string(), "DK".to_string()),
84 ("Djibouti".to_string(), "DJ".to_string()),
85 ("Dominica".to_string(), "DM".to_string()),
86 ("Dominican Republic".to_string(), "DO".to_string()),
87 ("Ecuador".to_string(), "EC".to_string()),
88 ("Egypt".to_string(), "EG".to_string()),
89 ("El Salvador".to_string(), "SV".to_string()),
90 ("Equatorial Guinea".to_string(), "GQ".to_string()),
91 ("Eritrea".to_string(), "ER".to_string()),
92 ("Estonia".to_string(), "EE".to_string()),
93 ("Eswatini".to_string(), "SZ".to_string()),
94 ("Ethiopia".to_string(), "ET".to_string()),
95 ("Falkland Islands (Malvinas)".to_string(), "FK".to_string()),
96 ("Faroe Islands".to_string(), "FO".to_string()),
97 ("Fiji".to_string(), "FJ".to_string()),
98 ("Finland".to_string(), "FI".to_string()),
99 ("France".to_string(), "FR".to_string()),
100 ("French Guiana".to_string(), "GF".to_string()),
101 ("French Polynesia".to_string(), "PF".to_string()),
102 ("French Southern Territories".to_string(), "TF".to_string()),
103 ("Gabon".to_string(), "GA".to_string()),
104 ("Gambia".to_string(), "GM".to_string()),
105 ("Georgia".to_string(), "GE".to_string()),
106 ("Germany".to_string(), "DE".to_string()),
107 ("Ghana".to_string(), "GH".to_string()),
108 ("Gibraltar".to_string(), "GI".to_string()),
109 ("Greece".to_string(), "GR".to_string()),
110 ("Greenland".to_string(), "GL".to_string()),
111 ("Grenada".to_string(), "GD".to_string()),
112 ("Guadeloupe".to_string(), "GP".to_string()),
113 ("Guam".to_string(), "GU".to_string()),
114 ("Guatemala".to_string(), "GT".to_string()),
115 ("Guernsey".to_string(), "GG".to_string()),
116 ("Guinea".to_string(), "GN".to_string()),
117 ("Guinea-Bissau".to_string(), "GW".to_string()),
118 ("Guyana".to_string(), "GY".to_string()),
119 ("Haiti".to_string(), "HT".to_string()),
120 (
121 "Heard Island and McDonald Islands".to_string(),
122 "HM".to_string(),
123 ),
124 ("Holy See".to_string(), "VA".to_string()),
125 ("Honduras".to_string(), "HN".to_string()),
126 ("Hong Kong".to_string(), "HK".to_string()),
127 ("Hungary".to_string(), "HU".to_string()),
128 ("Iceland".to_string(), "IS".to_string()),
129 ("India".to_string(), "IN".to_string()),
130 ("Indonesia".to_string(), "ID".to_string()),
131 ("Iran, Islamic Republic of".to_string(), "IR".to_string()),
132 ("Iraq".to_string(), "IQ".to_string()),
133 ("Ireland".to_string(), "IE".to_string()),
134 ("Isle of Man".to_string(), "IM".to_string()),
135 ("Israel".to_string(), "IL".to_string()),
136 ("Italy".to_string(), "IT".to_string()),
137 ("Jamaica".to_string(), "JM".to_string()),
138 ("Japan".to_string(), "JP".to_string()),
139 ("Jersey".to_string(), "JE".to_string()),
140 ("Jordan".to_string(), "JO".to_string()),
141 ("Kazakhstan".to_string(), "KZ".to_string()),
142 ("Kenya".to_string(), "KE".to_string()),
143 ("Kiribati".to_string(), "KI".to_string()),
144 (
145 "Korea, Democratic People's Republic of".to_string(),
146 "KP".to_string(),
147 ),
148 ("Korea, Republic of".to_string(), "KR".to_string()),
149 ("Kuwait".to_string(), "KW".to_string()),
150 ("Kyrgyzstan".to_string(), "KG".to_string()),
151 (
152 "Lao People's Democratic Republic".to_string(),
153 "LA".to_string(),
154 ),
155 ("Latvia".to_string(), "LV".to_string()),
156 ("Lebanon".to_string(), "LB".to_string()),
157 ("Lesotho".to_string(), "LS".to_string()),
158 ("Liberia".to_string(), "LR".to_string()),
159 ("Libya".to_string(), "LY".to_string()),
160 ("Liechtenstein".to_string(), "LI".to_string()),
161 ("Lithuania".to_string(), "LT".to_string()),
162 ("Luxembourg".to_string(), "LU".to_string()),
163 ("Macao".to_string(), "MO".to_string()),
164 ("Madagascar".to_string(), "MG".to_string()),
165 ("Malawi".to_string(), "MW".to_string()),
166 ("Malaysia".to_string(), "MY".to_string()),
167 ("Maldives".to_string(), "MV".to_string()),
168 ("Mali".to_string(), "ML".to_string()),
169 ("Malta".to_string(), "MT".to_string()),
170 ("Marshall Islands".to_string(), "MH".to_string()),
171 ("Martinique".to_string(), "MQ".to_string()),
172 ("Mauritania".to_string(), "MR".to_string()),
173 ("Mauritius".to_string(), "MU".to_string()),
174 ("Mayotte".to_string(), "YT".to_string()),
175 ("Mexico".to_string(), "MX".to_string()),
176 (
177 "Micronesia, Federated States of".to_string(),
178 "FM".to_string(),
179 ),
180 ("Moldova, Republic of".to_string(), "MD".to_string()),
181 ("Monaco".to_string(), "MC".to_string()),
182 ("Mongolia".to_string(), "MN".to_string()),
183 ("Montenegro".to_string(), "ME".to_string()),
184 ("Montserrat".to_string(), "MS".to_string()),
185 ("Morocco".to_string(), "MA".to_string()),
186 ("Mozambique".to_string(), "MZ".to_string()),
187 ("Myanmar".to_string(), "MM".to_string()),
188 ("Namibia".to_string(), "NA".to_string()),
189 ("Nauru".to_string(), "NR".to_string()),
190 ("Nepal".to_string(), "NP".to_string()),
191 ("Netherlands, Kingdom of the".to_string(), "NL".to_string()),
192 ("New Caledonia".to_string(), "NC".to_string()),
193 ("New Zealand".to_string(), "NZ".to_string()),
194 ("Nicaragua".to_string(), "NI".to_string()),
195 ("Niger".to_string(), "NE".to_string()),
196 ("Nigeria".to_string(), "NG".to_string()),
197 ("Niue".to_string(), "NU".to_string()),
198 ("Norfolk Island".to_string(), "NF".to_string()),
199 ("North Macedonia".to_string(), "MK".to_string()),
200 ("Northern Mariana Islands".to_string(), "MP".to_string()),
201 ("Norway".to_string(), "NO".to_string()),
202 ("Oman".to_string(), "OM".to_string()),
203 ("Pakistan".to_string(), "PK".to_string()),
204 ("Palau".to_string(), "PW".to_string()),
205 ("Palestine, State of".to_string(), "PS".to_string()),
206 ("Panama".to_string(), "PA".to_string()),
207 ("Papua New Guinea".to_string(), "PG".to_string()),
208 ("Paraguay".to_string(), "PY".to_string()),
209 ("Peru".to_string(), "PE".to_string()),
210 ("Philippines".to_string(), "PH".to_string()),
211 ("Pitcairn".to_string(), "PN".to_string()),
212 ("Poland".to_string(), "PL".to_string()),
213 ("Portugal".to_string(), "PT".to_string()),
214 ("Puerto Rico".to_string(), "PR".to_string()),
215 ("Qatar".to_string(), "QA".to_string()),
216 ("Réunion".to_string(), "RE".to_string()),
217 ("Romania".to_string(), "RO".to_string()),
218 ("Russian Federation".to_string(), "RU".to_string()),
219 ("Rwanda".to_string(), "RW".to_string()),
220 ("Saint Barthélemy".to_string(), "BL".to_string()),
221 (
222 "Saint Helena, Ascension and Tristan da Cunha".to_string(),
223 "SH".to_string(),
224 ),
225 ("Saint Kitts and Nevis".to_string(), "KN".to_string()),
226 ("Saint Lucia".to_string(), "LC".to_string()),
227 ("Saint Martin (French part)".to_string(), "MF".to_string()),
228 ("Saint Pierre and Miquelon".to_string(), "PM".to_string()),
229 (
230 "Saint Vincent and the Grenadines".to_string(),
231 "VC".to_string(),
232 ),
233 ("Samoa".to_string(), "WS".to_string()),
234 ("San Marino".to_string(), "SM".to_string()),
235 ("Sao Tome and Principe".to_string(), "ST".to_string()),
236 ("Saudi Arabia".to_string(), "SA".to_string()),
237 ("Senegal".to_string(), "SN".to_string()),
238 ("Serbia".to_string(), "RS".to_string()),
239 ("Seychelles".to_string(), "SC".to_string()),
240 ("Sierra Leone".to_string(), "SL".to_string()),
241 ("Singapore".to_string(), "SG".to_string()),
242 ("Sint Maarten (Dutch part)".to_string(), "SX".to_string()),
243 ("Slovakia".to_string(), "SK".to_string()),
244 ("Slovenia".to_string(), "SI".to_string()),
245 ("Solomon Islands".to_string(), "SB".to_string()),
246 ("Somalia".to_string(), "SO".to_string()),
247 ("South Africa".to_string(), "ZA".to_string()),
248 (
249 "South Georgia and the South Sandwich Islands".to_string(),
250 "GS".to_string(),
251 ),
252 ("South Sudan".to_string(), "SS".to_string()),
253 ("Spain".to_string(), "ES".to_string()),
254 ("Sri Lanka".to_string(), "LK".to_string()),
255 ("Sudan".to_string(), "SD".to_string()),
256 ("Suriname".to_string(), "SR".to_string()),
257 ("Svalbard and Jan Mayen".to_string(), "SJ".to_string()),
258 ("Sweden".to_string(), "SE".to_string()),
259 ("Switzerland".to_string(), "CH".to_string()),
260 ("Syrian Arab Republic".to_string(), "SY".to_string()),
261 ("Taiwan, Province of China".to_string(), "TW".to_string()),
262 ("Tajikistan".to_string(), "TJ".to_string()),
263 ("Tanzania, United Republic of".to_string(), "TZ".to_string()),
264 ("Thailand".to_string(), "TH".to_string()),
265 ("Timor-Leste".to_string(), "TL".to_string()),
266 ("Togo".to_string(), "TG".to_string()),
267 ("Tokelau".to_string(), "TK".to_string()),
268 ("Tonga".to_string(), "TO".to_string()),
269 ("Trinidad and Tobago".to_string(), "TT".to_string()),
270 ("Tunisia".to_string(), "TN".to_string()),
271 ("Türkiye".to_string(), "TR".to_string()),
272 ("Turkmenistan".to_string(), "TM".to_string()),
273 ("Turks and Caicos Islands".to_string(), "TC".to_string()),
274 ("Tuvalu".to_string(), "TV".to_string()),
275 ("Uganda".to_string(), "UG".to_string()),
276 ("Ukraine".to_string(), "UA".to_string()),
277 ("United Arab Emirates".to_string(), "AE".to_string()),
278 (
279 "United Kingdom of Great Britain and Northern Ireland".to_string(),
280 "GB".to_string(),
281 ),
282 ("United States of America".to_string(), "US".to_string()),
283 (
284 "United States Minor Outlying Islands".to_string(),
285 "UM".to_string(),
286 ),
287 ("Uruguay".to_string(), "UY".to_string()),
288 ("Uzbekistan".to_string(), "UZ".to_string()),
289 ("Vanuatu".to_string(), "VU".to_string()),
290 (
291 "Venezuela, Bolivarian Republic of".to_string(),
292 "VE".to_string(),
293 ),
294 ("Viet Nam".to_string(), "VN".to_string()),
295 ("Virgin Islands (British)".to_string(), "VG".to_string()),
296 ("Virgin Islands (U.S.)".to_string(), "VI".to_string()),
297 ("Wallis and Futuna".to_string(), "WF".to_string()),
298 ("Western Sahara".to_string(), "EH".to_string()),
299 ("Yemen".to_string(), "YE".to_string()),
300 ("Zambia".to_string(), "ZM".to_string()),
301 ("Zimbabwe".to_string(), "ZW".to_string()),
302 ]
303 .iter()
304 // This is lazy, I know.
305 .map(|(name, code)| (code.clone(), name.clone())),
306 );
307 let _ = COUNTRY_CACHE.set(Arc::new(all_countries));
308 }
309
310 // Ensure we have a value, even in case of race conditions
311 if COUNTRY_CACHE.get().is_none() {
312 // In the unlikely event that another thread didn't successfully initialize,
313 // we'll try once more with a new map instance
314 let fallback_countries = BTreeMap::from([
315 ("US".to_string(), "United States of America".to_string()),
316 ("GB".to_string(), "United Kingdom".to_string()),
317 ("CA".to_string(), "Canada".to_string()),
318 ]);
319 let _ = COUNTRY_CACHE.set(Arc::new(fallback_countries));
320 }
321
322 // This should never fail now
323 COUNTRY_CACHE
324 .get()
325 .ok_or(anyhow!("COUNTRY_CACHE initialization failed"))
326}