1use allocative::Allocative;
2use serde::{Deserialize, Serialize};
3
4pub trait ToGrammem {
5 fn to_grammem(self) -> Grammem;
6}
7
8#[rustfmt::skip]
9#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
10#[display(fmt = "{}", _0.display())]
11#[serde(untagged)]
12pub enum Grammem {
13 ParteSpeech(ParteSpeech),
15 Animacy(Animacy),
17 Aspect(Aspect),
19 Case(Case),
21 Gender(Gender),
22 Involvement(Involvement),
24 Mood(Mood),
26 Number(Number),
28 Trans(Transitivity),
30 Tense(Tense),
32 Voice(Voice),
34 Person(Person),
36 Other(Other),
37}
38
39impl Grammem {
40 pub fn pos(&self) -> Option<ParteSpeech> {
41 match self {
42 Grammem::ParteSpeech(p) => Some(*p),
43 _ => None,
44 }
45 }
46
47 pub fn pos_in_tag(vec: &[Self]) -> Option<ParteSpeech> {
48 vec.iter().find_map(|t| t.pos())
49 }
50}
51
52#[rustfmt::skip]
53#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
54#[display(fmt = "{}", _0.display())]
55pub enum ParteSpeech {
56 #[serde(rename = "NOUN")]
57 Noun,
58 #[serde(rename = "ADJF")]
59 AdjectiveFull,
61 #[serde(rename = "ADJS")]
62 AdjectiveShort,
64 #[serde(rename = "COMP")]
65 Comparative,
67 #[serde(rename = "VERB")]
68 Verb,
70 #[serde(rename = "INFN")]
71 Infinitive,
73 #[serde(rename = "PRTF")]
74 ParticipleFull,
76 #[serde(rename = "PRTS")]
77 ParticipleShort,
79 #[serde(rename = "GRND")]
80 Gerundive,
81 #[serde(rename = "NUMR")]
82 Number,
83 #[serde(rename = "ADVB")]
84 Adverb,
86 #[serde(rename = "NPRO")]
87 NounPronoun,
89 #[serde(rename = "PRED")]
90 Predicative,
92 #[serde(rename = "PREP")]
93 Preposition,
95 #[serde(rename = "CONJ")]
96 Conjunction,
98 #[serde(rename = "PRCL")]
99 Particle,
101 #[serde(rename = "INTJ")]
102 Interjection,
104}
105
106impl ToGrammem for ParteSpeech {
107 fn to_grammem(self) -> Grammem {
108 Grammem::ParteSpeech(self)
109 }
110}
111
112#[rustfmt::skip]
113#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord, Allocative)]
114pub enum Form {
115 Word(FWord),
116 Vanga(FVanga),
117}
118
119impl Form {
120 pub fn switch_vanga(self) -> Self {
121 match self {
122 Form::Word(w) => match w {
123 FWord::Normal(_) => Form::Vanga(FVanga::Normal),
124 FWord::Inizio(_) => Form::Vanga(FVanga::Inizio),
125 FWord::Different(_) => Form::Vanga(FVanga::Different),
126 },
127 v => v,
128 }
129 }
130
131 pub fn is_normal(&self) -> bool {
132 match self {
133 Form::Word(w) => matches!(w, FWord::Normal(_)),
134 Form::Vanga(v) => matches!(v, FVanga::Normal),
135 }
136 }
137
138 pub fn is_inizio(&self) -> bool {
139 match self {
140 Form::Word(w) => matches!(w, FWord::Inizio(_)),
141 Form::Vanga(v) => matches!(v, FVanga::Inizio),
142 }
143 }
144
145 pub fn id(&self) -> Option<u64> {
146 match self {
147 Form::Word(FWord::Normal(i)) => Some(*i),
148 Form::Word(FWord::Inizio(i)) => Some(*i),
149 Form::Word(FWord::Different(i)) => Some(*i),
150 _ => None,
151 }
152 }
153}
154
155#[rustfmt::skip]
156#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord, Allocative)]
157pub enum FWord {
158 #[display(fmt = "Normal {_0}")]
159 Normal(u64),
160 #[display(fmt = "Inizio {_0}")]
163 Inizio(u64),
164 #[display(fmt = "Not normalize {_0}")]
165 Different(u64),
166}
167
168#[rustfmt::skip]
169#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord, Allocative)]
170pub enum FVanga {
171 Normal,
172 Inizio,
175 Different,
176}
177
178#[rustfmt::skip]
179#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
180#[display(fmt = "{}", _0.display())]
181#[serde(rename = "$value")]
182pub enum Person {
183 #[serde(rename = "1per")]
184 First,
185 #[serde(rename = "2per")]
186 Second,
187 #[serde(rename = "3per")]
188 Third,
189 #[serde(rename = "Impe")]
190 Impersonal,
191 #[serde(rename = "Impx")]
192 PossibleImpersonal,
193}
194
195impl ToGrammem for Person {
196 fn to_grammem(self) -> Grammem {
197 Grammem::Person(self)
198 }
199}
200
201#[rustfmt::skip]
202#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
203#[display(fmt = "{}", _0.display())]
204#[serde(rename = "$value")]
205pub enum Animacy {
206 #[serde(rename = "anim")]
207 Animate,
208 #[serde(rename = "inan")]
209 Inanimate,
210 #[serde(rename = "Inmx")]
212 Both,
213}
214
215impl ToGrammem for Animacy {
216 fn to_grammem(self) -> Grammem {
217 Grammem::Animacy(self)
218 }
219}
220
221#[rustfmt::skip]
222#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
223#[display(fmt = "{}", _0.display())]
224#[serde(rename = "$value")]
225pub enum Aspect {
226 #[serde(rename = "perf")]
227 Perfetto,
229 #[serde(rename = "impf")]
230 Imperfetto,
232}
233
234impl ToGrammem for Aspect {
235 fn to_grammem(self) -> Grammem {
236 Grammem::Aspect(self)
237 }
238}
239
240#[rustfmt::skip]
241#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
242#[display(fmt = "{}", _0.display())]
243#[serde(rename = "$value")]
244pub enum Number {
245 #[serde(rename = "sing")]
246 Singular,
247 #[serde(rename = "plur")]
248 Plural,
249 #[serde(rename = "Sgtm")]
250 SingulariaTantum,
252 #[serde(rename = "Pltm")]
254 PluraliaTantum,
255}
256
257impl ToGrammem for Number {
258 fn to_grammem(self) -> Grammem {
259 Grammem::Number(self)
260 }
261}
262
263impl Number {
264 pub fn to_default(self) -> Self {
265 match self {
266 Number::Plural => Number::Singular,
267 otherwise => otherwise,
268 }
269 }
270}
271
272#[rustfmt::skip]
273#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
274#[display(fmt = "{}", _0.display())]
275#[serde(rename = "$value")]
276pub enum Transitivity {
277 #[serde(rename = "tran")]
278 Transitive,
280 #[serde(rename = "intr")]
281 Intransitive,
283}
284
285impl ToGrammem for Transitivity {
286 fn to_grammem(self) -> Grammem {
287 Grammem::Trans(self)
288 }
289}
290
291#[rustfmt::skip]
292#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
293#[display(fmt = "{}", _0.display())]
294#[serde(rename = "$value")]
295pub enum Tense {
296 #[serde(rename = "past")]
297 Past,
298 #[serde(rename = "pres")]
299 Present,
300 #[serde(rename = "futr")]
301 Future,
302}
303
304impl ToGrammem for Tense {
305 fn to_grammem(self) -> Grammem {
306 Grammem::Tense(self)
307 }
308}
309
310#[rustfmt::skip]
311#[derive(Debug, derive_more::Display, Default, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
312#[display(fmt = "{}", _0.display())]
313#[serde(rename = "$value")]
314pub enum Case {
315 #[serde(rename = "Fixd")]
317 Fixed,
318 #[default]
320 #[serde(rename = "nomn")]
321 Nominativus,
322 #[serde(rename = "gent")]
324 #[serde(alias = "gen1")]
326 Genetivus,
327 #[serde(rename = "datv")]
329 Dativus,
330 #[serde(rename = "accs")]
332 #[serde(alias = "acc1")]
334 Accusativus,
335 #[serde(rename = "ablt")]
337 Ablativus,
338 #[serde(rename = "loct")]
340 #[serde(alias = "loc1")]
342 Locativus,
343 #[serde(rename = "voct")]
345 Vocativus,
346
347 #[serde(rename = "gen2")]
348 Gen2,
349 #[serde(rename = "acc2")]
350 Acc2,
351 #[serde(rename = "loc2")]
352 Loc2,
353}
354
355impl ToGrammem for Case {
356 fn to_grammem(self) -> Grammem {
357 Grammem::Case(self)
358 }
359}
360
361#[rustfmt::skip]
362#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
363#[display(fmt = "{}", _0.display())]
364#[serde(rename = "$value")]
365#[allow(clippy::enum_variant_names)]
366pub enum Gender {
367 #[serde(rename = "masc")]
368 Masculine,
369 #[serde(rename = "femn")]
370 Feminine,
371 #[serde(rename = "neut")]
372 Neutral,
373 #[serde(rename = "ms-f")]
375 Common,
376 #[serde(rename = "Ms-f")]
378 CommonWavering,
379 #[serde(rename = "GNdr")]
381 GenderNeutral,
382
383}
384
385impl ToGrammem for Gender {
386 fn to_grammem(self) -> Grammem {
387 Grammem::Gender(self)
388 }
389}
390
391#[rustfmt::skip]
392#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
393#[display(fmt = "{}", _0.display())]
394#[serde(rename = "$value")]
395pub enum Mood {
396 #[serde(rename = "indc")]
397 Indicativo,
399 #[serde(rename = "impr")]
400 Imperativo,
402}
403
404impl ToGrammem for Mood {
405 fn to_grammem(self) -> Grammem {
406 Grammem::Mood(self)
407 }
408}
409
410#[rustfmt::skip]
411#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
412#[display(fmt = "{}", _0.display())]
413#[serde(rename = "$value")]
414pub enum Voice {
415 #[serde(rename = "actv")]
416 Active,
418 #[serde(rename = "pssv")]
419 Passive,
421}
422
423impl ToGrammem for Voice {
424 fn to_grammem(self) -> Grammem {
425 Grammem::Voice(self)
426 }
427}
428
429#[rustfmt::skip]
430#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
431#[display(fmt = "{}", _0.display())]
432#[serde(rename = "$value")]
433pub enum Involvement {
434 #[serde(rename = "incl")]
435 Incluso,
437 #[serde(rename = "excl")]
438 Excluso,
440}
441
442impl ToGrammem for Involvement {
443 fn to_grammem(self) -> Grammem {
444 Grammem::Involvement(self)
445 }
446}
447
448#[rustfmt::skip]
449#[derive(Debug, derive_more::Display, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
450#[display(fmt = "{}", _0.display())]
451#[serde(rename = "$value")]
452#[allow(clippy::enum_variant_names)]
453pub enum Other {
454 #[serde(rename = "Abbr")]
456 Abbreviation,
457 #[serde(rename = "Name")]
458 Name,
459 #[serde(rename = "Surn")]
460 Surname,
461 #[serde(rename = "Patr")]
462 Patronymic,
463 #[serde(rename = "Geox")]
464 Geography,
465 #[serde(rename = "Orgn")]
466 Organization,
467 #[serde(rename = "Trad")]
468 Trademark,
469
470 #[serde(rename = "Subx")]
472 PossibleSubstantive,
473 #[serde(rename = "Supr")]
475 Superior,
476 #[serde(rename = "Qual")]
478 Quality,
479 #[serde(rename = "Apro")]
481 Pronominal,
482 #[serde(rename = "Anum")]
484 Ordinal,
485 #[serde(rename = "Poss")]
487 Possessive,
488 #[serde(rename = "Ques")]
490 Questionable,
491 #[serde(rename = "Dmns")]
493 Demonstrative,
494 #[serde(rename = "Anph")]
496 Anaphoric,
497
498 #[serde(rename = "Cmp2")]
500 Comparative,
501 #[serde(rename = "V-ey")]
503 FormEY,
504 #[serde(rename = "V-oy")]
506 FormOY,
507 #[serde(rename = "V-ej")]
509 FormEJ,
510 #[serde(rename = "V-be")]
512 FormBE,
513 #[serde(rename = "V-en")]
515 FormENEN,
516 #[serde(rename = "V-ie")]
518 FormIE,
519 #[serde(rename = "V-bi")]
521 FormBI,
522 #[serde(rename = "V-sh")]
524 ParticipleSH,
525
526 #[serde(rename = "Mult")]
528 Multiple,
529 #[serde(rename = "Refl")]
531 Reflessivo,
532 #[serde(rename = "Infr")]
534 Spoken,
535 #[serde(rename = "Slng")]
537 Slang,
538 #[serde(rename = "Arch")]
540 Archaic,
541 #[serde(rename = "Litr")]
543 Literary,
544 #[serde(rename = "Erro")]
546 Error,
547 #[serde(rename = "Dist")]
549 Distortion,
550 #[serde(rename = "Prnt")]
552 Parenthesis,
553 #[serde(rename = "Fimp")]
555 ImperfectiveParticiple,
556 #[serde(rename = "Prdx")]
558 PossiblePredicative,
559 #[serde(rename = "Coun")]
561 Countable,
562 #[serde(rename = "Coll")]
564 Collection,
565 #[serde(rename = "Af-p")]
567 AfterPreposition,
568 #[serde(rename = "Vpre")]
570 PrepositionVariant,
571 #[serde(rename = "Init")]
573 Initial,
574 #[serde(rename = "Adjx")]
576 PossibleAdjective,
577 #[serde(rename = "Hypo")]
579 Hypothetical,
580 #[serde(other)]
581 Other,
582}
583
584impl ToGrammem for Other {
585 fn to_grammem(self) -> Grammem {
586 Grammem::Other(self)
587 }
588}