verba/noun/
endings.rs

1use smallvec::{smallvec, SmallVec};
2
3use crate::decline::{Gender, Case};
4use crate::inflection::{Number};
5
6pub(super) type Suffixes<'a> = SmallVec::<[&'a str; 2]>;
7
8/// Declines first declension regular nouns.
9pub(super) fn first_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
10    match (number, case) {
11        (Number::Singular, Case::Nominative) => Some(smallvec!["a"]),
12        (Number::Singular, Case::Genitive) => Some(smallvec!["ae"]),
13        (Number::Singular, Case::Dative) => Some(smallvec!["ae"]),
14        (Number::Singular, Case::Accusative) => Some(smallvec!["am"]),
15        (Number::Singular, Case::Ablative) => Some(smallvec!["ā"]),
16        (Number::Singular, Case::Vocative) => Some(smallvec!["a"]),
17        (Number::Plural, Case::Nominative) => Some(smallvec!["ae"]),
18        (Number::Plural, Case::Genitive) => Some(smallvec!["ārum"]),
19        (Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
20        (Number::Plural, Case::Accusative) => Some(smallvec!["ās"]),
21        (Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
22        (Number::Plural, Case::Vocative) => Some(smallvec!["ae"]),
23    }
24}
25
26pub(super) fn second_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
27    match (gender, number, case) {
28        (Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["um"]),
29        (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
30        (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
31        (Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
32        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
33        (Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["um"]),
34        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
35        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
36        (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
37        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
38        (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
39        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
40        // There are a few feminine second declension nouns, but since they 
41        // decline in the same way as masculine second declension nouns, gender
42        // can be ignored from here on out. 
43        (_, Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
44        (_, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
45        (_, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
46        (_, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
47        (_, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
48        (_, Number::Singular, Case::Vocative) => Some(smallvec!["e"]),
49        (_, Number::Plural, Case::Nominative) => Some(smallvec!["ī"]),
50        (_, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
51        (_, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
52        (_, Number::Plural, Case::Accusative) => Some(smallvec!["ōs"]),
53        (_, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
54        (_, Number::Plural, Case::Vocative) => Some(smallvec!["ī"]),
55    }
56}
57
58pub(super) fn second_ius_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
59    match (gender, number, case) {
60        (Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["ium"]),
61        (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["iī"]),
62        (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["iō"]),
63        (Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["ium"]),
64        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["iō"]),
65        (Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["ium"]),
66        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
67        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["iōrum"]),
68        (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["iīs"]),
69        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
70        (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["iīs"]),
71        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),
72
73        (_, Number::Singular, Case::Nominative) => Some(smallvec!["ius"]),
74        (_, Number::Singular, Case::Genitive) => Some(smallvec!["iī"]),
75        (_, Number::Singular, Case::Dative) => Some(smallvec!["iō"]),
76        (_, Number::Singular, Case::Accusative) => Some(smallvec!["ium"]),
77        (_, Number::Singular, Case::Ablative) => Some(smallvec!["iō"]),
78        (_, Number::Singular, Case::Vocative) => Some(smallvec!["ī"]),
79        (_, Number::Plural, Case::Nominative) => Some(smallvec!["iī"]),
80        (_, Number::Plural, Case::Genitive) => Some(smallvec!["iōrum"]),
81        (_, Number::Plural, Case::Dative) => Some(smallvec!["iīs"]),
82        (_, Number::Plural, Case::Accusative) => Some(smallvec!["iōs"]),
83        (_, Number::Plural, Case::Ablative) => Some(smallvec!["iīs"]),
84        (_, Number::Plural, Case::Vocative) => Some(smallvec!["iī"]),
85    }
86}
87
88pub(super) fn second_r_endings<'a>(number: Number, case: Case, gender: Gender) ->Option<Suffixes<'a>> {
89    match (gender, number, case) {
90        // The nominative and vocative forms of second declension nouns ending
91        // in -r cannot be constructed from the stem alone. For example, the 
92        // stem of puer, puerī is puer- whereas the stem of ager, agrī is agr-.
93        // Ager cannot be constructed with agr-. However, for every other case,
94        // the declension is the same as any regular second declension noun. 
95        // This function returns None of the two cases that cannot be
96        // constructed. Otherwise it returns the proper second declension
97        // ending. 
98        (_, Number::Singular, Case::Nominative) => None,
99        (_, Number::Singular, Case::Vocative) => None,
100        // (_, Number::Plural, Case::Nominative) => None,
101        _ => second_endings(number, case, gender),
102    }
103}
104
105pub(super) fn third_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
106        match (gender, number, case) {
107        // The singular nominative form of third declension nouns cannot be 
108        // created from the stem, therefore this function returns None and 
109        // requires the calling function to override and provide a form. 
110        (Gender::Neuter, Number::Singular, Case::Nominative) => None,
111        (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
112        (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
113        (Gender::Neuter, Number::Singular, Case::Accusative) => None,
114        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
115        (Gender::Neuter, Number::Singular, Case::Vocative) => None,
116        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
117        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
118        (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
119        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
120        (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
121        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
122        // Masculine and feminine third declension nouns decline in the same 
123        // way, so gender can be ignored from here on out. 
124        (_, Number::Singular, Case::Nominative) => None,
125        (_, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
126        (_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
127        (_, Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
128        (_, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
129        (_, Number::Singular, Case::Vocative) => None,
130        (_, Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
131        (_, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
132        (_, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
133        (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
134        (_, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
135        (_, Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
136    }
137}
138
139pub(super) fn third_i_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
140    match (gender, number, case) {
141        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
142        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
143        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
144        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
145        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),
146        (_, Number::Singular, Case::Accusative) => Some(smallvec!["em", "im"]),
147        (_, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
148        (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs", "īs"]),
149        _ => third_endings(number, case, gender),
150    }
151}
152
153/// Most fourth declension nouns decline using this function. There is only a
154/// handful of neuter nouns that will use [`fourth_u_endings`]. However, not 
155/// every fourth declension neauter noun uses that function. Spectus, spectūs
156/// is a fourth declension neuter noun that uses this function.
157/// 
158/// Ultimately, determining which of the two functions is used is as easy as 
159/// checking the singular nominative form. If it ends in -us, use this
160/// function. If it ends in -ū, use [`fourth_u_endings`].
161pub(super) fn fourth_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
162    match (number, case) {
163        (Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
164        (Number::Singular, Case::Genitive) => Some(smallvec!["ūs"]),
165        (Number::Singular, Case::Dative) => Some(smallvec!["uī"]),
166        (Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
167        (Number::Singular, Case::Ablative) => Some(smallvec!["ū"]),
168        (Number::Singular, Case::Vocative) => Some(smallvec!["us"]),
169        (Number::Plural, Case::Nominative) => Some(smallvec!["ūs"]),
170        (Number::Plural, Case::Genitive) => Some(smallvec!["uum"]),
171        (Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
172        (Number::Plural, Case::Accusative) => Some(smallvec!["ūs"]),
173        (Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
174        (Number::Plural, Case::Vocative) => Some(smallvec!["ūs"]),
175    }
176}
177
178pub(super) fn fourth_u_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
179    match (number, case) {
180        (Number::Singular, Case::Nominative) => Some(smallvec!["ū"]),
181        (Number::Singular, Case::Dative) => Some(smallvec!["ū"]),
182        (Number::Singular, Case::Accusative) => Some(smallvec!["ū"]),
183        (Number::Singular, Case::Vocative) => Some(smallvec!["ū"]),
184        (Number::Plural, Case::Nominative) => Some(smallvec!["ua"]),
185        (Number::Plural, Case::Accusative) => Some(smallvec!["ua"]),
186        (Number::Plural, Case::Vocative) => Some(smallvec!["ua"]),
187        _ => fourth_endings(number, case, gender),
188    }
189}
190
191pub(super) fn fifth_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
192    match (number, case) {
193        (Number::Singular, Case::Nominative) => Some(smallvec!["ēs"]),
194        (Number::Singular, Case::Genitive) => Some(smallvec!["eī"]),
195        (Number::Singular, Case::Dative) => Some(smallvec!["eī"]),
196        (Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
197        (Number::Singular, Case::Ablative) => Some(smallvec!["ē"]),
198        (Number::Singular, Case::Vocative) => Some(smallvec!["ēs"]),
199        (Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
200        (Number::Plural, Case::Genitive) => Some(smallvec!["ērum"]),
201        (Number::Plural, Case::Dative) => Some(smallvec!["ēbus"]),
202        (Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
203        (Number::Plural, Case::Ablative) => Some(smallvec!["ēbus"]),
204        (Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
205    }
206}
207
208pub(super) fn fifth_vowel_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
209    match (number, case) {
210        (Number::Singular, Case::Genitive) => Some(smallvec!["ēī"]),
211        (Number::Singular, Case::Dative) => Some(smallvec!["ēī"]),
212        _ => fifth_endings(number, case, gender),
213    }
214}