1use std::fmt;
5use std::str::FromStr;
6
7use crate::Error;
8
9#[non_exhaustive]
11#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
12#[rustfmt::skip]
13pub enum WrittenUnit {
14 A,
16 Aa,
18 B,
20 B2,
22 C,
24 Ch,
26 Cr,
28 D,
30 Dd,
32 F,
34 G,
36 Gx,
38 H,
40 Hr,
42 Hx,
44 I,
46 Ix,
48 J,
50 K,
52 K2,
54 L,
56 M,
58 Mvs,
60 N,
62 Nirugu,
64 O,
66 P,
68 R,
70 Rh,
72 S,
74 Sh,
76 Sz,
78 T,
80 U,
82 Ue,
84 Ux,
86 W,
88 Y,
90 Z,
92 Zr,
94 Zwj,
96}
97
98#[rustfmt::skip]
99impl WrittenUnit {
100 pub const ALL: [WrittenUnit; 41] = [
102 WrittenUnit::A,
103 WrittenUnit::Aa,
104 WrittenUnit::B,
105 WrittenUnit::B2,
106 WrittenUnit::C,
107 WrittenUnit::Ch,
108 WrittenUnit::Cr,
109 WrittenUnit::D,
110 WrittenUnit::Dd,
111 WrittenUnit::F,
112 WrittenUnit::G,
113 WrittenUnit::Gx,
114 WrittenUnit::H,
115 WrittenUnit::Hr,
116 WrittenUnit::Hx,
117 WrittenUnit::I,
118 WrittenUnit::Ix,
119 WrittenUnit::J,
120 WrittenUnit::K,
121 WrittenUnit::K2,
122 WrittenUnit::L,
123 WrittenUnit::M,
124 WrittenUnit::Mvs,
125 WrittenUnit::N,
126 WrittenUnit::Nirugu,
127 WrittenUnit::O,
128 WrittenUnit::P,
129 WrittenUnit::R,
130 WrittenUnit::Rh,
131 WrittenUnit::S,
132 WrittenUnit::Sh,
133 WrittenUnit::Sz,
134 WrittenUnit::T,
135 WrittenUnit::U,
136 WrittenUnit::Ue,
137 WrittenUnit::Ux,
138 WrittenUnit::W,
139 WrittenUnit::Y,
140 WrittenUnit::Z,
141 WrittenUnit::Zr,
142 WrittenUnit::Zwj,
143 ];
144
145 pub const fn as_str(self) -> &'static str {
147 match self {
148 WrittenUnit::A => "A",
149 WrittenUnit::Aa => "Aa",
150 WrittenUnit::B => "B",
151 WrittenUnit::B2 => "B2",
152 WrittenUnit::C => "C",
153 WrittenUnit::Ch => "Ch",
154 WrittenUnit::Cr => "Cr",
155 WrittenUnit::D => "D",
156 WrittenUnit::Dd => "Dd",
157 WrittenUnit::F => "F",
158 WrittenUnit::G => "G",
159 WrittenUnit::Gx => "Gx",
160 WrittenUnit::H => "H",
161 WrittenUnit::Hr => "Hr",
162 WrittenUnit::Hx => "Hx",
163 WrittenUnit::I => "I",
164 WrittenUnit::Ix => "Ix",
165 WrittenUnit::J => "J",
166 WrittenUnit::K => "K",
167 WrittenUnit::K2 => "K2",
168 WrittenUnit::L => "L",
169 WrittenUnit::M => "M",
170 WrittenUnit::Mvs => "Mvs",
171 WrittenUnit::N => "N",
172 WrittenUnit::Nirugu => "Nirugu",
173 WrittenUnit::O => "O",
174 WrittenUnit::P => "P",
175 WrittenUnit::R => "R",
176 WrittenUnit::Rh => "Rh",
177 WrittenUnit::S => "S",
178 WrittenUnit::Sh => "Sh",
179 WrittenUnit::Sz => "Sz",
180 WrittenUnit::T => "T",
181 WrittenUnit::U => "U",
182 WrittenUnit::Ue => "Ue",
183 WrittenUnit::Ux => "Ux",
184 WrittenUnit::W => "W",
185 WrittenUnit::Y => "Y",
186 WrittenUnit::Z => "Z",
187 WrittenUnit::Zr => "Zr",
188 WrittenUnit::Zwj => "Zwj",
189 }
190 }
191
192 pub const fn is_structural(self) -> bool {
194 matches!(self, WrittenUnit::Mvs | WrittenUnit::Nirugu | WrittenUnit::Zwj)
195 }
196}
197
198#[rustfmt::skip]
199impl FromStr for WrittenUnit {
200 type Err = Error;
201
202 fn from_str(name: &str) -> Result<WrittenUnit, Error> {
203 match name {
204 "A" => Ok(WrittenUnit::A),
205 "Aa" => Ok(WrittenUnit::Aa),
206 "B" => Ok(WrittenUnit::B),
207 "B2" => Ok(WrittenUnit::B2),
208 "C" => Ok(WrittenUnit::C),
209 "Ch" => Ok(WrittenUnit::Ch),
210 "Cr" => Ok(WrittenUnit::Cr),
211 "D" => Ok(WrittenUnit::D),
212 "Dd" => Ok(WrittenUnit::Dd),
213 "F" => Ok(WrittenUnit::F),
214 "G" => Ok(WrittenUnit::G),
215 "Gx" => Ok(WrittenUnit::Gx),
216 "H" => Ok(WrittenUnit::H),
217 "Hr" => Ok(WrittenUnit::Hr),
218 "Hx" => Ok(WrittenUnit::Hx),
219 "I" => Ok(WrittenUnit::I),
220 "Ix" => Ok(WrittenUnit::Ix),
221 "J" => Ok(WrittenUnit::J),
222 "K" => Ok(WrittenUnit::K),
223 "K2" => Ok(WrittenUnit::K2),
224 "L" => Ok(WrittenUnit::L),
225 "M" => Ok(WrittenUnit::M),
226 "Mvs" => Ok(WrittenUnit::Mvs),
227 "N" => Ok(WrittenUnit::N),
228 "Nirugu" => Ok(WrittenUnit::Nirugu),
229 "O" => Ok(WrittenUnit::O),
230 "P" => Ok(WrittenUnit::P),
231 "R" => Ok(WrittenUnit::R),
232 "Rh" => Ok(WrittenUnit::Rh),
233 "S" => Ok(WrittenUnit::S),
234 "Sh" => Ok(WrittenUnit::Sh),
235 "Sz" => Ok(WrittenUnit::Sz),
236 "T" => Ok(WrittenUnit::T),
237 "U" => Ok(WrittenUnit::U),
238 "Ue" => Ok(WrittenUnit::Ue),
239 "Ux" => Ok(WrittenUnit::Ux),
240 "W" => Ok(WrittenUnit::W),
241 "Y" => Ok(WrittenUnit::Y),
242 "Z" => Ok(WrittenUnit::Z),
243 "Zr" => Ok(WrittenUnit::Zr),
244 "Zwj" => Ok(WrittenUnit::Zwj),
245 _ => Err(Error::UnknownName { kind: "written unit", name: name.to_owned() }),
246 }
247 }
248}
249
250#[rustfmt::skip]
251impl fmt::Display for WrittenUnit {
252 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
253 formatter.write_str(self.as_str())
254 }
255}
256
257#[non_exhaustive]
259#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
260#[rustfmt::skip]
261pub enum Condition {
262 Chachlag,
264 ChachlagOnset,
266 ChachlagOnsetGb,
268 Devsger,
270 Dotless,
272 Feminine,
274 Marked,
276 MasculineDevsger,
278 MasculineOnset,
280 Onset,
282 Particle,
284 PostBowed,
286 VowelDevsger,
288}
289
290#[rustfmt::skip]
291impl Condition {
292 pub const ALL: [Condition; 13] = [
294 Condition::Chachlag,
295 Condition::ChachlagOnset,
296 Condition::ChachlagOnsetGb,
297 Condition::Devsger,
298 Condition::Dotless,
299 Condition::Feminine,
300 Condition::Marked,
301 Condition::MasculineDevsger,
302 Condition::MasculineOnset,
303 Condition::Onset,
304 Condition::Particle,
305 Condition::PostBowed,
306 Condition::VowelDevsger,
307 ];
308
309 pub const fn as_str(self) -> &'static str {
311 match self {
312 Condition::Chachlag => "chachlag",
313 Condition::ChachlagOnset => "chachlag_onset",
314 Condition::ChachlagOnsetGb => "chachlag_onset_gb",
315 Condition::Devsger => "devsger",
316 Condition::Dotless => "dotless",
317 Condition::Feminine => "feminine",
318 Condition::Marked => "marked",
319 Condition::MasculineDevsger => "masculine_devsger",
320 Condition::MasculineOnset => "masculine_onset",
321 Condition::Onset => "onset",
322 Condition::Particle => "particle",
323 Condition::PostBowed => "post_bowed",
324 Condition::VowelDevsger => "vowel_devsger",
325 }
326 }
327}
328
329#[rustfmt::skip]
330impl FromStr for Condition {
331 type Err = Error;
332
333 fn from_str(name: &str) -> Result<Condition, Error> {
334 match name {
335 "chachlag" => Ok(Condition::Chachlag),
336 "chachlag_onset" => Ok(Condition::ChachlagOnset),
337 "chachlag_onset_gb" => Ok(Condition::ChachlagOnsetGb),
338 "devsger" => Ok(Condition::Devsger),
339 "dotless" => Ok(Condition::Dotless),
340 "feminine" => Ok(Condition::Feminine),
341 "marked" => Ok(Condition::Marked),
342 "masculine_devsger" => Ok(Condition::MasculineDevsger),
343 "masculine_onset" => Ok(Condition::MasculineOnset),
344 "onset" => Ok(Condition::Onset),
345 "particle" => Ok(Condition::Particle),
346 "post_bowed" => Ok(Condition::PostBowed),
347 "vowel_devsger" => Ok(Condition::VowelDevsger),
348 _ => Err(Error::UnknownName { kind: "condition", name: name.to_owned() }),
349 }
350 }
351}
352
353#[rustfmt::skip]
354impl fmt::Display for Condition {
355 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
356 formatter.write_str(self.as_str())
357 }
358}
359
360#[non_exhaustive]
362#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
363#[rustfmt::skip]
364pub enum Alias {
365 A,
367 B,
369 C,
371 Ch,
373 Cr,
375 D,
377 E,
379 Ee,
381 F,
383 G,
385 H,
387 Hh,
389 I,
391 J,
393 K,
395 K2,
397 L,
399 Lh,
401 M,
403 N,
405 Ng,
407 O,
409 Oe,
411 P,
413 R,
415 Rh,
417 S,
419 Sh,
421 T,
423 U,
425 Ue,
427 W,
429 Y,
431 Z,
433 Zr,
435}
436
437#[rustfmt::skip]
438impl Alias {
439 pub const ALL: [Alias; 35] = [
441 Alias::A,
442 Alias::B,
443 Alias::C,
444 Alias::Ch,
445 Alias::Cr,
446 Alias::D,
447 Alias::E,
448 Alias::Ee,
449 Alias::F,
450 Alias::G,
451 Alias::H,
452 Alias::Hh,
453 Alias::I,
454 Alias::J,
455 Alias::K,
456 Alias::K2,
457 Alias::L,
458 Alias::Lh,
459 Alias::M,
460 Alias::N,
461 Alias::Ng,
462 Alias::O,
463 Alias::Oe,
464 Alias::P,
465 Alias::R,
466 Alias::Rh,
467 Alias::S,
468 Alias::Sh,
469 Alias::T,
470 Alias::U,
471 Alias::Ue,
472 Alias::W,
473 Alias::Y,
474 Alias::Z,
475 Alias::Zr,
476 ];
477
478 pub const fn as_str(self) -> &'static str {
480 match self {
481 Alias::A => "a",
482 Alias::B => "b",
483 Alias::C => "c",
484 Alias::Ch => "ch",
485 Alias::Cr => "cr",
486 Alias::D => "d",
487 Alias::E => "e",
488 Alias::Ee => "ee",
489 Alias::F => "f",
490 Alias::G => "g",
491 Alias::H => "h",
492 Alias::Hh => "hh",
493 Alias::I => "i",
494 Alias::J => "j",
495 Alias::K => "k",
496 Alias::K2 => "k2",
497 Alias::L => "l",
498 Alias::Lh => "lh",
499 Alias::M => "m",
500 Alias::N => "n",
501 Alias::Ng => "ng",
502 Alias::O => "o",
503 Alias::Oe => "oe",
504 Alias::P => "p",
505 Alias::R => "r",
506 Alias::Rh => "rh",
507 Alias::S => "s",
508 Alias::Sh => "sh",
509 Alias::T => "t",
510 Alias::U => "u",
511 Alias::Ue => "ue",
512 Alias::W => "w",
513 Alias::Y => "y",
514 Alias::Z => "z",
515 Alias::Zr => "zr",
516 }
517 }
518}
519
520#[rustfmt::skip]
521impl FromStr for Alias {
522 type Err = Error;
523
524 fn from_str(name: &str) -> Result<Alias, Error> {
525 match name {
526 "a" => Ok(Alias::A),
527 "b" => Ok(Alias::B),
528 "c" => Ok(Alias::C),
529 "ch" => Ok(Alias::Ch),
530 "cr" => Ok(Alias::Cr),
531 "d" => Ok(Alias::D),
532 "e" => Ok(Alias::E),
533 "ee" => Ok(Alias::Ee),
534 "f" => Ok(Alias::F),
535 "g" => Ok(Alias::G),
536 "h" => Ok(Alias::H),
537 "hh" => Ok(Alias::Hh),
538 "i" => Ok(Alias::I),
539 "j" => Ok(Alias::J),
540 "k" => Ok(Alias::K),
541 "k2" => Ok(Alias::K2),
542 "l" => Ok(Alias::L),
543 "lh" => Ok(Alias::Lh),
544 "m" => Ok(Alias::M),
545 "n" => Ok(Alias::N),
546 "ng" => Ok(Alias::Ng),
547 "o" => Ok(Alias::O),
548 "oe" => Ok(Alias::Oe),
549 "p" => Ok(Alias::P),
550 "r" => Ok(Alias::R),
551 "rh" => Ok(Alias::Rh),
552 "s" => Ok(Alias::S),
553 "sh" => Ok(Alias::Sh),
554 "t" => Ok(Alias::T),
555 "u" => Ok(Alias::U),
556 "ue" => Ok(Alias::Ue),
557 "w" => Ok(Alias::W),
558 "y" => Ok(Alias::Y),
559 "z" => Ok(Alias::Z),
560 "zr" => Ok(Alias::Zr),
561 _ => Err(Error::UnknownName { kind: "alias", name: name.to_owned() }),
562 }
563 }
564}
565
566#[rustfmt::skip]
567impl fmt::Display for Alias {
568 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
569 formatter.write_str(self.as_str())
570 }
571}