#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Gender {
#[default]
Unknown,
Masc,
Fem,
Neut,
Common,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Number {
#[default]
Unknown,
Singular,
Plural,
Dual,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Case {
#[default]
Unknown,
Nominative,
Accusative,
Dative,
Genitive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Definiteness {
#[default]
Unknown,
Definite,
Indefinite,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Animacy {
#[default]
Unknown,
Animate,
Inanimate,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AgreementPerson {
First,
Second,
#[default]
Third,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AgreementFeatures {
pub gender: Gender,
pub number: Number,
pub case: Case,
pub definiteness: Definiteness,
pub animacy: Animacy,
pub person: AgreementPerson,
}
impl AgreementFeatures {
pub fn new() -> Self {
Self::default()
}
pub fn with_gender(mut self, g: Gender) -> Self {
self.gender = g;
self
}
pub fn with_number(mut self, n: Number) -> Self {
self.number = n;
self
}
pub fn with_case(mut self, c: Case) -> Self {
self.case = c;
self
}
pub fn with_definiteness(mut self, d: Definiteness) -> Self {
self.definiteness = d;
self
}
pub fn with_animacy(mut self, a: Animacy) -> Self {
self.animacy = a;
self
}
pub fn with_person(mut self, p: AgreementPerson) -> Self {
self.person = p;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_all_unknown() {
let f = AgreementFeatures::default();
assert_eq!(f.gender, Gender::Unknown);
assert_eq!(f.number, Number::Unknown);
assert_eq!(f.case, Case::Unknown);
assert_eq!(f.definiteness, Definiteness::Unknown);
assert_eq!(f.animacy, Animacy::Unknown);
assert_eq!(f.person, AgreementPerson::Third);
}
#[test]
fn builder_with_methods_set_fields() {
let f = AgreementFeatures::new()
.with_gender(Gender::Fem)
.with_number(Number::Singular)
.with_case(Case::Accusative)
.with_definiteness(Definiteness::Definite)
.with_animacy(Animacy::Animate)
.with_person(AgreementPerson::First);
assert_eq!(f.gender, Gender::Fem);
assert_eq!(f.number, Number::Singular);
assert_eq!(f.case, Case::Accusative);
assert_eq!(f.definiteness, Definiteness::Definite);
assert_eq!(f.animacy, Animacy::Animate);
assert_eq!(f.person, AgreementPerson::First);
}
#[test]
fn features_are_copy() {
fn takes_copy<T: Copy>(_: T) {}
takes_copy(AgreementFeatures::default());
takes_copy(Gender::Fem);
takes_copy(Number::Plural);
takes_copy(Case::Dative);
takes_copy(Definiteness::Indefinite);
takes_copy(Animacy::Animate);
takes_copy(AgreementPerson::First);
}
#[test]
fn all_gender_variants_are_distinct() {
assert_ne!(Gender::Masc, Gender::Fem);
assert_ne!(Gender::Fem, Gender::Neut);
assert_ne!(Gender::Neut, Gender::Common);
assert_ne!(Gender::Common, Gender::Unknown);
}
#[test]
fn all_number_variants_are_distinct() {
assert_ne!(Number::Singular, Number::Plural);
assert_ne!(Number::Plural, Number::Dual);
assert_ne!(Number::Dual, Number::Unknown);
}
#[test]
fn all_case_variants_are_distinct() {
assert_ne!(Case::Nominative, Case::Accusative);
assert_ne!(Case::Accusative, Case::Dative);
assert_ne!(Case::Dative, Case::Genitive);
assert_ne!(Case::Genitive, Case::Unknown);
}
}