smash_arc/
region.rs

1use std::convert::Infallible;
2use std::str::FromStr;
3
4#[repr(u32)]
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
6pub enum Locale {
7    None = 0,
8    Japan = 1,
9    UnitedStates = 2,
10    Europe = 3,
11    Korea = 4,
12    China = 5,
13}
14
15impl From<usize> for Locale {
16    fn from(r: usize) -> Locale {
17        use Locale::*;
18        match r {
19            1 => Japan,
20            2 => UnitedStates,
21            3 => Europe,
22            4 => Korea,
23            5 => China,
24
25            _ => None,
26        }
27    }
28}
29
30impl From<u32> for Locale {
31    fn from(x: u32) -> Self {
32        Locale::from(x as usize)
33    }
34}
35
36impl From<u16> for Locale {
37    fn from(x: u16) -> Self {
38        Locale::from(x as usize)
39    }
40}
41
42impl From<u8> for Locale {
43    fn from(x: u8) -> Self {
44        Locale::from(x as usize)
45    }
46}
47
48impl FromStr for Locale {
49    type Err = Infallible;
50    fn from_str(x: &str) -> Result<Self, Self::Err> {
51        use Locale::*;
52        Ok(match x {
53            "jp" => Japan,
54            "us" => UnitedStates,
55            "eu" => Europe,
56            "kr" => Korea,
57            "zh" => China,
58
59            _ => None,
60        })
61    }
62}
63
64#[repr(u32)]
65#[derive(Clone, Copy, Debug, PartialEq, Eq)]
66pub enum Region {
67    None = 0,
68    Japanese = 1,
69    UsEnglish = 2,
70    UsFrench = 3,
71    UsSpanish = 4,
72    EuEnglish = 5,
73    EuFrench = 6,
74    EuSpanish = 7,
75    EuGerman = 8,
76    EuDutch = 9,
77    EuItalian = 10,
78    EuRussian = 11,
79    Korean = 12,
80    ChinaChinese = 13,
81    TaiwanChinese = 14,
82}
83
84impl Region {
85    pub fn get_locale(&self) -> Option<Locale> {
86        match self {
87            Region::Japanese => Some(Locale::Japan),
88            Region::UsEnglish => Some(Locale::UnitedStates),
89            Region::UsFrench => Some(Locale::UnitedStates),
90            Region::UsSpanish => Some(Locale::UnitedStates),
91            Region::EuEnglish => Some(Locale::Europe),
92            Region::EuFrench => Some(Locale::Europe),
93            Region::EuSpanish => Some(Locale::Europe),
94            Region::EuGerman => Some(Locale::Europe),
95            Region::EuDutch => Some(Locale::Europe),
96            Region::EuItalian => Some(Locale::Europe),
97            Region::EuRussian => Some(Locale::Europe),
98            Region::Korean => Some(Locale::Korea),
99            Region::ChinaChinese => Some(Locale::China),
100            Region::TaiwanChinese => Some(Locale::China),
101
102            _ => None,
103        }
104    }
105}
106
107impl From<usize> for Region {
108    fn from(r: usize) -> Region {
109        use Region::*;
110        match r {
111            1 => Japanese,
112            2 => UsEnglish,
113            3 => UsFrench,
114            4 => UsSpanish,
115            5 => EuEnglish,
116            6 => EuFrench,
117            7 => EuSpanish,
118            8 => EuGerman,
119            9 => EuDutch,
120            10 => EuItalian,
121            11 => EuRussian,
122            12 => Korean,
123            13 => ChinaChinese,
124            14 => TaiwanChinese,
125
126            _ => None,
127        }
128    }
129}
130
131impl From<u32> for Region {
132    fn from(x: u32) -> Self {
133        Region::from(x as usize)
134    }
135}
136
137impl From<u16> for Region {
138    fn from(x: u16) -> Self {
139        Region::from(x as usize)
140    }
141}
142
143impl From<u8> for Region {
144    fn from(x: u8) -> Self {
145        Region::from(x as usize)
146    }
147}
148
149impl FromStr for Region {
150    type Err = Infallible;
151    fn from_str(x: &str) -> Result<Self, Self::Err> {
152        use Region::*;
153        Ok(match x {
154            "jp_ja" => Japanese,
155            "us_en" => UsEnglish,
156            "us_fr" => UsFrench,
157            "us_es" => UsSpanish,
158            "eu_en" => EuEnglish,
159            "eu_fr" => EuFrench,
160            "eu_es" => EuSpanish,
161            "eu_de" => EuGerman,
162            "eu_nl" => EuDutch,
163            "eu_it" => EuItalian,
164            "eu_ru" => EuRussian,
165            "kr_ko" => Korean,
166            "zh_cn" => ChinaChinese,
167            "zh_tw" => TaiwanChinese,
168
169            _ => None,
170        })
171    }
172}
173
174impl std::fmt::Display for Region {
175    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
176        match self {
177            Region::None => write!(f, ""),
178            Region::Japanese => write!(f, "jp_ja"),
179            Region::UsEnglish => write!(f, "us_en"),
180            Region::UsFrench => write!(f, "us_fr"),
181            Region::UsSpanish => write!(f, "us_es"),
182            Region::EuEnglish => write!(f, "eu_en"),
183            Region::EuFrench => write!(f, "eu_fr"),
184            Region::EuSpanish => write!(f, "eu_es"),
185            Region::EuGerman => write!(f, "eu_de"),
186            Region::EuDutch => write!(f, "eu_nl"),
187            Region::EuItalian => write!(f, "eu_it"),
188            Region::EuRussian => write!(f, "eu_ru"),
189            Region::Korean => write!(f, "kr_ko"),
190            Region::ChinaChinese => write!(f, "zh_cn"),
191            Region::TaiwanChinese => write!(f, "zh_tw"),
192        }
193    }
194}
195
196impl std::fmt::Display for Locale {
197    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
198        match self {
199            Locale::None => write!(f, ""),
200            Locale::Japan => write!(f, "jp"),
201            Locale::UnitedStates => write!(f, "us"),
202            Locale::Europe => write!(f, "eu"),
203            Locale::Korea => write!(f, "kr"),
204            Locale::China => write!(f, "zh"),
205        }
206    }
207}