mystem/
grammems.rs

1use crate::error::*;
2use crate::Adjective::{Long, Possessive, Short};
3use crate::Animacy::{Animate, Inanimate};
4use crate::Case::*;
5use crate::ComparativeDegree::{Comparative, Superlative};
6use crate::Gender::{Feminine, Masculine, Neuter};
7use crate::Mood::{Gerunds, Imperative, Indicative, Infinitive, Participle};
8use crate::Other::{
9    Abbreviation, Awkward, CommonForm, Distorted, FamilyName, Geo, Informal, Obscene, Obsolete,
10    Parenthesis, Patronymic, Predicative, ProperNoun, Rare,
11};
12use crate::PerfectiveAspect::{Imperfective, Perfective};
13use crate::Person::{First, Second, Third};
14use crate::Plurality::{Plural, Singular};
15use crate::Tense::{Inpresent, Past, Present};
16use crate::Transitivity::{Intransitive, Transitive};
17use crate::Voice::{Active, Passive};
18use std::fmt;
19use std::str::FromStr;
20
21#[derive(Debug)]
22/// Represent grammems for [`Stemming`](./struct.Stemming.html)
23pub struct Grammem {
24    /// Part of speech of [`Stemming`](./struct.Stemming.html)
25    pub part_of_speech: PartOfSpeech,
26    /// Parsed `Vec` of [`Facts`](./enum.Fact.html)
27    pub facts: Vec<Fact>,
28    /// Non-parsed list of grammems from mystem
29    pub facts_raw: Vec<String>,
30}
31
32/// Часть речи
33#[derive(Debug, PartialEq)]
34pub enum PartOfSpeech {
35    /// Прилагательное
36    Adjective,
37    /// Наречие
38    Adverb,
39    /// Местоименное наречие
40    AdverbPronominal,
41    /// Числительное-прилагательное
42    AdjectiveNumeral,
43    /// Местоимение-прилагательное
44    AdjectivePronoun,
45    /// Часть композита - сложного слова
46    Composite,
47    /// Союз
48    Conjunction,
49    /// Междометие
50    Interjection,
51    /// Числительное
52    Numeral,
53    /// Частица
54    Particle,
55    /// Предлог
56    Preposition,
57    /// Существительное
58    Noun,
59    /// Местоимение-существительное
60    AdjectiveNoun,
61    /// Глагол
62    Verb,
63}
64impl FromStr for PartOfSpeech {
65    type Err = crate::AppError;
66    fn from_str(input: &str) -> Result<PartOfSpeech, Self::Err> {
67        match input {
68            "A" => Ok(PartOfSpeech::Adjective),
69            "ADV" => Ok(PartOfSpeech::Adverb),
70            "ADVPRO" => Ok(PartOfSpeech::AdverbPronominal),
71            "ANUM" => Ok(PartOfSpeech::AdjectiveNumeral),
72            "APRO" => Ok(PartOfSpeech::AdjectivePronoun),
73            "COM" => Ok(PartOfSpeech::Composite),
74            "CONJ" => Ok(PartOfSpeech::Conjunction),
75            "INTJ" => Ok(PartOfSpeech::Interjection),
76            "NUM" => Ok(PartOfSpeech::Numeral),
77            "PART" => Ok(PartOfSpeech::Particle),
78            "PR" => Ok(PartOfSpeech::Preposition),
79            "S" => Ok(PartOfSpeech::Noun),
80            "SPRO" => Ok(PartOfSpeech::AdjectiveNoun),
81            "V" => Ok(PartOfSpeech::Verb),
82            _ => Err(AppError::PartOfSpeechError("Failed to get Part of Speech.")),
83        }
84    }
85}
86impl fmt::Display for PartOfSpeech {
87    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88        write!(f, "{:?}", self)
89    }
90}
91
92/// Контейнер для любых фактов о разобранном слове
93#[derive(Debug, PartialEq)]
94pub enum Fact {
95    /// Падеж
96    Case(Case),
97    /// Время глаголов
98    Tense(Tense),
99    /// Число
100    Plurality(Plurality),
101    /// Наклонение глагола
102    Mood(Mood),
103    /// Форма прилагательного
104    Adjective(Adjective),
105    /// Степень сравнения
106    ComparativeDegree(ComparativeDegree),
107    /// Лицо глагола
108    Person(Person),
109    /// Род
110    Gender(Gender),
111    /// Вид глагола
112    PerfectiveAspect(PerfectiveAspect),
113    /// Залог
114    Voice(Voice),
115    /// Одушевленность
116    Animacy(Animacy),
117    /// Переходность
118    Transitivity(Transitivity),
119    /// Прочие обозначения
120    Other(Other),
121}
122impl fmt::Display for Fact {
123    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
124        write!(f, "{:?}", self)
125    }
126}
127
128/// Падеж
129#[derive(Debug, PartialEq)]
130pub enum Case {
131    /// Именительный
132    Nominative,
133    /// Родительный
134    Genitive,
135    /// Дательный
136    Dative,
137    /// Винительный
138    Accusative,
139    /// Творительный
140    Instrumental,
141    /// Предложный
142    Prepositional,
143    /// Партитив (второй родительный)
144    Partitive,
145    /// Местный (второй предложный)
146    Locative,
147    /// Звательный
148    Vocative,
149}
150
151/// Время глагола
152#[derive(Debug, PartialEq)]
153pub enum Tense {
154    /// Настоящее время
155    Present,
156    /// Непрошедшее время
157    Inpresent,
158    /// Прошедшее время
159    Past,
160}
161
162/// Число
163#[derive(Debug, PartialEq)]
164pub enum Plurality {
165    /// Множественное
166    Plural,
167    /// Единственное
168    Singular,
169}
170
171/// Наклонение глагола
172#[derive(Debug, PartialEq)]
173pub enum Mood {
174    /// Деепричастие
175    Gerunds,
176    /// Инфинитив
177    Infinitive,
178    /// Причастие
179    Participle,
180    /// Изьявительное наклонение
181    Indicative,
182    /// Повелительное наклонение
183    Imperative,
184}
185
186/// Форма прилагательного
187#[derive(Debug, PartialEq)]
188pub enum Adjective {
189    /// Краткое
190    Short,
191    /// Полное
192    Long,
193    /// Притяжательное
194    Possessive,
195}
196
197/// Степень сравнения
198#[derive(Debug, PartialEq)]
199pub enum ComparativeDegree {
200    /// Превосходная
201    Superlative,
202    /// Сравнительная
203    Comparative,
204}
205
206/// Лицо глагола
207#[derive(Debug, PartialEq)]
208pub enum Person {
209    /// 1-е лицо
210    First,
211    /// 2-е лицо
212    Second,
213    /// 3-е лицо
214    Third,
215}
216
217/// Род
218#[derive(Debug, PartialEq)]
219pub enum Gender {
220    /// Мужской
221    Masculine,
222    /// Женский
223    Feminine,
224    /// Средний
225    Neuter,
226}
227
228/// Вид глагола
229#[derive(Debug, PartialEq)]
230pub enum PerfectiveAspect {
231    /// Совершенный
232    Perfective,
233    /// Несовершенный
234    Imperfective,
235}
236
237/// Залог
238#[derive(Debug, PartialEq)]
239pub enum Voice {
240    /// Страдательный залог
241    Passive,
242    /// Действительный залог
243    Active,
244}
245
246/// Одушевленность
247#[derive(Debug, PartialEq)]
248pub enum Animacy {
249    /// Одушевленное
250    Animate,
251    /// Неодушевленное
252    Inanimate,
253}
254
255/// Переходность глагола
256#[derive(Debug, PartialEq)]
257pub enum Transitivity {
258    /// Переходный глагол
259    Transitive,
260    /// Непереходный глагол
261    Intransitive,
262}
263
264/// Прочие обозначения
265#[derive(Debug, PartialEq)]
266pub enum Other {
267    /// Вводное слово
268    Parenthesis,
269    /// Географическое название
270    Geo,
271    /// Образование формы затруднено
272    Awkward,
273    /// Имя собственное
274    ProperNoun,
275    /// Искаженная форма
276    Distorted,
277    /// Общая форма мужского и женского рода
278    CommonForm,
279    /// Обсценная лексика
280    Obscene,
281    /// Отчество
282    Patronymic,
283    /// Предикатив
284    Predicative,
285    /// Разговорная форма
286    Informal,
287    /// Редко встречающееся слово
288    Rare,
289    /// Сокращение
290    Abbreviation,
291    /// Устаревшая форма
292    Obsolete,
293    /// Фамилия
294    FamilyName,
295}
296
297impl FromStr for Fact {
298    type Err = crate::AppError;
299    fn from_str(input: &str) -> Result<Fact, Self::Err> {
300        match input {
301            "nom" => Ok(Fact::Case(Nominative)),
302            "gen" => Ok(Fact::Case(Genitive)),
303            "dat" => Ok(Fact::Case(Dative)),
304            "acc" => Ok(Fact::Case(Accusative)),
305            "ins" => Ok(Fact::Case(Instrumental)),
306            "abl" => Ok(Fact::Case(Prepositional)),
307            "part" => Ok(Fact::Case(Partitive)),
308            "loc" => Ok(Fact::Case(Locative)),
309            "voc" => Ok(Fact::Case(Vocative)),
310            "praes" => Ok(Fact::Tense(Present)),
311            "inpraes" => Ok(Fact::Tense(Inpresent)),
312            "praet" => Ok(Fact::Tense(Past)),
313            "sg" => Ok(Fact::Plurality(Singular)),
314            "pl" => Ok(Fact::Plurality(Plural)),
315            "ger" => Ok(Fact::Mood(Gerunds)),
316            "inf" => Ok(Fact::Mood(Infinitive)),
317            "partcp" => Ok(Fact::Mood(Participle)),
318            "indic" => Ok(Fact::Mood(Indicative)),
319            "imper" => Ok(Fact::Mood(Imperative)),
320            "brev" => Ok(Fact::Adjective(Short)),
321            "plen" => Ok(Fact::Adjective(Long)),
322            "poss" => Ok(Fact::Adjective(Possessive)),
323            "supr" => Ok(Fact::ComparativeDegree(Superlative)),
324            "comp" => Ok(Fact::ComparativeDegree(Comparative)),
325            "1p" => Ok(Fact::Person(First)),
326            "2p" => Ok(Fact::Person(Second)),
327            "3p" => Ok(Fact::Person(Third)),
328            "m" => Ok(Fact::Gender(Masculine)),
329            "f" => Ok(Fact::Gender(Feminine)),
330            "n" => Ok(Fact::Gender(Neuter)),
331            "pf" => Ok(Fact::PerfectiveAspect(Perfective)),
332            "ipf" => Ok(Fact::PerfectiveAspect(Imperfective)),
333            "act" => Ok(Fact::Voice(Active)),
334            "pass" => Ok(Fact::Voice(Passive)),
335            "anim" => Ok(Fact::Animacy(Animate)),
336            "inan" => Ok(Fact::Animacy(Inanimate)),
337            "tran" => Ok(Fact::Transitivity(Transitive)),
338            "intr" => Ok(Fact::Transitivity(Intransitive)),
339            "parenth" => Ok(Fact::Other(Parenthesis)),
340            "geo" => Ok(Fact::Other(Geo)),
341            "awkw" => Ok(Fact::Other(Awkward)),
342            "persn" => Ok(Fact::Other(ProperNoun)),
343            "dist" => Ok(Fact::Other(Distorted)),
344            "mf" => Ok(Fact::Other(CommonForm)),
345            "obsc" => Ok(Fact::Other(Obscene)),
346            "patrn" => Ok(Fact::Other(Patronymic)),
347            "praed" => Ok(Fact::Other(Predicative)),
348            "inform" => Ok(Fact::Other(Informal)),
349            "rare" => Ok(Fact::Other(Rare)),
350            "abbr" => Ok(Fact::Other(Abbreviation)),
351            "obsol" => Ok(Fact::Other(Obsolete)),
352            "famn" => Ok(Fact::Other(FamilyName)),
353            //_ => Ok(Fact::Case(Vocative)),
354            _ => Err(AppError::GrammemError("Failed to get Grammem.")),
355        }
356    }
357}