Skip to main content

mongol_norm/generated/
enums.rs

1// @generated by scripts/gen_rust_tables.py -- DO NOT EDIT.
2// Source: mongol_norm/data/MNG.json (sha256 5e99d2f2b0abe022)
3// Source: mongol_norm/data/TOD.json (sha256 36a25a2f6a53a0d8)
4// Source: mongol_norm/data/SIB.json (sha256 97551f578d67b2b1)
5// Source: mongol_norm/data/MCH.json (sha256 e1e00127e0812ecb)
6
7use std::fmt;
8use std::str::FromStr;
9
10use crate::Error;
11
12/// A written unit: an opaque glyph-form identifier produced by shaping (see `docs/data-format.md`). The structural tokens `Mvs`, `Nirugu` and `Zwj` are members too: they appear verbatim in [`Shaper::shape`](crate::Shaper::shape) output, exactly as the Python implementation emits them.
13#[non_exhaustive]
14#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
15#[rustfmt::skip]
16pub enum WrittenUnit {
17    /// Written unit `A`.
18    A,
19    /// Written unit `Aa`.
20    Aa,
21    /// Written unit `Ah`.
22    Ah,
23    /// Written unit `Ai`.
24    Ai,
25    /// Written unit `At`.
26    At,
27    /// Written unit `B`.
28    B,
29    /// Written unit `B2`.
30    B2,
31    /// Written unit `C`.
32    C,
33    /// Written unit `Cc`.
34    Cc,
35    /// Written unit `Ch`.
36    Ch,
37    /// Written unit `Cp`.
38    Cp,
39    /// Written unit `Cr`.
40    Cr,
41    /// Written unit `Cs`.
42    Cs,
43    /// Written unit `D`.
44    D,
45    /// Written unit `Db`.
46    Db,
47    /// Written unit `Dd`.
48    Dd,
49    /// Written unit `Dh`.
50    Dh,
51    /// Written unit `Dp`.
52    Dp,
53    /// Written unit `Dt`.
54    Dt,
55    /// Written unit `E`.
56    E,
57    /// Written unit `F`.
58    F,
59    /// Written unit `G`.
60    G,
61    /// Written unit `G2`.
62    G2,
63    /// Written unit `G3`.
64    G3,
65    /// Written unit `G4`.
66    G4,
67    /// Written unit `Gc`.
68    Gc,
69    /// Written unit `Gh`.
70    Gh,
71    /// Written unit `Gp`.
72    Gp,
73    /// Written unit `Gx`.
74    Gx,
75    /// Written unit `H`.
76    H,
77    /// Written unit `Hb`.
78    Hb,
79    /// Written unit `Hc`.
80    Hc,
81    /// Written unit `Hh`.
82    Hh,
83    /// Written unit `Hp`.
84    Hp,
85    /// Written unit `Hr`.
86    Hr,
87    /// Written unit `Hx`.
88    Hx,
89    /// Written unit `Hx2`.
90    Hx2,
91    /// Written unit `I`.
92    I,
93    /// Written unit `I3`.
94    I3,
95    /// Written unit `Ic`.
96    Ic,
97    /// Written unit `Ip`.
98    Ip,
99    /// Written unit `Ix`.
100    Ix,
101    /// Written unit `Iy`.
102    Iy,
103    /// Written unit `J`.
104    J,
105    /// Written unit `J2`.
106    J2,
107    /// Written unit `Jb`.
108    Jb,
109    /// Written unit `Jc`.
110    Jc,
111    /// Written unit `K`.
112    K,
113    /// Written unit `K2`.
114    K2,
115    /// Written unit `Kc`.
116    Kc,
117    /// Written unit `Kh`.
118    Kh,
119    /// Written unit `Kp`.
120    Kp,
121    /// Written unit `L`.
122    L,
123    /// Written unit `Lv`.
124    Lv,
125    /// Written unit `M`.
126    M,
127    /// Written unit `M2`.
128    M2,
129    /// Structural token: Mongolian vowel separator U+180E (NNBSP U+202F is folded into it).
130    Mvs,
131    /// Written unit `N`.
132    N,
133    /// Written unit `N2`.
134    N2,
135    /// Structural token: nirugu U+180A, the visible stem extender.
136    Nirugu,
137    /// Written unit `Nx`.
138    Nx,
139    /// Written unit `Ny`.
140    Ny,
141    /// Written unit `O`.
142    O,
143    /// Written unit `Ob`.
144    Ob,
145    /// Written unit `Oh`.
146    Oh,
147    /// Written unit `Op`.
148    Op,
149    /// Written unit `Ot`.
150    Ot,
151    /// Written unit `P`.
152    P,
153    /// Written unit `Pb`.
154    Pb,
155    /// Written unit `Pp`.
156    Pp,
157    /// Written unit `R`.
158    R,
159    /// Written unit `R2`.
160    R2,
161    /// Written unit `R3`.
162    R3,
163    /// Written unit `Rh`.
164    Rh,
165    /// Written unit `Rr`.
166    Rr,
167    /// Written unit `S`.
168    S,
169    /// Written unit `Sh`.
170    Sh,
171    /// Written unit `Sp`.
172    Sp,
173    /// Written unit `Sz`.
174    Sz,
175    /// Written unit `T`.
176    T,
177    /// Written unit `Tb`.
178    Tb,
179    /// Written unit `Th`.
180    Th,
181    /// Written unit `Tp`.
182    Tp,
183    /// Written unit `Tt`.
184    Tt,
185    /// Written unit `U`.
186    U,
187    /// Written unit `Ue`.
188    Ue,
189    /// Written unit `Uh`.
190    Uh,
191    /// Written unit `Up`.
192    Up,
193    /// Written unit `Ux`.
194    Ux,
195    /// Written unit `V`.
196    V,
197    /// Written unit `W`.
198    W,
199    /// Written unit `Wb`.
200    Wb,
201    /// Written unit `Y`.
202    Y,
203    /// Written unit `Yp`.
204    Yp,
205    /// Written unit `Z`.
206    Z,
207    /// Written unit `Zc`.
208    Zc,
209    /// Written unit `Zr`.
210    Zr,
211    /// Written unit `Zs`.
212    Zs,
213    /// Written unit `Zs2`.
214    Zs2,
215    /// Structural token: zero width joiner U+200D.
216    Zwj,
217    /// Written unit `Zz`.
218    Zz,
219}
220
221#[rustfmt::skip]
222impl WrittenUnit {
223    /// Every variant, in declaration (sorted contract-name) order.
224    pub const ALL: [WrittenUnit; 101] = [
225        WrittenUnit::A,
226        WrittenUnit::Aa,
227        WrittenUnit::Ah,
228        WrittenUnit::Ai,
229        WrittenUnit::At,
230        WrittenUnit::B,
231        WrittenUnit::B2,
232        WrittenUnit::C,
233        WrittenUnit::Cc,
234        WrittenUnit::Ch,
235        WrittenUnit::Cp,
236        WrittenUnit::Cr,
237        WrittenUnit::Cs,
238        WrittenUnit::D,
239        WrittenUnit::Db,
240        WrittenUnit::Dd,
241        WrittenUnit::Dh,
242        WrittenUnit::Dp,
243        WrittenUnit::Dt,
244        WrittenUnit::E,
245        WrittenUnit::F,
246        WrittenUnit::G,
247        WrittenUnit::G2,
248        WrittenUnit::G3,
249        WrittenUnit::G4,
250        WrittenUnit::Gc,
251        WrittenUnit::Gh,
252        WrittenUnit::Gp,
253        WrittenUnit::Gx,
254        WrittenUnit::H,
255        WrittenUnit::Hb,
256        WrittenUnit::Hc,
257        WrittenUnit::Hh,
258        WrittenUnit::Hp,
259        WrittenUnit::Hr,
260        WrittenUnit::Hx,
261        WrittenUnit::Hx2,
262        WrittenUnit::I,
263        WrittenUnit::I3,
264        WrittenUnit::Ic,
265        WrittenUnit::Ip,
266        WrittenUnit::Ix,
267        WrittenUnit::Iy,
268        WrittenUnit::J,
269        WrittenUnit::J2,
270        WrittenUnit::Jb,
271        WrittenUnit::Jc,
272        WrittenUnit::K,
273        WrittenUnit::K2,
274        WrittenUnit::Kc,
275        WrittenUnit::Kh,
276        WrittenUnit::Kp,
277        WrittenUnit::L,
278        WrittenUnit::Lv,
279        WrittenUnit::M,
280        WrittenUnit::M2,
281        WrittenUnit::Mvs,
282        WrittenUnit::N,
283        WrittenUnit::N2,
284        WrittenUnit::Nirugu,
285        WrittenUnit::Nx,
286        WrittenUnit::Ny,
287        WrittenUnit::O,
288        WrittenUnit::Ob,
289        WrittenUnit::Oh,
290        WrittenUnit::Op,
291        WrittenUnit::Ot,
292        WrittenUnit::P,
293        WrittenUnit::Pb,
294        WrittenUnit::Pp,
295        WrittenUnit::R,
296        WrittenUnit::R2,
297        WrittenUnit::R3,
298        WrittenUnit::Rh,
299        WrittenUnit::Rr,
300        WrittenUnit::S,
301        WrittenUnit::Sh,
302        WrittenUnit::Sp,
303        WrittenUnit::Sz,
304        WrittenUnit::T,
305        WrittenUnit::Tb,
306        WrittenUnit::Th,
307        WrittenUnit::Tp,
308        WrittenUnit::Tt,
309        WrittenUnit::U,
310        WrittenUnit::Ue,
311        WrittenUnit::Uh,
312        WrittenUnit::Up,
313        WrittenUnit::Ux,
314        WrittenUnit::V,
315        WrittenUnit::W,
316        WrittenUnit::Wb,
317        WrittenUnit::Y,
318        WrittenUnit::Yp,
319        WrittenUnit::Z,
320        WrittenUnit::Zc,
321        WrittenUnit::Zr,
322        WrittenUnit::Zs,
323        WrittenUnit::Zs2,
324        WrittenUnit::Zwj,
325        WrittenUnit::Zz,
326    ];
327
328    /// The contract name used by the Python API, the CLI and the data files.
329    pub const fn as_str(self) -> &'static str {
330        match self {
331            WrittenUnit::A => "A",
332            WrittenUnit::Aa => "Aa",
333            WrittenUnit::Ah => "Ah",
334            WrittenUnit::Ai => "Ai",
335            WrittenUnit::At => "At",
336            WrittenUnit::B => "B",
337            WrittenUnit::B2 => "B2",
338            WrittenUnit::C => "C",
339            WrittenUnit::Cc => "Cc",
340            WrittenUnit::Ch => "Ch",
341            WrittenUnit::Cp => "Cp",
342            WrittenUnit::Cr => "Cr",
343            WrittenUnit::Cs => "Cs",
344            WrittenUnit::D => "D",
345            WrittenUnit::Db => "Db",
346            WrittenUnit::Dd => "Dd",
347            WrittenUnit::Dh => "Dh",
348            WrittenUnit::Dp => "Dp",
349            WrittenUnit::Dt => "Dt",
350            WrittenUnit::E => "E",
351            WrittenUnit::F => "F",
352            WrittenUnit::G => "G",
353            WrittenUnit::G2 => "G2",
354            WrittenUnit::G3 => "G3",
355            WrittenUnit::G4 => "G4",
356            WrittenUnit::Gc => "Gc",
357            WrittenUnit::Gh => "Gh",
358            WrittenUnit::Gp => "Gp",
359            WrittenUnit::Gx => "Gx",
360            WrittenUnit::H => "H",
361            WrittenUnit::Hb => "Hb",
362            WrittenUnit::Hc => "Hc",
363            WrittenUnit::Hh => "Hh",
364            WrittenUnit::Hp => "Hp",
365            WrittenUnit::Hr => "Hr",
366            WrittenUnit::Hx => "Hx",
367            WrittenUnit::Hx2 => "Hx2",
368            WrittenUnit::I => "I",
369            WrittenUnit::I3 => "I3",
370            WrittenUnit::Ic => "Ic",
371            WrittenUnit::Ip => "Ip",
372            WrittenUnit::Ix => "Ix",
373            WrittenUnit::Iy => "Iy",
374            WrittenUnit::J => "J",
375            WrittenUnit::J2 => "J2",
376            WrittenUnit::Jb => "Jb",
377            WrittenUnit::Jc => "Jc",
378            WrittenUnit::K => "K",
379            WrittenUnit::K2 => "K2",
380            WrittenUnit::Kc => "Kc",
381            WrittenUnit::Kh => "Kh",
382            WrittenUnit::Kp => "Kp",
383            WrittenUnit::L => "L",
384            WrittenUnit::Lv => "Lv",
385            WrittenUnit::M => "M",
386            WrittenUnit::M2 => "M2",
387            WrittenUnit::Mvs => "Mvs",
388            WrittenUnit::N => "N",
389            WrittenUnit::N2 => "N2",
390            WrittenUnit::Nirugu => "Nirugu",
391            WrittenUnit::Nx => "Nx",
392            WrittenUnit::Ny => "Ny",
393            WrittenUnit::O => "O",
394            WrittenUnit::Ob => "Ob",
395            WrittenUnit::Oh => "Oh",
396            WrittenUnit::Op => "Op",
397            WrittenUnit::Ot => "Ot",
398            WrittenUnit::P => "P",
399            WrittenUnit::Pb => "Pb",
400            WrittenUnit::Pp => "Pp",
401            WrittenUnit::R => "R",
402            WrittenUnit::R2 => "R2",
403            WrittenUnit::R3 => "R3",
404            WrittenUnit::Rh => "Rh",
405            WrittenUnit::Rr => "Rr",
406            WrittenUnit::S => "S",
407            WrittenUnit::Sh => "Sh",
408            WrittenUnit::Sp => "Sp",
409            WrittenUnit::Sz => "Sz",
410            WrittenUnit::T => "T",
411            WrittenUnit::Tb => "Tb",
412            WrittenUnit::Th => "Th",
413            WrittenUnit::Tp => "Tp",
414            WrittenUnit::Tt => "Tt",
415            WrittenUnit::U => "U",
416            WrittenUnit::Ue => "Ue",
417            WrittenUnit::Uh => "Uh",
418            WrittenUnit::Up => "Up",
419            WrittenUnit::Ux => "Ux",
420            WrittenUnit::V => "V",
421            WrittenUnit::W => "W",
422            WrittenUnit::Wb => "Wb",
423            WrittenUnit::Y => "Y",
424            WrittenUnit::Yp => "Yp",
425            WrittenUnit::Z => "Z",
426            WrittenUnit::Zc => "Zc",
427            WrittenUnit::Zr => "Zr",
428            WrittenUnit::Zs => "Zs",
429            WrittenUnit::Zs2 => "Zs2",
430            WrittenUnit::Zwj => "Zwj",
431            WrittenUnit::Zz => "Zz",
432        }
433    }
434
435    /// `true` for the structural tokens `Mvs`, `Nirugu` and `Zwj`.
436    pub const fn is_structural(self) -> bool {
437        matches!(self, WrittenUnit::Mvs | WrittenUnit::Nirugu | WrittenUnit::Zwj)
438    }
439}
440
441#[rustfmt::skip]
442impl FromStr for WrittenUnit {
443    type Err = Error;
444
445    fn from_str(name: &str) -> Result<WrittenUnit, Error> {
446        match name {
447            "A" => Ok(WrittenUnit::A),
448            "Aa" => Ok(WrittenUnit::Aa),
449            "Ah" => Ok(WrittenUnit::Ah),
450            "Ai" => Ok(WrittenUnit::Ai),
451            "At" => Ok(WrittenUnit::At),
452            "B" => Ok(WrittenUnit::B),
453            "B2" => Ok(WrittenUnit::B2),
454            "C" => Ok(WrittenUnit::C),
455            "Cc" => Ok(WrittenUnit::Cc),
456            "Ch" => Ok(WrittenUnit::Ch),
457            "Cp" => Ok(WrittenUnit::Cp),
458            "Cr" => Ok(WrittenUnit::Cr),
459            "Cs" => Ok(WrittenUnit::Cs),
460            "D" => Ok(WrittenUnit::D),
461            "Db" => Ok(WrittenUnit::Db),
462            "Dd" => Ok(WrittenUnit::Dd),
463            "Dh" => Ok(WrittenUnit::Dh),
464            "Dp" => Ok(WrittenUnit::Dp),
465            "Dt" => Ok(WrittenUnit::Dt),
466            "E" => Ok(WrittenUnit::E),
467            "F" => Ok(WrittenUnit::F),
468            "G" => Ok(WrittenUnit::G),
469            "G2" => Ok(WrittenUnit::G2),
470            "G3" => Ok(WrittenUnit::G3),
471            "G4" => Ok(WrittenUnit::G4),
472            "Gc" => Ok(WrittenUnit::Gc),
473            "Gh" => Ok(WrittenUnit::Gh),
474            "Gp" => Ok(WrittenUnit::Gp),
475            "Gx" => Ok(WrittenUnit::Gx),
476            "H" => Ok(WrittenUnit::H),
477            "Hb" => Ok(WrittenUnit::Hb),
478            "Hc" => Ok(WrittenUnit::Hc),
479            "Hh" => Ok(WrittenUnit::Hh),
480            "Hp" => Ok(WrittenUnit::Hp),
481            "Hr" => Ok(WrittenUnit::Hr),
482            "Hx" => Ok(WrittenUnit::Hx),
483            "Hx2" => Ok(WrittenUnit::Hx2),
484            "I" => Ok(WrittenUnit::I),
485            "I3" => Ok(WrittenUnit::I3),
486            "Ic" => Ok(WrittenUnit::Ic),
487            "Ip" => Ok(WrittenUnit::Ip),
488            "Ix" => Ok(WrittenUnit::Ix),
489            "Iy" => Ok(WrittenUnit::Iy),
490            "J" => Ok(WrittenUnit::J),
491            "J2" => Ok(WrittenUnit::J2),
492            "Jb" => Ok(WrittenUnit::Jb),
493            "Jc" => Ok(WrittenUnit::Jc),
494            "K" => Ok(WrittenUnit::K),
495            "K2" => Ok(WrittenUnit::K2),
496            "Kc" => Ok(WrittenUnit::Kc),
497            "Kh" => Ok(WrittenUnit::Kh),
498            "Kp" => Ok(WrittenUnit::Kp),
499            "L" => Ok(WrittenUnit::L),
500            "Lv" => Ok(WrittenUnit::Lv),
501            "M" => Ok(WrittenUnit::M),
502            "M2" => Ok(WrittenUnit::M2),
503            "Mvs" => Ok(WrittenUnit::Mvs),
504            "N" => Ok(WrittenUnit::N),
505            "N2" => Ok(WrittenUnit::N2),
506            "Nirugu" => Ok(WrittenUnit::Nirugu),
507            "Nx" => Ok(WrittenUnit::Nx),
508            "Ny" => Ok(WrittenUnit::Ny),
509            "O" => Ok(WrittenUnit::O),
510            "Ob" => Ok(WrittenUnit::Ob),
511            "Oh" => Ok(WrittenUnit::Oh),
512            "Op" => Ok(WrittenUnit::Op),
513            "Ot" => Ok(WrittenUnit::Ot),
514            "P" => Ok(WrittenUnit::P),
515            "Pb" => Ok(WrittenUnit::Pb),
516            "Pp" => Ok(WrittenUnit::Pp),
517            "R" => Ok(WrittenUnit::R),
518            "R2" => Ok(WrittenUnit::R2),
519            "R3" => Ok(WrittenUnit::R3),
520            "Rh" => Ok(WrittenUnit::Rh),
521            "Rr" => Ok(WrittenUnit::Rr),
522            "S" => Ok(WrittenUnit::S),
523            "Sh" => Ok(WrittenUnit::Sh),
524            "Sp" => Ok(WrittenUnit::Sp),
525            "Sz" => Ok(WrittenUnit::Sz),
526            "T" => Ok(WrittenUnit::T),
527            "Tb" => Ok(WrittenUnit::Tb),
528            "Th" => Ok(WrittenUnit::Th),
529            "Tp" => Ok(WrittenUnit::Tp),
530            "Tt" => Ok(WrittenUnit::Tt),
531            "U" => Ok(WrittenUnit::U),
532            "Ue" => Ok(WrittenUnit::Ue),
533            "Uh" => Ok(WrittenUnit::Uh),
534            "Up" => Ok(WrittenUnit::Up),
535            "Ux" => Ok(WrittenUnit::Ux),
536            "V" => Ok(WrittenUnit::V),
537            "W" => Ok(WrittenUnit::W),
538            "Wb" => Ok(WrittenUnit::Wb),
539            "Y" => Ok(WrittenUnit::Y),
540            "Yp" => Ok(WrittenUnit::Yp),
541            "Z" => Ok(WrittenUnit::Z),
542            "Zc" => Ok(WrittenUnit::Zc),
543            "Zr" => Ok(WrittenUnit::Zr),
544            "Zs" => Ok(WrittenUnit::Zs),
545            "Zs2" => Ok(WrittenUnit::Zs2),
546            "Zwj" => Ok(WrittenUnit::Zwj),
547            "Zz" => Ok(WrittenUnit::Zz),
548            _ => Err(Error::UnknownName { kind: "written unit", name: name.to_owned() }),
549        }
550    }
551}
552
553#[rustfmt::skip]
554impl fmt::Display for WrittenUnit {
555    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
556        formatter.write_str(self.as_str())
557    }
558}
559
560/// A shaping condition assigned by the rule pipeline; `as_str()` is the data-file name (`chachlag_onset`, ...).
561#[non_exhaustive]
562#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
563#[rustfmt::skip]
564pub enum Condition {
565    /// Shaping condition `chachlag`.
566    Chachlag,
567    /// Shaping condition `chachlag_onset`.
568    ChachlagOnset,
569    /// Shaping condition `chachlag_onset_gb`.
570    ChachlagOnsetGb,
571    /// Shaping condition `devsger`.
572    Devsger,
573    /// Shaping condition `dotless`.
574    Dotless,
575    /// Shaping condition `feminine`.
576    Feminine,
577    /// Shaping condition `feminine_marked`.
578    FeminineMarked,
579    /// Shaping condition `marked`.
580    Marked,
581    /// Shaping condition `masculine_devsger`.
582    MasculineDevsger,
583    /// Shaping condition `masculine_onset`.
584    MasculineOnset,
585    /// Shaping condition `onset`.
586    Onset,
587    /// Shaping condition `particle`.
588    Particle,
589    /// Shaping condition `post_bowed`.
590    PostBowed,
591    /// Shaping condition `post_bowed_feminine`.
592    PostBowedFeminine,
593    /// Shaping condition `vowel_devsger`.
594    VowelDevsger,
595}
596
597#[rustfmt::skip]
598impl Condition {
599    /// Every variant, in declaration (sorted contract-name) order.
600    pub const ALL: [Condition; 15] = [
601        Condition::Chachlag,
602        Condition::ChachlagOnset,
603        Condition::ChachlagOnsetGb,
604        Condition::Devsger,
605        Condition::Dotless,
606        Condition::Feminine,
607        Condition::FeminineMarked,
608        Condition::Marked,
609        Condition::MasculineDevsger,
610        Condition::MasculineOnset,
611        Condition::Onset,
612        Condition::Particle,
613        Condition::PostBowed,
614        Condition::PostBowedFeminine,
615        Condition::VowelDevsger,
616    ];
617
618    /// The contract name used by the Python API, the CLI and the data files.
619    pub const fn as_str(self) -> &'static str {
620        match self {
621            Condition::Chachlag => "chachlag",
622            Condition::ChachlagOnset => "chachlag_onset",
623            Condition::ChachlagOnsetGb => "chachlag_onset_gb",
624            Condition::Devsger => "devsger",
625            Condition::Dotless => "dotless",
626            Condition::Feminine => "feminine",
627            Condition::FeminineMarked => "feminine_marked",
628            Condition::Marked => "marked",
629            Condition::MasculineDevsger => "masculine_devsger",
630            Condition::MasculineOnset => "masculine_onset",
631            Condition::Onset => "onset",
632            Condition::Particle => "particle",
633            Condition::PostBowed => "post_bowed",
634            Condition::PostBowedFeminine => "post_bowed_feminine",
635            Condition::VowelDevsger => "vowel_devsger",
636        }
637    }
638}
639
640#[rustfmt::skip]
641impl FromStr for Condition {
642    type Err = Error;
643
644    fn from_str(name: &str) -> Result<Condition, Error> {
645        match name {
646            "chachlag" => Ok(Condition::Chachlag),
647            "chachlag_onset" => Ok(Condition::ChachlagOnset),
648            "chachlag_onset_gb" => Ok(Condition::ChachlagOnsetGb),
649            "devsger" => Ok(Condition::Devsger),
650            "dotless" => Ok(Condition::Dotless),
651            "feminine" => Ok(Condition::Feminine),
652            "feminine_marked" => Ok(Condition::FeminineMarked),
653            "marked" => Ok(Condition::Marked),
654            "masculine_devsger" => Ok(Condition::MasculineDevsger),
655            "masculine_onset" => Ok(Condition::MasculineOnset),
656            "onset" => Ok(Condition::Onset),
657            "particle" => Ok(Condition::Particle),
658            "post_bowed" => Ok(Condition::PostBowed),
659            "post_bowed_feminine" => Ok(Condition::PostBowedFeminine),
660            "vowel_devsger" => Ok(Condition::VowelDevsger),
661            _ => Err(Error::UnknownName { kind: "condition", name: name.to_owned() }),
662        }
663    }
664}
665
666#[rustfmt::skip]
667impl fmt::Display for Condition {
668    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
669        formatter.write_str(self.as_str())
670    }
671}
672
673/// A letter alias (phonemic short name, locale-relative); `as_str()` is the data-file name (`a`, `oe`, `k2`, ...).
674#[non_exhaustive]
675#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
676#[rustfmt::skip]
677pub enum Alias {
678    /// Letter alias `a`.
679    A,
680    /// Letter alias `b`.
681    B,
682    /// Letter alias `c`.
683    C,
684    /// Letter alias `ch`.
685    Ch,
686    /// Letter alias `cr`.
687    Cr,
688    /// Letter alias `d`.
689    D,
690    /// Letter alias `e`.
691    E,
692    /// Letter alias `ee`.
693    Ee,
694    /// Letter alias `f`.
695    F,
696    /// Letter alias `g`.
697    G,
698    /// Letter alias `gh`.
699    Gh,
700    /// Letter alias `h`.
701    H,
702    /// Letter alias `hh`.
703    Hh,
704    /// Letter alias `i`.
705    I,
706    /// Letter alias `ii`.
707    Ii,
708    /// Letter alias `j`.
709    J,
710    /// Letter alias `jy`.
711    Jy,
712    /// Letter alias `k`.
713    K,
714    /// Letter alias `k2`.
715    K2,
716    /// Letter alias `kh`.
717    Kh,
718    /// Letter alias `l`.
719    L,
720    /// Letter alias `lh`.
721    Lh,
722    /// Letter alias `lvs`.
723    Lvs,
724    /// Letter alias `m`.
725    M,
726    /// Letter alias `n`.
727    N,
728    /// Letter alias `ng`.
729    Ng,
730    /// Letter alias `ny`.
731    Ny,
732    /// Letter alias `o`.
733    O,
734    /// Letter alias `oe`.
735    Oe,
736    /// Letter alias `p`.
737    P,
738    /// Letter alias `r`.
739    R,
740    /// Letter alias `rh`.
741    Rh,
742    /// Letter alias `s`.
743    S,
744    /// Letter alias `sbm`.
745    Sbm,
746    /// Letter alias `sh`.
747    Sh,
748    /// Letter alias `t`.
749    T,
750    /// Letter alias `u`.
751    U,
752    /// Letter alias `ue`.
753    Ue,
754    /// Letter alias `w`.
755    W,
756    /// Letter alias `y`.
757    Y,
758    /// Letter alias `z`.
759    Z,
760    /// Letter alias `zr`.
761    Zr,
762}
763
764#[rustfmt::skip]
765impl Alias {
766    /// Every variant, in declaration (sorted contract-name) order.
767    pub const ALL: [Alias; 42] = [
768        Alias::A,
769        Alias::B,
770        Alias::C,
771        Alias::Ch,
772        Alias::Cr,
773        Alias::D,
774        Alias::E,
775        Alias::Ee,
776        Alias::F,
777        Alias::G,
778        Alias::Gh,
779        Alias::H,
780        Alias::Hh,
781        Alias::I,
782        Alias::Ii,
783        Alias::J,
784        Alias::Jy,
785        Alias::K,
786        Alias::K2,
787        Alias::Kh,
788        Alias::L,
789        Alias::Lh,
790        Alias::Lvs,
791        Alias::M,
792        Alias::N,
793        Alias::Ng,
794        Alias::Ny,
795        Alias::O,
796        Alias::Oe,
797        Alias::P,
798        Alias::R,
799        Alias::Rh,
800        Alias::S,
801        Alias::Sbm,
802        Alias::Sh,
803        Alias::T,
804        Alias::U,
805        Alias::Ue,
806        Alias::W,
807        Alias::Y,
808        Alias::Z,
809        Alias::Zr,
810    ];
811
812    /// The contract name used by the Python API, the CLI and the data files.
813    pub const fn as_str(self) -> &'static str {
814        match self {
815            Alias::A => "a",
816            Alias::B => "b",
817            Alias::C => "c",
818            Alias::Ch => "ch",
819            Alias::Cr => "cr",
820            Alias::D => "d",
821            Alias::E => "e",
822            Alias::Ee => "ee",
823            Alias::F => "f",
824            Alias::G => "g",
825            Alias::Gh => "gh",
826            Alias::H => "h",
827            Alias::Hh => "hh",
828            Alias::I => "i",
829            Alias::Ii => "ii",
830            Alias::J => "j",
831            Alias::Jy => "jy",
832            Alias::K => "k",
833            Alias::K2 => "k2",
834            Alias::Kh => "kh",
835            Alias::L => "l",
836            Alias::Lh => "lh",
837            Alias::Lvs => "lvs",
838            Alias::M => "m",
839            Alias::N => "n",
840            Alias::Ng => "ng",
841            Alias::Ny => "ny",
842            Alias::O => "o",
843            Alias::Oe => "oe",
844            Alias::P => "p",
845            Alias::R => "r",
846            Alias::Rh => "rh",
847            Alias::S => "s",
848            Alias::Sbm => "sbm",
849            Alias::Sh => "sh",
850            Alias::T => "t",
851            Alias::U => "u",
852            Alias::Ue => "ue",
853            Alias::W => "w",
854            Alias::Y => "y",
855            Alias::Z => "z",
856            Alias::Zr => "zr",
857        }
858    }
859}
860
861#[rustfmt::skip]
862impl FromStr for Alias {
863    type Err = Error;
864
865    fn from_str(name: &str) -> Result<Alias, Error> {
866        match name {
867            "a" => Ok(Alias::A),
868            "b" => Ok(Alias::B),
869            "c" => Ok(Alias::C),
870            "ch" => Ok(Alias::Ch),
871            "cr" => Ok(Alias::Cr),
872            "d" => Ok(Alias::D),
873            "e" => Ok(Alias::E),
874            "ee" => Ok(Alias::Ee),
875            "f" => Ok(Alias::F),
876            "g" => Ok(Alias::G),
877            "gh" => Ok(Alias::Gh),
878            "h" => Ok(Alias::H),
879            "hh" => Ok(Alias::Hh),
880            "i" => Ok(Alias::I),
881            "ii" => Ok(Alias::Ii),
882            "j" => Ok(Alias::J),
883            "jy" => Ok(Alias::Jy),
884            "k" => Ok(Alias::K),
885            "k2" => Ok(Alias::K2),
886            "kh" => Ok(Alias::Kh),
887            "l" => Ok(Alias::L),
888            "lh" => Ok(Alias::Lh),
889            "lvs" => Ok(Alias::Lvs),
890            "m" => Ok(Alias::M),
891            "n" => Ok(Alias::N),
892            "ng" => Ok(Alias::Ng),
893            "ny" => Ok(Alias::Ny),
894            "o" => Ok(Alias::O),
895            "oe" => Ok(Alias::Oe),
896            "p" => Ok(Alias::P),
897            "r" => Ok(Alias::R),
898            "rh" => Ok(Alias::Rh),
899            "s" => Ok(Alias::S),
900            "sbm" => Ok(Alias::Sbm),
901            "sh" => Ok(Alias::Sh),
902            "t" => Ok(Alias::T),
903            "u" => Ok(Alias::U),
904            "ue" => Ok(Alias::Ue),
905            "w" => Ok(Alias::W),
906            "y" => Ok(Alias::Y),
907            "z" => Ok(Alias::Z),
908            "zr" => Ok(Alias::Zr),
909            _ => Err(Error::UnknownName { kind: "alias", name: name.to_owned() }),
910        }
911    }
912}
913
914#[rustfmt::skip]
915impl fmt::Display for Alias {
916    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
917        formatter.write_str(self.as_str())
918    }
919}