verba 0.5.1

A library for working with Latin words.
Documentation
use smallvec::{smallvec, SmallVec};

use crate::decline::{Gender, Case};
use crate::inflection::{Number};

pub(super) type Suffixes<'a> = SmallVec::<[&'a str; 2]>; 

pub(super) fn first_second_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
    match (gender, number, case) {
        (Gender::Masculine, Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
        (Gender::Masculine, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
        (Gender::Masculine, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
        (Gender::Masculine, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
        (Gender::Masculine, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
        (Gender::Masculine, Number::Singular, Case::Vocative) => Some(smallvec!["e"]),

        (Gender::Masculine, Number::Plural, Case::Nominative) => Some(smallvec!["ī"]),
        (Gender::Masculine, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
        (Gender::Masculine, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
        (Gender::Masculine, Number::Plural, Case::Accusative) => Some(smallvec!["ōs"]),
        (Gender::Masculine, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
        (Gender::Masculine, Number::Plural, Case::Vocative) => Some(smallvec!["ī"]),

        (Gender::Feminine, Number::Singular, Case::Nominative) => Some(smallvec!["a"]),
        (Gender::Feminine, Number::Singular, Case::Genitive) => Some(smallvec!["ae"]),
        (Gender::Feminine, Number::Singular, Case::Dative) => Some(smallvec!["ae"]),
        (Gender::Feminine, Number::Singular, Case::Accusative) => Some(smallvec!["am"]),
        (Gender::Feminine, Number::Singular, Case::Ablative) => Some(smallvec!["ā"]),
        (Gender::Feminine, Number::Singular, Case::Vocative) => Some(smallvec!["a"]),

        (Gender::Feminine, Number::Plural, Case::Nominative) => Some(smallvec!["ae"]),
        (Gender::Feminine, Number::Plural, Case::Genitive) => Some(smallvec!["ārum"]),
        (Gender::Feminine, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
        (Gender::Feminine, Number::Plural, Case::Accusative) => Some(smallvec!["ās"]),
        (Gender::Feminine, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
        (Gender::Feminine, Number::Plural, Case::Vocative) => Some(smallvec!["ae"]),

        (Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["um"]),
        (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
        (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
        (Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
        (Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["um"]),

        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
        (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
        (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
    }
}   

pub(super) fn first_second_ius_genitive_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
    match (gender, number, case) {
        // Adjectives that have a singular genitive ending in -īus have the 
        // same declined form for singular genitives and datives regardless of
        // gender.  
        (_, Number::Singular, Case::Genitive) => Some(smallvec!["īus"]),
        (_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
        _ => first_second_endings(number, case, gender)
    }
}

pub(super) fn first_second_r_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
    match (gender, number, case) {
        // The masculine singular nominative and vocative forms for first and
        // second declension adjectives cannot be constructed by combining a 
        // stem with an ending if the singular nominative ends in -r. 
        (Gender::Masculine, Number::Singular, Case::Nominative) => None,
        (Gender::Masculine, Number::Singular, Case::Vocative) => None,
        _ => first_second_endings(number, case, gender),
    }
}

pub(super) fn third_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
    match (gender, number, case) {
        (Gender::Neuter, Number::Singular, Case::Nominative) => None,
        (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
        (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
        (Gender::Neuter, Number::Singular, Case::Accusative) => None,
        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
        (Gender::Neuter, Number::Singular, Case::Vocative) => None,

        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
        (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
        (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),

        // Masculine and feminine third declension adjectives decline in the 
        // same way. 
        (_, Number::Singular, Case::Nominative) => None,
        (_, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
        (_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
        (_, Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
        (_, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
        (_, Number::Singular, Case::Vocative) => None,

        (_, Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
        (_, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
        (_, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
        (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs", "īs"]),
        (_, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
        (_, Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
    }
}

pub(super) fn third_c_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
    match (gender, number, case) {
        (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
        (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
        (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
        (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
        (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
        (_, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
        (_, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
        (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
        _ => third_endings(number, case, gender),
    }
}