1use std::fmt::Display;
2
3use super::{Mora, MoraEnum};
4
5pub(crate) fn mora_to_phoneme(mora: &Mora) -> (Option<Consonant>, Option<Vowel>) {
6 let (consonant, vowel) = match mora.mora_enum {
7 MoraEnum::Vyo => (Some(Consonant::By), Some(Vowel::O)),
8 MoraEnum::Vyu => (Some(Consonant::By), Some(Vowel::U)),
9 MoraEnum::Vya => (Some(Consonant::By), Some(Vowel::A)),
10 MoraEnum::Vo => (Some(Consonant::V), Some(Vowel::O)),
11 MoraEnum::Ve => (Some(Consonant::V), Some(Vowel::E)),
12 MoraEnum::Vi => (Some(Consonant::V), Some(Vowel::I)),
13 MoraEnum::Va => (Some(Consonant::V), Some(Vowel::A)),
14 MoraEnum::Vu => (Some(Consonant::V), Some(Vowel::U)),
15 MoraEnum::N => (Some(Consonant::Nn), None),
16 MoraEnum::Wo => (None, Some(Vowel::O)),
17 MoraEnum::We => (None, Some(Vowel::E)),
18 MoraEnum::Wi => (None, Some(Vowel::I)),
19 MoraEnum::Wa => (Some(Consonant::W), Some(Vowel::A)),
20 MoraEnum::Xwa => (Some(Consonant::W), Some(Vowel::A)),
21 MoraEnum::Ro => (Some(Consonant::R), Some(Vowel::O)),
22 MoraEnum::Re => (Some(Consonant::R), Some(Vowel::E)),
23 MoraEnum::Ru => (Some(Consonant::R), Some(Vowel::U)),
24 MoraEnum::Ryo => (Some(Consonant::Ry), Some(Vowel::O)),
25 MoraEnum::Ryu => (Some(Consonant::Ry), Some(Vowel::U)),
26 MoraEnum::Rya => (Some(Consonant::Ry), Some(Vowel::A)),
27 MoraEnum::Rye => (Some(Consonant::Ry), Some(Vowel::E)),
28 MoraEnum::Ri => (Some(Consonant::R), Some(Vowel::I)),
29 MoraEnum::Ra => (Some(Consonant::R), Some(Vowel::A)),
30 MoraEnum::Yo => (Some(Consonant::Y), Some(Vowel::O)),
31 MoraEnum::Xyo => (Some(Consonant::Y), Some(Vowel::O)),
32 MoraEnum::Yu => (Some(Consonant::Y), Some(Vowel::U)),
33 MoraEnum::Xyu => (Some(Consonant::Y), Some(Vowel::U)),
34 MoraEnum::Ya => (Some(Consonant::Y), Some(Vowel::A)),
35 MoraEnum::Xya => (Some(Consonant::Y), Some(Vowel::A)),
36 MoraEnum::Mo => (Some(Consonant::M), Some(Vowel::O)),
37 MoraEnum::Me => (Some(Consonant::M), Some(Vowel::E)),
38 MoraEnum::Mu => (Some(Consonant::M), Some(Vowel::U)),
39 MoraEnum::Myo => (Some(Consonant::My), Some(Vowel::O)),
40 MoraEnum::Myu => (Some(Consonant::My), Some(Vowel::U)),
41 MoraEnum::Mya => (Some(Consonant::My), Some(Vowel::A)),
42 MoraEnum::Mye => (Some(Consonant::My), Some(Vowel::E)),
43 MoraEnum::Mi => (Some(Consonant::M), Some(Vowel::I)),
44 MoraEnum::Ma => (Some(Consonant::M), Some(Vowel::A)),
45 MoraEnum::Po => (Some(Consonant::P), Some(Vowel::O)),
46 MoraEnum::Bo => (Some(Consonant::B), Some(Vowel::O)),
47 MoraEnum::Ho => (Some(Consonant::H), Some(Vowel::O)),
48 MoraEnum::Pe => (Some(Consonant::P), Some(Vowel::E)),
49 MoraEnum::Be => (Some(Consonant::B), Some(Vowel::E)),
50 MoraEnum::He => (Some(Consonant::H), Some(Vowel::E)),
51 MoraEnum::Pu => (Some(Consonant::P), Some(Vowel::U)),
52 MoraEnum::Bu => (Some(Consonant::B), Some(Vowel::U)),
53 MoraEnum::Fo => (Some(Consonant::F), Some(Vowel::O)),
54 MoraEnum::Fe => (Some(Consonant::F), Some(Vowel::E)),
55 MoraEnum::Fi => (Some(Consonant::F), Some(Vowel::I)),
56 MoraEnum::Fa => (Some(Consonant::F), Some(Vowel::A)),
57 MoraEnum::Fu => (Some(Consonant::F), Some(Vowel::U)),
58 MoraEnum::Pyo => (Some(Consonant::Py), Some(Vowel::O)),
59 MoraEnum::Pyu => (Some(Consonant::Py), Some(Vowel::U)),
60 MoraEnum::Pya => (Some(Consonant::Py), Some(Vowel::A)),
61 MoraEnum::Pye => (Some(Consonant::Py), Some(Vowel::E)),
62 MoraEnum::Pi => (Some(Consonant::P), Some(Vowel::I)),
63 MoraEnum::Byo => (Some(Consonant::By), Some(Vowel::O)),
64 MoraEnum::Byu => (Some(Consonant::By), Some(Vowel::U)),
65 MoraEnum::Bya => (Some(Consonant::By), Some(Vowel::A)),
66 MoraEnum::Bye => (Some(Consonant::By), Some(Vowel::E)),
67 MoraEnum::Bi => (Some(Consonant::B), Some(Vowel::I)),
68 MoraEnum::Hyo => (Some(Consonant::Hy), Some(Vowel::O)),
69 MoraEnum::Hyu => (Some(Consonant::Hy), Some(Vowel::U)),
70 MoraEnum::Hya => (Some(Consonant::Hy), Some(Vowel::A)),
71 MoraEnum::Hye => (Some(Consonant::Hy), Some(Vowel::E)),
72 MoraEnum::Hi => (Some(Consonant::H), Some(Vowel::I)),
73 MoraEnum::Pa => (Some(Consonant::P), Some(Vowel::A)),
74 MoraEnum::Ba => (Some(Consonant::B), Some(Vowel::A)),
75 MoraEnum::Ha => (Some(Consonant::H), Some(Vowel::A)),
76 MoraEnum::No => (Some(Consonant::N), Some(Vowel::O)),
77 MoraEnum::Ne => (Some(Consonant::N), Some(Vowel::E)),
78 MoraEnum::Nu => (Some(Consonant::N), Some(Vowel::U)),
79 MoraEnum::Nyo => (Some(Consonant::Ny), Some(Vowel::O)),
80 MoraEnum::Nyu => (Some(Consonant::Ny), Some(Vowel::U)),
81 MoraEnum::Nya => (Some(Consonant::Ny), Some(Vowel::A)),
82 MoraEnum::Nye => (Some(Consonant::Ny), Some(Vowel::E)),
83 MoraEnum::Ni => (Some(Consonant::N), Some(Vowel::I)),
84 MoraEnum::Na => (Some(Consonant::N), Some(Vowel::A)),
85 MoraEnum::Dwu => (Some(Consonant::D), Some(Vowel::U)),
86 MoraEnum::Do => (Some(Consonant::D), Some(Vowel::O)),
87 MoraEnum::Twu => (Some(Consonant::T), Some(Vowel::U)),
88 MoraEnum::To => (Some(Consonant::T), Some(Vowel::O)),
89 MoraEnum::Dho => (Some(Consonant::Dy), Some(Vowel::O)),
90 MoraEnum::Dhu => (Some(Consonant::Dy), Some(Vowel::U)),
91 MoraEnum::Dha => (Some(Consonant::Dy), Some(Vowel::A)),
92 MoraEnum::Dhi => (Some(Consonant::D), Some(Vowel::I)),
93 MoraEnum::De => (Some(Consonant::D), Some(Vowel::E)),
94 MoraEnum::Tho => (Some(Consonant::Ty), Some(Vowel::O)),
95 MoraEnum::Thu => (Some(Consonant::Ty), Some(Vowel::U)),
96 MoraEnum::Tha => (Some(Consonant::Ty), Some(Vowel::A)),
97 MoraEnum::Thi => (Some(Consonant::T), Some(Vowel::I)),
98 MoraEnum::Te => (Some(Consonant::T), Some(Vowel::E)),
99 MoraEnum::Du => (Some(Consonant::Z), Some(Vowel::U)),
100 MoraEnum::Tso => (Some(Consonant::Ts), Some(Vowel::O)),
101 MoraEnum::Tse => (Some(Consonant::Ts), Some(Vowel::E)),
102 MoraEnum::Tsi => (Some(Consonant::Ts), Some(Vowel::I)),
103 MoraEnum::Tsa => (Some(Consonant::Ts), Some(Vowel::A)),
104 MoraEnum::Tsu => (Some(Consonant::Ts), Some(Vowel::U)),
105 MoraEnum::Xtsu => (Some(Consonant::Cl), None),
106 MoraEnum::Di => (Some(Consonant::J), Some(Vowel::I)),
107 MoraEnum::Cho => (Some(Consonant::Ch), Some(Vowel::O)),
108 MoraEnum::Chu => (Some(Consonant::Ch), Some(Vowel::U)),
109 MoraEnum::Cha => (Some(Consonant::Ch), Some(Vowel::A)),
110 MoraEnum::Che => (Some(Consonant::Ch), Some(Vowel::E)),
111 MoraEnum::Chi => (Some(Consonant::Ch), Some(Vowel::I)),
112 MoraEnum::Da => (Some(Consonant::D), Some(Vowel::A)),
113 MoraEnum::Ta => (Some(Consonant::T), Some(Vowel::A)),
114 MoraEnum::Zo => (Some(Consonant::Z), Some(Vowel::O)),
115 MoraEnum::So => (Some(Consonant::S), Some(Vowel::O)),
116 MoraEnum::Ze => (Some(Consonant::Z), Some(Vowel::E)),
117 MoraEnum::Se => (Some(Consonant::S), Some(Vowel::E)),
118 MoraEnum::Zwi => (Some(Consonant::Z), Some(Vowel::I)),
119 MoraEnum::Zu => (Some(Consonant::Z), Some(Vowel::U)),
120 MoraEnum::Swi => (Some(Consonant::S), Some(Vowel::I)),
121 MoraEnum::Su => (Some(Consonant::S), Some(Vowel::U)),
122 MoraEnum::Jo => (Some(Consonant::J), Some(Vowel::O)),
123 MoraEnum::Ju => (Some(Consonant::J), Some(Vowel::U)),
124 MoraEnum::Ja => (Some(Consonant::J), Some(Vowel::A)),
125 MoraEnum::Je => (Some(Consonant::J), Some(Vowel::E)),
126 MoraEnum::Ji => (Some(Consonant::J), Some(Vowel::I)),
127 MoraEnum::Sho => (Some(Consonant::Sh), Some(Vowel::O)),
128 MoraEnum::Shu => (Some(Consonant::Sh), Some(Vowel::U)),
129 MoraEnum::Sha => (Some(Consonant::Sh), Some(Vowel::A)),
130 MoraEnum::She => (Some(Consonant::Sh), Some(Vowel::E)),
131 MoraEnum::Shi => (Some(Consonant::Sh), Some(Vowel::I)),
132 MoraEnum::Za => (Some(Consonant::Z), Some(Vowel::A)),
133 MoraEnum::Sa => (Some(Consonant::S), Some(Vowel::A)),
134 MoraEnum::Go => (Some(Consonant::G), Some(Vowel::O)),
135 MoraEnum::Ko => (Some(Consonant::K), Some(Vowel::O)),
136 MoraEnum::Ge => (Some(Consonant::G), Some(Vowel::E)),
137 MoraEnum::Ke => (Some(Consonant::K), Some(Vowel::E)),
138 MoraEnum::Xke => (Some(Consonant::K), Some(Vowel::E)),
139 MoraEnum::Gwa => (Some(Consonant::Gw), Some(Vowel::A)),
140 MoraEnum::Gu => (Some(Consonant::G), Some(Vowel::U)),
141 MoraEnum::Kwa => (Some(Consonant::Kw), Some(Vowel::A)),
142 MoraEnum::Ku => (Some(Consonant::K), Some(Vowel::U)),
143 MoraEnum::Gyo => (Some(Consonant::Gy), Some(Vowel::O)),
144 MoraEnum::Gyu => (Some(Consonant::Gy), Some(Vowel::U)),
145 MoraEnum::Gya => (Some(Consonant::Gy), Some(Vowel::A)),
146 MoraEnum::Gye => (Some(Consonant::Gy), Some(Vowel::E)),
147 MoraEnum::Gi => (Some(Consonant::G), Some(Vowel::I)),
148 MoraEnum::Kyo => (Some(Consonant::Ky), Some(Vowel::O)),
149 MoraEnum::Kyu => (Some(Consonant::Ky), Some(Vowel::U)),
150 MoraEnum::Kya => (Some(Consonant::Ky), Some(Vowel::A)),
151 MoraEnum::Kye => (Some(Consonant::Ky), Some(Vowel::E)),
152 MoraEnum::Ki => (Some(Consonant::K), Some(Vowel::I)),
153 MoraEnum::Ga => (Some(Consonant::G), Some(Vowel::A)),
154 MoraEnum::Ka => (Some(Consonant::K), Some(Vowel::A)),
155 MoraEnum::O => (None, Some(Vowel::O)),
156 MoraEnum::Xo => (None, Some(Vowel::O)),
157 MoraEnum::E => (None, Some(Vowel::E)),
158 MoraEnum::Xe => (None, Some(Vowel::E)),
159 MoraEnum::Who => (Some(Consonant::W), Some(Vowel::O)),
160 MoraEnum::Whe => (Some(Consonant::W), Some(Vowel::E)),
161 MoraEnum::Whi => (Some(Consonant::W), Some(Vowel::I)),
162 MoraEnum::U => (None, Some(Vowel::U)),
163 MoraEnum::Xu => (None, Some(Vowel::U)),
164 MoraEnum::Ye => (Some(Consonant::Y), Some(Vowel::E)),
165 MoraEnum::I => (None, Some(Vowel::I)),
166 MoraEnum::Xi => (None, Some(Vowel::I)),
167 MoraEnum::A => (None, Some(Vowel::A)),
168 MoraEnum::Xa => (None, Some(Vowel::A)),
169
170 MoraEnum::Long => (Some(Consonant::Long), None),
171 MoraEnum::Touten | MoraEnum::Question => (None, None),
172 };
173 (
174 consonant,
175 vowel.map(|vowel| {
176 if mora.is_voiced {
177 vowel
178 } else {
179 vowel.into_unvoiced()
180 }
181 }),
182 )
183}
184
185#[derive(Clone, Copy, Debug)]
186pub enum Consonant {
187 V,
188 W,
189 R,
190 Ry,
191 Y,
192 M,
193 My,
194 P,
195 B,
196 H,
197 F,
198 Py,
199 By,
200 Hy,
201 N,
202 Ny,
203 D,
204 T,
205 Dy,
206 Ty,
207 Ts,
208 Ch,
209 Z,
210 S,
211 J,
212 Sh,
213 G,
214 K,
215 Gy,
216 Ky,
217 Gw,
218 Kw,
219
220 Nn,
223 Cl,
225
226 Long,
229}
230
231impl Display for Consonant {
232 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
233 let s = match self {
234 Self::V => "v",
235 Self::W => "w",
236 Self::R => "r",
237 Self::Ry => "ry",
238 Self::Y => "y",
239 Self::M => "m",
240 Self::My => "my",
241 Self::P => "p",
242 Self::B => "b",
243 Self::H => "h",
244 Self::F => "f",
245 Self::Py => "py",
246 Self::By => "by",
247 Self::Hy => "hy",
248 Self::N => "n",
249 Self::Ny => "ny",
250 Self::D => "d",
251 Self::T => "t",
252 Self::Dy => "dy",
253 Self::Ty => "ty",
254 Self::Ts => "ts",
255 Self::Ch => "ch",
256 Self::Z => "z",
257 Self::S => "s",
258 Self::J => "j",
259 Self::Sh => "sh",
260 Self::G => "g",
261 Self::K => "k",
262 Self::Gy => "gy",
263 Self::Ky => "ky",
264 Self::Gw => "gw",
265 Self::Kw => "kw",
266
267 Self::Nn => "N",
268 Self::Cl => "cl",
269
270 Self::Long => "-",
271 };
272 write!(f, "{}", s)
273 }
274}
275
276#[derive(Clone, Copy, Debug)]
277pub enum Vowel {
278 A,
279 I,
280 U,
281 E,
282 O,
283 AUnvoiced,
284 IUnvoiced,
285 UUnvoiced,
286 EUnvoiced,
287 OUnvoiced,
288}
289
290impl Vowel {
291 pub fn into_unvoiced(self) -> Self {
292 match self {
293 Self::A => Self::AUnvoiced,
294 Self::I => Self::IUnvoiced,
295 Self::U => Self::UUnvoiced,
296 Self::E => Self::EUnvoiced,
297 Self::O => Self::OUnvoiced,
298 rest => rest,
299 }
300 }
301}
302
303impl Display for Vowel {
304 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
305 let s = match self {
306 Self::A => "a",
307 Self::I => "i",
308 Self::U => "u",
309 Self::E => "e",
310 Self::O => "o",
311 Self::AUnvoiced => "A",
312 Self::IUnvoiced => "I",
313 Self::UUnvoiced => "U",
314 Self::EUnvoiced => "E",
315 Self::OUnvoiced => "O",
316 };
317 write!(f, "{}", s)
318 }
319}