morph_rs/morph/
grammemes.rs

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    /// Часть речи
14    ParteSpeech(ParteSpeech),
15    /// Одушевленность
16    Animacy(Animacy),
17    /// Вид: Совершенный (true), несовершенный (false) вид
18    Aspect(Aspect),
19    /// Падеж
20    Case(Case),
21    Gender(Gender),
22    /// Включенность говорящего в действие
23    Involvement(Involvement),
24    /// Наклонение: повелительное, изъявительное
25    Mood(Mood),
26    /// Лицо: единственное, множественное
27    Number(Number),
28    /// Переходный (true), непереходный (false)
29    Trans(Transitivity),
30    /// Время
31    Tense(Tense),
32    /// Залог
33    Voice(Voice),
34    /// Категория лица
35    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    /// Имя прилагательное в полной форме
60    AdjectiveFull,
61    #[serde(rename = "ADJS")]
62    /// Имя прилагательное в краткой форме
63    AdjectiveShort,
64    #[serde(rename = "COMP")]
65    /// Компаратив
66    Comparative,
67    #[serde(rename = "VERB")]
68    /// Глагол, личная форма
69    Verb,
70    #[serde(rename = "INFN")]
71    /// Глагол, инфинитив
72    Infinitive,
73    #[serde(rename = "PRTF")]
74    /// Причастие полное
75    ParticipleFull,
76    #[serde(rename = "PRTS")]
77    /// Причастие краткое
78    ParticipleShort,
79    #[serde(rename = "GRND")]
80    Gerundive,
81    #[serde(rename = "NUMR")]
82    Number,
83    #[serde(rename = "ADVB")]
84    /// Наречие
85    Adverb,
86    #[serde(rename = "NPRO")]
87    /// Местоимение-существительное
88    NounPronoun,
89    #[serde(rename = "PRED")]
90    /// Предикатив
91    Predicative,
92    #[serde(rename = "PREP")]
93    /// Предлог
94    Preposition,
95    #[serde(rename = "CONJ")]
96    /// Союз
97    Conjunction,
98    #[serde(rename = "PRCL")]
99    /// Частица
100    Particle,
101    #[serde(rename = "INTJ")]
102    /// Междометие
103    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    // Начальная форма, но не нормализованная.
161    // К примеру, начальная форма деепричастия, у которого нормализованной формой, однако, является глагол.
162    #[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    // Начальная форма, но не нормализованная.
173    // К примеру, начальная форма деепричастия, у которого нормализованной формой, однако, является глагол.
174    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    /// Может использоваться как одуш. / неодуш. 
211    #[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    /// Совершенный
228    Perfetto,
229    #[serde(rename = "impf")]
230    /// Несовершенный
231    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    /// Всегда используется в единственном числе
251    SingulariaTantum,
252    /// Всегда используется в множественном числе
253    #[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    /// Переходный
279    Transitive,
280    #[serde(rename = "intr")]
281    /// Непереходный
282    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    // Неизменяемое
316    #[serde(rename = "Fixd")]
317    Fixed,
318    // Именительный
319    #[default]
320    #[serde(rename = "nomn")]
321    Nominativus,
322    // Родительный
323    #[serde(rename = "gent")]
324    // Следующее приведение используется в Pymorphy2.
325    #[serde(alias = "gen1")]
326    Genetivus,
327    // Дательный
328    #[serde(rename = "datv")]
329    Dativus,
330    // Винительный
331    #[serde(rename = "accs")]
332    // Следующее приведение используется в Pymorphy2.
333    #[serde(alias = "acc1")]
334    Accusativus,
335    // Творительный
336    #[serde(rename = "ablt")]
337    Ablativus,
338    // Предложный
339    #[serde(rename = "loct")]
340    // Следующее приведение используется в Pymorphy2.
341    #[serde(alias = "loc1")]
342    Locativus,
343    // Звательный
344    #[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    /// Общий род (м/ж),
374    #[serde(rename = "ms-f")]
375    Common,
376    /// Колебание по роду (м/ж/с): кофе, вольво
377    #[serde(rename = "Ms-f")]
378    CommonWavering,
379    /// Род / род не выражен
380    #[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    // Изъяснительное
398    Indicativo,
399    #[serde(rename = "impr")]
400    // Повелительное
401    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    // Действительный
417    Active,
418    #[serde(rename = "pssv")]
419    // Страдательный
420    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    /// Говорящий включен в действие
436    Incluso,
437    #[serde(rename = "excl")]
438    /// Говорящий не включен в действие
439    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    /// Аббревиатура
455    #[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    /// Возможно субстантивация
471    #[serde(rename = "Subx")]
472    PossibleSubstantive,
473    /// Превосходная степень
474    #[serde(rename = "Supr")]
475    Superior,
476    /// Качественное
477    #[serde(rename = "Qual")]
478    Quality,
479    /// Местоименное
480    #[serde(rename = "Apro")]
481    Pronominal,
482    /// Порядковое
483    #[serde(rename = "Anum")]
484    Ordinal,
485    /// Притяжательное
486    #[serde(rename = "Poss")]
487    Possessive,
488    /// Вопросительное
489    #[serde(rename = "Ques")]
490    Questionable,
491    /// Указательное
492    #[serde(rename = "Dmns")]
493    Demonstrative,
494    /// Анафорическое (местоимение)
495    #[serde(rename = "Anph")]
496    Anaphoric,
497
498    /// Сравнительная степень на по-
499    #[serde(rename = "Cmp2")]
500    Comparative,
501    /// Форма на еею
502    #[serde(rename = "V-ey")]
503    FormEY,
504    /// Форма на еою
505    #[serde(rename = "V-oy")]
506    FormOY,
507    /// Форма на -ей
508    #[serde(rename = "V-ej")]
509    FormEJ,
510    /// Форма на -ье
511    #[serde(rename = "V-be")]
512    FormBE,
513    /// Форма на -енен
514    #[serde(rename = "V-en")]
515    FormENEN,
516    /// Форма на -и- (веселие, твердостию); отчество с -ие
517    #[serde(rename = "V-ie")]
518    FormIE,
519    /// Форма на -ьи
520    #[serde(rename = "V-bi")]
521    FormBI,
522    /// деепричастие на -ши
523    #[serde(rename = "V-sh")]
524    ParticipleSH,    
525
526    /// Многократный
527    #[serde(rename = "Mult")]
528    Multiple,
529    /// Возвратный
530    #[serde(rename = "Refl")]
531    Reflessivo,
532    /// Разговорное
533    #[serde(rename = "Infr")]
534    Spoken,
535    /// жаргонное
536    #[serde(rename = "Slng")]
537    Slang,
538    /// Устаревшее
539    #[serde(rename = "Arch")]
540    Archaic,
541    /// Литературный вариант
542    #[serde(rename = "Litr")]
543    Literary,
544    /// Опечатка
545    #[serde(rename = "Erro")]
546    Error,
547    /// Искажение
548    #[serde(rename = "Dist")]
549    Distortion,
550    /// Вводное слово
551    #[serde(rename = "Prnt")]
552    Parenthesis,
553    /// деепричастие от глагола несовершенного вида
554    #[serde(rename = "Fimp")]
555    ImperfectiveParticiple,
556    /// может выступать в роли предикатива
557    #[serde(rename = "Prdx")]
558    PossiblePredicative,
559    /// счётная форма
560    #[serde(rename = "Coun")]
561    Countable,
562    /// Собирательное числительное
563    #[serde(rename = "Coll")]
564    Collection,
565    /// Форма после предлога
566    #[serde(rename = "Af-p")]
567    AfterPreposition,
568    /// Вариант предлога ( со, подо, ...)
569    #[serde(rename = "Vpre")]
570    PrepositionVariant,
571    /// Инициал
572    #[serde(rename = "Init")]
573    Initial,
574    /// Может выступать в роли прилагательного
575    #[serde(rename = "Adjx")]
576    PossibleAdjective,    
577    /// Гипотетическая форма слова (победю, асфальтовее)
578    #[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}