1
2#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
4pub enum TaiViet {
5 LetterLowKo,
7 LetterHighKo,
9 LetterLowKho,
11 LetterHighKho,
13 LetterLowKhho,
15 LetterHighKhho,
17 LetterLowGo,
19 LetterHighGo,
21 LetterLowNgo,
23 LetterHighNgo,
25 LetterLowCo,
27 LetterHighCo,
29 LetterLowCho,
31 LetterHighCho,
33 LetterLowSo,
35 LetterHighSo,
37 LetterLowNyo,
39 LetterHighNyo,
41 LetterLowDo,
43 LetterHighDo,
45 LetterLowTo,
47 LetterHighTo,
49 LetterLowTho,
51 LetterHighTho,
53 LetterLowNo,
55 LetterHighNo,
57 LetterLowBo,
59 LetterHighBo,
61 LetterLowPo,
63 LetterHighPo,
65 LetterLowPho,
67 LetterHighPho,
69 LetterLowFo,
71 LetterHighFo,
73 LetterLowMo,
75 LetterHighMo,
77 LetterLowYo,
79 LetterHighYo,
81 LetterLowRo,
83 LetterHighRo,
85 LetterLowLo,
87 LetterHighLo,
89 LetterLowVo,
91 LetterHighVo,
93 LetterLowHo,
95 LetterHighHo,
97 LetterLowO,
99 LetterHighO,
101 MaiKang,
103 VowelAa,
105 VowelI,
107 VowelUe,
109 VowelU,
111 VowelE,
113 VowelO,
115 MaiKhit,
117 VowelIa,
119 VowelUea,
121 VowelUa,
123 VowelAue,
125 VowelAy,
127 VowelAn,
129 VowelAm,
131 ToneMaiEk,
133 ToneMaiNueng,
135 ToneMaiTho,
137 ToneMaiSong,
139 SymbolKon,
141 SymbolNueng,
143 SymbolSam,
145 SymbolHoHoi,
147}
148
149impl Into<char> for TaiViet {
150 fn into(self) -> char {
151 match self {
152 TaiViet::LetterLowKo => 'ꪀ',
153 TaiViet::LetterHighKo => 'ꪁ',
154 TaiViet::LetterLowKho => 'ꪂ',
155 TaiViet::LetterHighKho => 'ꪃ',
156 TaiViet::LetterLowKhho => 'ꪄ',
157 TaiViet::LetterHighKhho => 'ꪅ',
158 TaiViet::LetterLowGo => 'ꪆ',
159 TaiViet::LetterHighGo => 'ꪇ',
160 TaiViet::LetterLowNgo => 'ꪈ',
161 TaiViet::LetterHighNgo => 'ꪉ',
162 TaiViet::LetterLowCo => 'ꪊ',
163 TaiViet::LetterHighCo => 'ꪋ',
164 TaiViet::LetterLowCho => 'ꪌ',
165 TaiViet::LetterHighCho => 'ꪍ',
166 TaiViet::LetterLowSo => 'ꪎ',
167 TaiViet::LetterHighSo => 'ꪏ',
168 TaiViet::LetterLowNyo => 'ꪐ',
169 TaiViet::LetterHighNyo => 'ꪑ',
170 TaiViet::LetterLowDo => 'ꪒ',
171 TaiViet::LetterHighDo => 'ꪓ',
172 TaiViet::LetterLowTo => 'ꪔ',
173 TaiViet::LetterHighTo => 'ꪕ',
174 TaiViet::LetterLowTho => 'ꪖ',
175 TaiViet::LetterHighTho => 'ꪗ',
176 TaiViet::LetterLowNo => 'ꪘ',
177 TaiViet::LetterHighNo => 'ꪙ',
178 TaiViet::LetterLowBo => 'ꪚ',
179 TaiViet::LetterHighBo => 'ꪛ',
180 TaiViet::LetterLowPo => 'ꪜ',
181 TaiViet::LetterHighPo => 'ꪝ',
182 TaiViet::LetterLowPho => 'ꪞ',
183 TaiViet::LetterHighPho => 'ꪟ',
184 TaiViet::LetterLowFo => 'ꪠ',
185 TaiViet::LetterHighFo => 'ꪡ',
186 TaiViet::LetterLowMo => 'ꪢ',
187 TaiViet::LetterHighMo => 'ꪣ',
188 TaiViet::LetterLowYo => 'ꪤ',
189 TaiViet::LetterHighYo => 'ꪥ',
190 TaiViet::LetterLowRo => 'ꪦ',
191 TaiViet::LetterHighRo => 'ꪧ',
192 TaiViet::LetterLowLo => 'ꪨ',
193 TaiViet::LetterHighLo => 'ꪩ',
194 TaiViet::LetterLowVo => 'ꪪ',
195 TaiViet::LetterHighVo => 'ꪫ',
196 TaiViet::LetterLowHo => 'ꪬ',
197 TaiViet::LetterHighHo => 'ꪭ',
198 TaiViet::LetterLowO => 'ꪮ',
199 TaiViet::LetterHighO => 'ꪯ',
200 TaiViet::MaiKang => 'ꪰ',
201 TaiViet::VowelAa => 'ꪱ',
202 TaiViet::VowelI => 'ꪲ',
203 TaiViet::VowelUe => 'ꪳ',
204 TaiViet::VowelU => 'ꪴ',
205 TaiViet::VowelE => 'ꪵ',
206 TaiViet::VowelO => 'ꪶ',
207 TaiViet::MaiKhit => 'ꪷ',
208 TaiViet::VowelIa => 'ꪸ',
209 TaiViet::VowelUea => 'ꪹ',
210 TaiViet::VowelUa => 'ꪺ',
211 TaiViet::VowelAue => 'ꪻ',
212 TaiViet::VowelAy => 'ꪼ',
213 TaiViet::VowelAn => 'ꪽ',
214 TaiViet::VowelAm => 'ꪾ',
215 TaiViet::ToneMaiEk => '꪿',
216 TaiViet::ToneMaiNueng => 'ꫀ',
217 TaiViet::ToneMaiTho => '꫁',
218 TaiViet::ToneMaiSong => 'ꫂ',
219 TaiViet::SymbolKon => 'ꫛ',
220 TaiViet::SymbolNueng => 'ꫜ',
221 TaiViet::SymbolSam => 'ꫝ',
222 TaiViet::SymbolHoHoi => '꫞',
223 }
224 }
225}
226
227impl std::convert::TryFrom<char> for TaiViet {
228 type Error = ();
229 fn try_from(c: char) -> Result<Self, Self::Error> {
230 match c {
231 'ꪀ' => Ok(TaiViet::LetterLowKo),
232 'ꪁ' => Ok(TaiViet::LetterHighKo),
233 'ꪂ' => Ok(TaiViet::LetterLowKho),
234 'ꪃ' => Ok(TaiViet::LetterHighKho),
235 'ꪄ' => Ok(TaiViet::LetterLowKhho),
236 'ꪅ' => Ok(TaiViet::LetterHighKhho),
237 'ꪆ' => Ok(TaiViet::LetterLowGo),
238 'ꪇ' => Ok(TaiViet::LetterHighGo),
239 'ꪈ' => Ok(TaiViet::LetterLowNgo),
240 'ꪉ' => Ok(TaiViet::LetterHighNgo),
241 'ꪊ' => Ok(TaiViet::LetterLowCo),
242 'ꪋ' => Ok(TaiViet::LetterHighCo),
243 'ꪌ' => Ok(TaiViet::LetterLowCho),
244 'ꪍ' => Ok(TaiViet::LetterHighCho),
245 'ꪎ' => Ok(TaiViet::LetterLowSo),
246 'ꪏ' => Ok(TaiViet::LetterHighSo),
247 'ꪐ' => Ok(TaiViet::LetterLowNyo),
248 'ꪑ' => Ok(TaiViet::LetterHighNyo),
249 'ꪒ' => Ok(TaiViet::LetterLowDo),
250 'ꪓ' => Ok(TaiViet::LetterHighDo),
251 'ꪔ' => Ok(TaiViet::LetterLowTo),
252 'ꪕ' => Ok(TaiViet::LetterHighTo),
253 'ꪖ' => Ok(TaiViet::LetterLowTho),
254 'ꪗ' => Ok(TaiViet::LetterHighTho),
255 'ꪘ' => Ok(TaiViet::LetterLowNo),
256 'ꪙ' => Ok(TaiViet::LetterHighNo),
257 'ꪚ' => Ok(TaiViet::LetterLowBo),
258 'ꪛ' => Ok(TaiViet::LetterHighBo),
259 'ꪜ' => Ok(TaiViet::LetterLowPo),
260 'ꪝ' => Ok(TaiViet::LetterHighPo),
261 'ꪞ' => Ok(TaiViet::LetterLowPho),
262 'ꪟ' => Ok(TaiViet::LetterHighPho),
263 'ꪠ' => Ok(TaiViet::LetterLowFo),
264 'ꪡ' => Ok(TaiViet::LetterHighFo),
265 'ꪢ' => Ok(TaiViet::LetterLowMo),
266 'ꪣ' => Ok(TaiViet::LetterHighMo),
267 'ꪤ' => Ok(TaiViet::LetterLowYo),
268 'ꪥ' => Ok(TaiViet::LetterHighYo),
269 'ꪦ' => Ok(TaiViet::LetterLowRo),
270 'ꪧ' => Ok(TaiViet::LetterHighRo),
271 'ꪨ' => Ok(TaiViet::LetterLowLo),
272 'ꪩ' => Ok(TaiViet::LetterHighLo),
273 'ꪪ' => Ok(TaiViet::LetterLowVo),
274 'ꪫ' => Ok(TaiViet::LetterHighVo),
275 'ꪬ' => Ok(TaiViet::LetterLowHo),
276 'ꪭ' => Ok(TaiViet::LetterHighHo),
277 'ꪮ' => Ok(TaiViet::LetterLowO),
278 'ꪯ' => Ok(TaiViet::LetterHighO),
279 'ꪰ' => Ok(TaiViet::MaiKang),
280 'ꪱ' => Ok(TaiViet::VowelAa),
281 'ꪲ' => Ok(TaiViet::VowelI),
282 'ꪳ' => Ok(TaiViet::VowelUe),
283 'ꪴ' => Ok(TaiViet::VowelU),
284 'ꪵ' => Ok(TaiViet::VowelE),
285 'ꪶ' => Ok(TaiViet::VowelO),
286 'ꪷ' => Ok(TaiViet::MaiKhit),
287 'ꪸ' => Ok(TaiViet::VowelIa),
288 'ꪹ' => Ok(TaiViet::VowelUea),
289 'ꪺ' => Ok(TaiViet::VowelUa),
290 'ꪻ' => Ok(TaiViet::VowelAue),
291 'ꪼ' => Ok(TaiViet::VowelAy),
292 'ꪽ' => Ok(TaiViet::VowelAn),
293 'ꪾ' => Ok(TaiViet::VowelAm),
294 '꪿' => Ok(TaiViet::ToneMaiEk),
295 'ꫀ' => Ok(TaiViet::ToneMaiNueng),
296 '꫁' => Ok(TaiViet::ToneMaiTho),
297 'ꫂ' => Ok(TaiViet::ToneMaiSong),
298 'ꫛ' => Ok(TaiViet::SymbolKon),
299 'ꫜ' => Ok(TaiViet::SymbolNueng),
300 'ꫝ' => Ok(TaiViet::SymbolSam),
301 '꫞' => Ok(TaiViet::SymbolHoHoi),
302 _ => Err(()),
303 }
304 }
305}
306
307impl Into<u32> for TaiViet {
308 fn into(self) -> u32 {
309 let c: char = self.into();
310 let hex = c
311 .escape_unicode()
312 .to_string()
313 .replace("\\u{", "")
314 .replace("}", "");
315 u32::from_str_radix(&hex, 16).unwrap()
316 }
317}
318
319impl std::convert::TryFrom<u32> for TaiViet {
320 type Error = ();
321 fn try_from(u: u32) -> Result<Self, Self::Error> {
322 if let Ok(c) = char::try_from(u) {
323 Self::try_from(c)
324 } else {
325 Err(())
326 }
327 }
328}
329
330impl Iterator for TaiViet {
331 type Item = Self;
332 fn next(&mut self) -> Option<Self> {
333 let index: u32 = (*self).into();
334 use std::convert::TryFrom;
335 Self::try_from(index + 1).ok()
336 }
337}
338
339impl TaiViet {
340 pub fn new() -> Self {
342 TaiViet::LetterLowKo
343 }
344
345 pub fn name(&self) -> String {
347 let s = std::format!("TaiViet{:#?}", self);
348 string_morph::to_sentence_case(&s)
349 }
350}