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}