use crate::category::{
AffixSlot, AffixType, Aspect, Ca, Case, CaseAccessorMode, CaseScope, Context, DatalessRelation,
Effect, Function, Level, Mood, Phase, Specification, Stem, Valence, VcOrVk, Version,
};
macro_rules! item {
(
$enum_name:ident,
$name:literal,
$($variant:ident,)+
) => {
::paste::paste! {
#[repr(u8)]
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[doc = "Represents a " $enum_name " value."]
pub enum $enum_name {
$(
#[doc = "The " $variant " " $name "."]
$variant,
)+
}
}
};
}
item!(
Core,
"secondary core",
StandardPlaceholder,
AlphabeticPlaceholder,
GiantZ,
VertBar,
B,
C,
Ç,
Č,
D,
Ḑ,
F,
G,
H,
J,
K,
L,
Ļ,
M,
N,
Ň,
P,
R,
Ř,
S,
Š,
T,
Ţ,
V,
X,
Z,
Ẓ,
Ž,
Sigma,
BSC,
CTE,
CSV,
OBJ,
N0,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
N8,
N9,
);
item!(
Ext,
"secondary extension",
B,
C,
Ç,
Č,
D,
DWithLine,
Ḑ,
F,
G,
GWithLine,
H,
J,
K,
L,
Ļ,
M,
N,
Ň,
P,
PWithLine,
R,
RFlipped,
Ř,
S,
Š,
T,
Ţ,
V,
W,
X,
Y,
Z,
Ẓ,
Ž,
GeminateCore,
GeminateExt,
GlottalStop,
Ejective,
Velar,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
N8,
N9,
);
item!(
Register,
"register",
StandardPNT,
StandardSPF,
StandardEXM,
StandardCGT,
AlphabeticNRR,
AlphabeticDSV,
AlphabeticPNT,
AlphabeticSPF,
AlphabeticEXM,
AlphabeticCGT,
TranscriptiveNRR,
TranscriptiveDSV,
TranscriptivePNT,
TranscriptiveSPF,
TranscriptiveEXM,
TranscriptiveCGT,
TransliterativeNRR,
TransliterativeDSV,
TransliterativePNT,
TransliterativeSPF,
TransliterativeEXM,
TransliterativeCGT,
);
item!(
Diacritic,
"diacritic",
Dot,
HorizBar,
HorizBarWithTopLine,
HorizBarWithBottomLine,
VertBar,
VertBarWithLeftLine,
VertBarWithRightLine,
DiagBar,
TwoPartHorizAndDiagBar,
CurveTowardsLeft,
CurveTowardsLeftWithDot,
CurveTowardsRight,
CurveTowardsRightWithDot,
CurveTowardsTop,
CurveTowardsBottom,
CurveTowardsBottomWithLine,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
N8,
N9,
);
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Secondary {
pub is_rotated: bool,
pub core: Core,
pub top: Option<Ext>,
pub bottom: Option<Ext>,
pub superposed: Option<Diacritic>,
pub underposed: Option<Diacritic>,
pub leftposed: Option<Diacritic>,
pub rightposed: Option<Diacritic>,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub enum TertiarySegment {
Phase(Phase),
Effect(Effect),
Aspect(Aspect),
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Tertiary {
pub valence: Valence,
pub top: Option<TertiarySegment>,
pub bottom: Option<TertiarySegment>,
pub superposed: Option<Level>,
pub underposed: Option<Level>,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub enum Character {
Secondary(Secondary),
Tertiary(Tertiary),
Register(Register),
Diacritic(Diacritic),
WordBreak,
SentenceBreak,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Primary {
pub specification: Specification,
pub ca: Ca,
pub function: Function,
pub version: Version,
pub stem: Stem,
pub context: Context,
pub relation: DatalessRelation,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct StandardQuaternary {
pub vc_or_vk: VcOrVk,
pub case_scope: CaseScope,
pub mood: Mood,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct AccessorQuaternary {
pub slot: AffixSlot,
pub case: Case,
pub mode: CaseAccessorMode,
pub r#type: AffixType,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Numeral {
pub value: u16,
}