tnil/word/adjunct/affixual/
mod.rs

1//! Contains types related to affixual adjuncts.
2
3mod multiple;
4mod single;
5
6pub use multiple::MultipleAffixAdjunct;
7pub use single::SingleAffixAdjunct;
8
9use crate::{
10    gloss::{Gloss, GlossFlags},
11    prelude::{IntoTokens, TokenList},
12    romanize::{
13        flags::{FromTokenFlags, IntoTokensFlags},
14        stream::{ParseError, TokenStream},
15        token::Token,
16        traits::FromTokens,
17    },
18};
19
20/// An affixual adjunct.
21#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
22pub enum AffixualAdjunct {
23    /// A variant containing a single affix.
24    Single(SingleAffixAdjunct),
25
26    /// A variant containing multiple affixes.
27    Multiple(MultipleAffixAdjunct),
28}
29
30impl Gloss for AffixualAdjunct {
31    fn gloss(&self, flags: GlossFlags) -> String {
32        match self {
33            AffixualAdjunct::Single(value) => value.gloss(flags),
34            AffixualAdjunct::Multiple(value) => value.gloss(flags),
35        }
36    }
37}
38
39impl FromTokens for AffixualAdjunct {
40    fn parse_volatile(stream: &mut TokenStream, flags: FromTokenFlags) -> Result<Self, ParseError> {
41        match stream.peek() {
42            Some(Token::V(_)) => Ok(AffixualAdjunct::Single(stream.parse(flags)?)),
43            Some(Token::Schwa | Token::C(_)) => Ok(AffixualAdjunct::Multiple(stream.parse(flags)?)),
44            _ => Err(ParseError::ExpectedCsOrVx),
45        }
46    }
47}
48
49impl IntoTokens for AffixualAdjunct {
50    fn append_tokens_to(&self, list: &mut TokenList, flags: IntoTokensFlags) {
51        match self {
52            Self::Single(value) => value.append_tokens_to(list, flags),
53            Self::Multiple(value) => value.append_tokens_to(list, flags),
54        }
55    }
56}