Skip to main content

holodeck_simctl_core/models/
region_option.rs

1/// A human-readable Region for the TUI's launch-region picker — the same
2/// concept as Settings → General → Language & Region → Region on a real
3/// device, e.g. "Brazil" → `BR`. Curated rather than exhaustive: the App
4/// Store territories engineers actually test region-gated features against,
5/// not every ISO 3166-1 code. The CLI's `--region` flag bypasses this table
6/// entirely and takes a raw code, so it is unaffected by what is or isn't
7/// listed here.
8///
9/// Deliberately distinct from `holodeck location` (GPS coordinates) —
10/// "Region" here never means a physical place.
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct RegionOption {
13    pub display_name: &'static str,
14    pub region_code: &'static str,
15}
16
17impl RegionOption {
18    pub const ALL: &'static [RegionOption] = &[
19        RegionOption { display_name: "United States", region_code: "US" },
20        RegionOption { display_name: "United Kingdom", region_code: "GB" },
21        RegionOption { display_name: "Canada", region_code: "CA" },
22        RegionOption { display_name: "Australia", region_code: "AU" },
23        RegionOption { display_name: "New Zealand", region_code: "NZ" },
24        RegionOption { display_name: "Ireland", region_code: "IE" },
25        RegionOption { display_name: "India", region_code: "IN" },
26        RegionOption { display_name: "Brazil", region_code: "BR" },
27        RegionOption { display_name: "Mexico", region_code: "MX" },
28        RegionOption { display_name: "Argentina", region_code: "AR" },
29        RegionOption { display_name: "Chile", region_code: "CL" },
30        RegionOption { display_name: "Colombia", region_code: "CO" },
31        RegionOption { display_name: "Portugal", region_code: "PT" },
32        RegionOption { display_name: "Spain", region_code: "ES" },
33        RegionOption { display_name: "France", region_code: "FR" },
34        RegionOption { display_name: "Germany", region_code: "DE" },
35        RegionOption { display_name: "Austria", region_code: "AT" },
36        RegionOption { display_name: "Switzerland", region_code: "CH" },
37        RegionOption { display_name: "Italy", region_code: "IT" },
38        RegionOption { display_name: "Netherlands", region_code: "NL" },
39        RegionOption { display_name: "Belgium", region_code: "BE" },
40        RegionOption { display_name: "Sweden", region_code: "SE" },
41        RegionOption { display_name: "Norway", region_code: "NO" },
42        RegionOption { display_name: "Denmark", region_code: "DK" },
43        RegionOption { display_name: "Finland", region_code: "FI" },
44        RegionOption { display_name: "Poland", region_code: "PL" },
45        RegionOption { display_name: "Czechia", region_code: "CZ" },
46        RegionOption { display_name: "Hungary", region_code: "HU" },
47        RegionOption { display_name: "Romania", region_code: "RO" },
48        RegionOption { display_name: "Greece", region_code: "GR" },
49        RegionOption { display_name: "Turkey", region_code: "TR" },
50        RegionOption { display_name: "Russia", region_code: "RU" },
51        RegionOption { display_name: "Ukraine", region_code: "UA" },
52        RegionOption { display_name: "Israel", region_code: "IL" },
53        RegionOption { display_name: "United Arab Emirates", region_code: "AE" },
54        RegionOption { display_name: "Saudi Arabia", region_code: "SA" },
55        RegionOption { display_name: "South Africa", region_code: "ZA" },
56        RegionOption { display_name: "Japan", region_code: "JP" },
57        RegionOption { display_name: "South Korea", region_code: "KR" },
58        RegionOption { display_name: "China", region_code: "CN" },
59        RegionOption { display_name: "Hong Kong", region_code: "HK" },
60        RegionOption { display_name: "Taiwan", region_code: "TW" },
61        RegionOption { display_name: "Singapore", region_code: "SG" },
62        RegionOption { display_name: "Indonesia", region_code: "ID" },
63        RegionOption { display_name: "Vietnam", region_code: "VN" },
64        RegionOption { display_name: "Thailand", region_code: "TH" },
65    ];
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn every_entry_has_a_non_empty_display_name_and_code() {
74        for region in RegionOption::ALL {
75            assert!(!region.display_name.is_empty());
76            assert!(!region.region_code.is_empty());
77        }
78    }
79
80    #[test]
81    fn region_codes_are_unique() {
82        let mut codes: Vec<&str> = RegionOption::ALL.iter().map(|r| r.region_code).collect();
83        codes.sort_unstable();
84        codes.dedup();
85        assert_eq!(codes.len(), RegionOption::ALL.len());
86    }
87}