1
2#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
4pub enum Batak {
5 LetterA,
7 LetterSimalungunA,
9 LetterHa,
11 LetterSimalungunHa,
13 LetterMandailingHa,
15 LetterBa,
17 LetterKaroBa,
19 LetterPa,
21 LetterSimalungunPa,
23 LetterNa,
25 LetterMandailingNa,
27 LetterWa,
29 LetterSimalungunWa,
31 LetterPakpakWa,
33 LetterGa,
35 LetterSimalungunGa,
37 LetterJa,
39 LetterDa,
41 LetterRa,
43 LetterSimalungunRa,
45 LetterMa,
47 LetterSimalungunMa,
49 LetterSouthernTa,
51 LetterNorthernTa,
53 LetterSa,
55 LetterSimalungunSa,
57 LetterMandailingSa,
59 LetterYa,
61 LetterSimalungunYa,
63 LetterNga,
65 LetterLa,
67 LetterSimalungunLa,
69 LetterNya,
71 LetterCa,
73 LetterNda,
75 LetterMba,
77 LetterI,
79 LetterU,
81 SignTompi,
83 VowelSignE,
85 VowelSignPakpakE,
87 VowelSignEe,
89 VowelSignI,
91 VowelSignKaroI,
93 VowelSignO,
95 VowelSignKaroO,
97 VowelSignU,
99 VowelSignUForSimalungunSa,
101 ConsonantSignNg,
103 ConsonantSignH,
105 Pangolat,
107 Panongonan,
109 SymbolBinduNaMetek,
111 SymbolBinduPinarboras,
113 SymbolBinduJudul,
115}
116
117impl Into<char> for Batak {
118 fn into(self) -> char {
119 match self {
120 Batak::LetterA => 'ᯀ',
121 Batak::LetterSimalungunA => 'ᯁ',
122 Batak::LetterHa => 'ᯂ',
123 Batak::LetterSimalungunHa => 'ᯃ',
124 Batak::LetterMandailingHa => 'ᯄ',
125 Batak::LetterBa => 'ᯅ',
126 Batak::LetterKaroBa => 'ᯆ',
127 Batak::LetterPa => 'ᯇ',
128 Batak::LetterSimalungunPa => 'ᯈ',
129 Batak::LetterNa => 'ᯉ',
130 Batak::LetterMandailingNa => 'ᯊ',
131 Batak::LetterWa => 'ᯋ',
132 Batak::LetterSimalungunWa => 'ᯌ',
133 Batak::LetterPakpakWa => 'ᯍ',
134 Batak::LetterGa => 'ᯎ',
135 Batak::LetterSimalungunGa => 'ᯏ',
136 Batak::LetterJa => 'ᯐ',
137 Batak::LetterDa => 'ᯑ',
138 Batak::LetterRa => 'ᯒ',
139 Batak::LetterSimalungunRa => 'ᯓ',
140 Batak::LetterMa => 'ᯔ',
141 Batak::LetterSimalungunMa => 'ᯕ',
142 Batak::LetterSouthernTa => 'ᯖ',
143 Batak::LetterNorthernTa => 'ᯗ',
144 Batak::LetterSa => 'ᯘ',
145 Batak::LetterSimalungunSa => 'ᯙ',
146 Batak::LetterMandailingSa => 'ᯚ',
147 Batak::LetterYa => 'ᯛ',
148 Batak::LetterSimalungunYa => 'ᯜ',
149 Batak::LetterNga => 'ᯝ',
150 Batak::LetterLa => 'ᯞ',
151 Batak::LetterSimalungunLa => 'ᯟ',
152 Batak::LetterNya => 'ᯠ',
153 Batak::LetterCa => 'ᯡ',
154 Batak::LetterNda => 'ᯢ',
155 Batak::LetterMba => 'ᯣ',
156 Batak::LetterI => 'ᯤ',
157 Batak::LetterU => 'ᯥ',
158 Batak::SignTompi => '᯦',
159 Batak::VowelSignE => 'ᯧ',
160 Batak::VowelSignPakpakE => 'ᯨ',
161 Batak::VowelSignEe => 'ᯩ',
162 Batak::VowelSignI => 'ᯪ',
163 Batak::VowelSignKaroI => 'ᯫ',
164 Batak::VowelSignO => 'ᯬ',
165 Batak::VowelSignKaroO => 'ᯭ',
166 Batak::VowelSignU => 'ᯮ',
167 Batak::VowelSignUForSimalungunSa => 'ᯯ',
168 Batak::ConsonantSignNg => 'ᯰ',
169 Batak::ConsonantSignH => 'ᯱ',
170 Batak::Pangolat => '᯲',
171 Batak::Panongonan => '᯳',
172 Batak::SymbolBinduNaMetek => '᯼',
173 Batak::SymbolBinduPinarboras => '᯽',
174 Batak::SymbolBinduJudul => '᯾',
175 }
176 }
177}
178
179impl std::convert::TryFrom<char> for Batak {
180 type Error = ();
181 fn try_from(c: char) -> Result<Self, Self::Error> {
182 match c {
183 'ᯀ' => Ok(Batak::LetterA),
184 'ᯁ' => Ok(Batak::LetterSimalungunA),
185 'ᯂ' => Ok(Batak::LetterHa),
186 'ᯃ' => Ok(Batak::LetterSimalungunHa),
187 'ᯄ' => Ok(Batak::LetterMandailingHa),
188 'ᯅ' => Ok(Batak::LetterBa),
189 'ᯆ' => Ok(Batak::LetterKaroBa),
190 'ᯇ' => Ok(Batak::LetterPa),
191 'ᯈ' => Ok(Batak::LetterSimalungunPa),
192 'ᯉ' => Ok(Batak::LetterNa),
193 'ᯊ' => Ok(Batak::LetterMandailingNa),
194 'ᯋ' => Ok(Batak::LetterWa),
195 'ᯌ' => Ok(Batak::LetterSimalungunWa),
196 'ᯍ' => Ok(Batak::LetterPakpakWa),
197 'ᯎ' => Ok(Batak::LetterGa),
198 'ᯏ' => Ok(Batak::LetterSimalungunGa),
199 'ᯐ' => Ok(Batak::LetterJa),
200 'ᯑ' => Ok(Batak::LetterDa),
201 'ᯒ' => Ok(Batak::LetterRa),
202 'ᯓ' => Ok(Batak::LetterSimalungunRa),
203 'ᯔ' => Ok(Batak::LetterMa),
204 'ᯕ' => Ok(Batak::LetterSimalungunMa),
205 'ᯖ' => Ok(Batak::LetterSouthernTa),
206 'ᯗ' => Ok(Batak::LetterNorthernTa),
207 'ᯘ' => Ok(Batak::LetterSa),
208 'ᯙ' => Ok(Batak::LetterSimalungunSa),
209 'ᯚ' => Ok(Batak::LetterMandailingSa),
210 'ᯛ' => Ok(Batak::LetterYa),
211 'ᯜ' => Ok(Batak::LetterSimalungunYa),
212 'ᯝ' => Ok(Batak::LetterNga),
213 'ᯞ' => Ok(Batak::LetterLa),
214 'ᯟ' => Ok(Batak::LetterSimalungunLa),
215 'ᯠ' => Ok(Batak::LetterNya),
216 'ᯡ' => Ok(Batak::LetterCa),
217 'ᯢ' => Ok(Batak::LetterNda),
218 'ᯣ' => Ok(Batak::LetterMba),
219 'ᯤ' => Ok(Batak::LetterI),
220 'ᯥ' => Ok(Batak::LetterU),
221 '᯦' => Ok(Batak::SignTompi),
222 'ᯧ' => Ok(Batak::VowelSignE),
223 'ᯨ' => Ok(Batak::VowelSignPakpakE),
224 'ᯩ' => Ok(Batak::VowelSignEe),
225 'ᯪ' => Ok(Batak::VowelSignI),
226 'ᯫ' => Ok(Batak::VowelSignKaroI),
227 'ᯬ' => Ok(Batak::VowelSignO),
228 'ᯭ' => Ok(Batak::VowelSignKaroO),
229 'ᯮ' => Ok(Batak::VowelSignU),
230 'ᯯ' => Ok(Batak::VowelSignUForSimalungunSa),
231 'ᯰ' => Ok(Batak::ConsonantSignNg),
232 'ᯱ' => Ok(Batak::ConsonantSignH),
233 '᯲' => Ok(Batak::Pangolat),
234 '᯳' => Ok(Batak::Panongonan),
235 '᯼' => Ok(Batak::SymbolBinduNaMetek),
236 '᯽' => Ok(Batak::SymbolBinduPinarboras),
237 '᯾' => Ok(Batak::SymbolBinduJudul),
238 _ => Err(()),
239 }
240 }
241}
242
243impl Into<u32> for Batak {
244 fn into(self) -> u32 {
245 let c: char = self.into();
246 let hex = c
247 .escape_unicode()
248 .to_string()
249 .replace("\\u{", "")
250 .replace("}", "");
251 u32::from_str_radix(&hex, 16).unwrap()
252 }
253}
254
255impl std::convert::TryFrom<u32> for Batak {
256 type Error = ();
257 fn try_from(u: u32) -> Result<Self, Self::Error> {
258 if let Ok(c) = char::try_from(u) {
259 Self::try_from(c)
260 } else {
261 Err(())
262 }
263 }
264}
265
266impl Iterator for Batak {
267 type Item = Self;
268 fn next(&mut self) -> Option<Self> {
269 let index: u32 = (*self).into();
270 use std::convert::TryFrom;
271 Self::try_from(index + 1).ok()
272 }
273}
274
275impl Batak {
276 pub fn new() -> Self {
278 Batak::LetterA
279 }
280
281 pub fn name(&self) -> String {
283 let s = std::format!("Batak{:#?}", self);
284 string_morph::to_sentence_case(&s)
285 }
286}