unicode_types 0.2.0

A mapping of all the unicode characters into convenience types (one enum per block of characters with one variant per character).
Documentation

/// An enum to represent all characters in the Cham block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Cham {
    /// \u{aa00}: 'ꨀ'
    LetterA,
    /// \u{aa01}: 'ꨁ'
    LetterI,
    /// \u{aa02}: 'ꨂ'
    LetterU,
    /// \u{aa03}: 'ꨃ'
    LetterE,
    /// \u{aa04}: 'ꨄ'
    LetterAi,
    /// \u{aa05}: 'ꨅ'
    LetterO,
    /// \u{aa06}: 'ꨆ'
    LetterKa,
    /// \u{aa07}: 'ꨇ'
    LetterKha,
    /// \u{aa08}: 'ꨈ'
    LetterGa,
    /// \u{aa09}: 'ꨉ'
    LetterGha,
    /// \u{aa0a}: 'ꨊ'
    LetterNgue,
    /// \u{aa0b}: 'ꨋ'
    LetterNga,
    /// \u{aa0c}: 'ꨌ'
    LetterCha,
    /// \u{aa0d}: 'ꨍ'
    LetterChha,
    /// \u{aa0e}: 'ꨎ'
    LetterJa,
    /// \u{aa0f}: 'ꨏ'
    LetterJha,
    /// \u{aa10}: 'ꨐ'
    LetterNhue,
    /// \u{aa11}: 'ꨑ'
    LetterNha,
    /// \u{aa12}: 'ꨒ'
    LetterNhja,
    /// \u{aa13}: 'ꨓ'
    LetterTa,
    /// \u{aa14}: 'ꨔ'
    LetterTha,
    /// \u{aa15}: 'ꨕ'
    LetterDa,
    /// \u{aa16}: 'ꨖ'
    LetterDha,
    /// \u{aa17}: 'ꨗ'
    LetterNue,
    /// \u{aa18}: 'ꨘ'
    LetterNa,
    /// \u{aa19}: 'ꨙ'
    LetterDda,
    /// \u{aa1a}: 'ꨚ'
    LetterPa,
    /// \u{aa1b}: 'ꨛ'
    LetterPpa,
    /// \u{aa1c}: 'ꨜ'
    LetterPha,
    /// \u{aa1d}: 'ꨝ'
    LetterBa,
    /// \u{aa1e}: 'ꨞ'
    LetterBha,
    /// \u{aa1f}: 'ꨟ'
    LetterMue,
    /// \u{aa20}: 'ꨠ'
    LetterMa,
    /// \u{aa21}: 'ꨡ'
    LetterBba,
    /// \u{aa22}: 'ꨢ'
    LetterYa,
    /// \u{aa23}: 'ꨣ'
    LetterRa,
    /// \u{aa24}: 'ꨤ'
    LetterLa,
    /// \u{aa25}: 'ꨥ'
    LetterVa,
    /// \u{aa26}: 'ꨦ'
    LetterSsa,
    /// \u{aa27}: 'ꨧ'
    LetterSa,
    /// \u{aa28}: 'ꨨ'
    LetterHa,
    /// \u{aa29}: 'ꨩ'
    VowelSignAa,
    /// \u{aa2a}: 'ꨪ'
    VowelSignI,
    /// \u{aa2b}: 'ꨫ'
    VowelSignIi,
    /// \u{aa2c}: 'ꨬ'
    VowelSignEi,
    /// \u{aa2d}: 'ꨭ'
    VowelSignU,
    /// \u{aa2e}: 'ꨮ'
    VowelSignOe,
    /// \u{aa2f}: 'ꨯ'
    VowelSignO,
    /// \u{aa30}: 'ꨰ'
    VowelSignAi,
    /// \u{aa31}: 'ꨱ'
    VowelSignAu,
    /// \u{aa32}: 'ꨲ'
    VowelSignUe,
    /// \u{aa33}: 'ꨳ'
    ConsonantSignYa,
    /// \u{aa34}: 'ꨴ'
    ConsonantSignRa,
    /// \u{aa35}: 'ꨵ'
    ConsonantSignLa,
    /// \u{aa36}: 'ꨶ'
    ConsonantSignWa,
    /// \u{aa40}: 'ꩀ'
    LetterFinalK,
    /// \u{aa41}: 'ꩁ'
    LetterFinalG,
    /// \u{aa42}: 'ꩂ'
    LetterFinalNg,
    /// \u{aa43}: 'ꩃ'
    ConsonantSignFinalNg,
    /// \u{aa44}: 'ꩄ'
    LetterFinalCh,
    /// \u{aa45}: 'ꩅ'
    LetterFinalT,
    /// \u{aa46}: 'ꩆ'
    LetterFinalN,
    /// \u{aa47}: 'ꩇ'
    LetterFinalP,
    /// \u{aa48}: 'ꩈ'
    LetterFinalY,
    /// \u{aa49}: 'ꩉ'
    LetterFinalR,
    /// \u{aa4a}: 'ꩊ'
    LetterFinalL,
    /// \u{aa4b}: 'ꩋ'
    LetterFinalSs,
    /// \u{aa4c}: 'ꩌ'
    ConsonantSignFinalM,
    /// \u{aa4d}: 'ꩍ'
    ConsonantSignFinalH,
    /// \u{aa50}: '꩐'
    DigitZero,
    /// \u{aa51}: '꩑'
    DigitOne,
    /// \u{aa52}: '꩒'
    DigitTwo,
    /// \u{aa53}: '꩓'
    DigitThree,
    /// \u{aa54}: '꩔'
    DigitFour,
    /// \u{aa55}: '꩕'
    DigitFive,
    /// \u{aa56}: '꩖'
    DigitSix,
    /// \u{aa57}: '꩗'
    DigitSeven,
    /// \u{aa58}: '꩘'
    DigitEight,
    /// \u{aa59}: '꩙'
    DigitNine,
    /// \u{aa5c}: '꩜'
    PunctuationSpiral,
    /// \u{aa5d}: '꩝'
    PunctuationDanda,
    /// \u{aa5e}: '꩞'
    PunctuationDoubleDanda,
}

impl Into<char> for Cham {
    fn into(self) -> char {
        match self {
            Cham::LetterA => '',
            Cham::LetterI => '',
            Cham::LetterU => '',
            Cham::LetterE => '',
            Cham::LetterAi => '',
            Cham::LetterO => '',
            Cham::LetterKa => '',
            Cham::LetterKha => '',
            Cham::LetterGa => '',
            Cham::LetterGha => '',
            Cham::LetterNgue => '',
            Cham::LetterNga => '',
            Cham::LetterCha => '',
            Cham::LetterChha => '',
            Cham::LetterJa => '',
            Cham::LetterJha => '',
            Cham::LetterNhue => '',
            Cham::LetterNha => '',
            Cham::LetterNhja => '',
            Cham::LetterTa => '',
            Cham::LetterTha => '',
            Cham::LetterDa => '',
            Cham::LetterDha => '',
            Cham::LetterNue => '',
            Cham::LetterNa => '',
            Cham::LetterDda => '',
            Cham::LetterPa => '',
            Cham::LetterPpa => '',
            Cham::LetterPha => '',
            Cham::LetterBa => '',
            Cham::LetterBha => '',
            Cham::LetterMue => '',
            Cham::LetterMa => '',
            Cham::LetterBba => '',
            Cham::LetterYa => '',
            Cham::LetterRa => '',
            Cham::LetterLa => '',
            Cham::LetterVa => '',
            Cham::LetterSsa => '',
            Cham::LetterSa => '',
            Cham::LetterHa => '',
            Cham::VowelSignAa => '',
            Cham::VowelSignI => '',
            Cham::VowelSignIi => '',
            Cham::VowelSignEi => '',
            Cham::VowelSignU => '',
            Cham::VowelSignOe => '',
            Cham::VowelSignO => '',
            Cham::VowelSignAi => '',
            Cham::VowelSignAu => '',
            Cham::VowelSignUe => '',
            Cham::ConsonantSignYa => '',
            Cham::ConsonantSignRa => '',
            Cham::ConsonantSignLa => '',
            Cham::ConsonantSignWa => '',
            Cham::LetterFinalK => '',
            Cham::LetterFinalG => '',
            Cham::LetterFinalNg => '',
            Cham::ConsonantSignFinalNg => '',
            Cham::LetterFinalCh => '',
            Cham::LetterFinalT => '',
            Cham::LetterFinalN => '',
            Cham::LetterFinalP => '',
            Cham::LetterFinalY => '',
            Cham::LetterFinalR => '',
            Cham::LetterFinalL => '',
            Cham::LetterFinalSs => '',
            Cham::ConsonantSignFinalM => '',
            Cham::ConsonantSignFinalH => '',
            Cham::DigitZero => '',
            Cham::DigitOne => '',
            Cham::DigitTwo => '',
            Cham::DigitThree => '',
            Cham::DigitFour => '',
            Cham::DigitFive => '',
            Cham::DigitSix => '',
            Cham::DigitSeven => '',
            Cham::DigitEight => '',
            Cham::DigitNine => '',
            Cham::PunctuationSpiral => '',
            Cham::PunctuationDanda => '',
            Cham::PunctuationDoubleDanda => '',
        }
    }
}

impl std::convert::TryFrom<char> for Cham {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '' => Ok(Cham::LetterA),
            '' => Ok(Cham::LetterI),
            '' => Ok(Cham::LetterU),
            '' => Ok(Cham::LetterE),
            '' => Ok(Cham::LetterAi),
            '' => Ok(Cham::LetterO),
            '' => Ok(Cham::LetterKa),
            '' => Ok(Cham::LetterKha),
            '' => Ok(Cham::LetterGa),
            '' => Ok(Cham::LetterGha),
            '' => Ok(Cham::LetterNgue),
            '' => Ok(Cham::LetterNga),
            '' => Ok(Cham::LetterCha),
            '' => Ok(Cham::LetterChha),
            '' => Ok(Cham::LetterJa),
            '' => Ok(Cham::LetterJha),
            '' => Ok(Cham::LetterNhue),
            '' => Ok(Cham::LetterNha),
            '' => Ok(Cham::LetterNhja),
            '' => Ok(Cham::LetterTa),
            '' => Ok(Cham::LetterTha),
            '' => Ok(Cham::LetterDa),
            '' => Ok(Cham::LetterDha),
            '' => Ok(Cham::LetterNue),
            '' => Ok(Cham::LetterNa),
            '' => Ok(Cham::LetterDda),
            '' => Ok(Cham::LetterPa),
            '' => Ok(Cham::LetterPpa),
            '' => Ok(Cham::LetterPha),
            '' => Ok(Cham::LetterBa),
            '' => Ok(Cham::LetterBha),
            '' => Ok(Cham::LetterMue),
            '' => Ok(Cham::LetterMa),
            '' => Ok(Cham::LetterBba),
            '' => Ok(Cham::LetterYa),
            '' => Ok(Cham::LetterRa),
            '' => Ok(Cham::LetterLa),
            '' => Ok(Cham::LetterVa),
            '' => Ok(Cham::LetterSsa),
            '' => Ok(Cham::LetterSa),
            '' => Ok(Cham::LetterHa),
            '' => Ok(Cham::VowelSignAa),
            '' => Ok(Cham::VowelSignI),
            '' => Ok(Cham::VowelSignIi),
            '' => Ok(Cham::VowelSignEi),
            '' => Ok(Cham::VowelSignU),
            '' => Ok(Cham::VowelSignOe),
            '' => Ok(Cham::VowelSignO),
            '' => Ok(Cham::VowelSignAi),
            '' => Ok(Cham::VowelSignAu),
            '' => Ok(Cham::VowelSignUe),
            '' => Ok(Cham::ConsonantSignYa),
            '' => Ok(Cham::ConsonantSignRa),
            '' => Ok(Cham::ConsonantSignLa),
            '' => Ok(Cham::ConsonantSignWa),
            '' => Ok(Cham::LetterFinalK),
            '' => Ok(Cham::LetterFinalG),
            '' => Ok(Cham::LetterFinalNg),
            '' => Ok(Cham::ConsonantSignFinalNg),
            '' => Ok(Cham::LetterFinalCh),
            '' => Ok(Cham::LetterFinalT),
            '' => Ok(Cham::LetterFinalN),
            '' => Ok(Cham::LetterFinalP),
            '' => Ok(Cham::LetterFinalY),
            '' => Ok(Cham::LetterFinalR),
            '' => Ok(Cham::LetterFinalL),
            '' => Ok(Cham::LetterFinalSs),
            '' => Ok(Cham::ConsonantSignFinalM),
            '' => Ok(Cham::ConsonantSignFinalH),
            '' => Ok(Cham::DigitZero),
            '' => Ok(Cham::DigitOne),
            '' => Ok(Cham::DigitTwo),
            '' => Ok(Cham::DigitThree),
            '' => Ok(Cham::DigitFour),
            '' => Ok(Cham::DigitFive),
            '' => Ok(Cham::DigitSix),
            '' => Ok(Cham::DigitSeven),
            '' => Ok(Cham::DigitEight),
            '' => Ok(Cham::DigitNine),
            '' => Ok(Cham::PunctuationSpiral),
            '' => Ok(Cham::PunctuationDanda),
            '' => Ok(Cham::PunctuationDoubleDanda),
            _ => Err(()),
        }
    }
}

impl Into<u32> for Cham {
    fn into(self) -> u32 {
        let c: char = self.into();
        let hex = c
            .escape_unicode()
            .to_string()
            .replace("\\u{", "")
            .replace("}", "");
        u32::from_str_radix(&hex, 16).unwrap()
    }
}

impl std::convert::TryFrom<u32> for Cham {
    type Error = ();
    fn try_from(u: u32) -> Result<Self, Self::Error> {
        if let Ok(c) = char::try_from(u) {
            Self::try_from(c)
        } else {
            Err(())
        }
    }
}

impl Iterator for Cham {
    type Item = Self;
    fn next(&mut self) -> Option<Self> {
        let index: u32 = (*self).into();
        use std::convert::TryFrom;
        Self::try_from(index + 1).ok()
    }
}

impl Cham {
    /// The character with the lowest index in this unicode block
    pub fn new() -> Self {
        Cham::LetterA
    }

    /// The character's name, in sentence case
    pub fn name(&self) -> String {
        let s = std::format!("Cham{:#?}", self);
        string_morph::to_sentence_case(&s)
    }
}