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 Bopomofo block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Bopomofo {
    /// \u{3105}: 'ㄅ'
    LetterB,
    /// \u{3106}: 'ㄆ'
    LetterP,
    /// \u{3107}: 'ㄇ'
    LetterM,
    /// \u{3108}: 'ㄈ'
    LetterF,
    /// \u{3109}: 'ㄉ'
    LetterD,
    /// \u{310a}: 'ㄊ'
    LetterT,
    /// \u{310b}: 'ㄋ'
    LetterN,
    /// \u{310c}: 'ㄌ'
    LetterL,
    /// \u{310d}: 'ㄍ'
    LetterG,
    /// \u{310e}: 'ㄎ'
    LetterK,
    /// \u{310f}: 'ㄏ'
    LetterH,
    /// \u{3110}: 'ㄐ'
    LetterJ,
    /// \u{3111}: 'ㄑ'
    LetterQ,
    /// \u{3112}: 'ㄒ'
    LetterX,
    /// \u{3113}: 'ㄓ'
    LetterZh,
    /// \u{3114}: 'ㄔ'
    LetterCh,
    /// \u{3115}: 'ㄕ'
    LetterSh,
    /// \u{3116}: 'ㄖ'
    LetterR,
    /// \u{3117}: 'ㄗ'
    LetterZ,
    /// \u{3118}: 'ㄘ'
    LetterC,
    /// \u{3119}: 'ㄙ'
    LetterS,
    /// \u{311a}: 'ㄚ'
    LetterA,
    /// \u{311b}: 'ㄛ'
    LetterO,
    /// \u{311c}: 'ㄜ'
    LetterE,
    /// \u{311d}: 'ㄝ'
    LetterEh,
    /// \u{311e}: 'ㄞ'
    LetterAi,
    /// \u{311f}: 'ㄟ'
    LetterEi,
    /// \u{3120}: 'ㄠ'
    LetterAu,
    /// \u{3121}: 'ㄡ'
    LetterOu,
    /// \u{3122}: 'ㄢ'
    LetterAn,
    /// \u{3123}: 'ㄣ'
    LetterEn,
    /// \u{3124}: 'ㄤ'
    LetterAng,
    /// \u{3125}: 'ㄥ'
    LetterEng,
    /// \u{3126}: 'ㄦ'
    LetterEr,
    /// \u{3127}: 'ㄧ'
    LetterI,
    /// \u{3128}: 'ㄨ'
    LetterU,
    /// \u{3129}: 'ㄩ'
    LetterIu,
    /// \u{312a}: 'ㄪ'
    LetterV,
    /// \u{312b}: 'ㄫ'
    LetterNg,
    /// \u{312c}: 'ㄬ'
    LetterGn,
    /// \u{312d}: 'ㄭ'
    LetterIh,
    /// \u{312e}: 'ㄮ'
    LetterOWithDotAbove,
}

impl Into<char> for Bopomofo {
    fn into(self) -> char {
        match self {
            Bopomofo::LetterB => '',
            Bopomofo::LetterP => '',
            Bopomofo::LetterM => '',
            Bopomofo::LetterF => '',
            Bopomofo::LetterD => '',
            Bopomofo::LetterT => '',
            Bopomofo::LetterN => '',
            Bopomofo::LetterL => '',
            Bopomofo::LetterG => '',
            Bopomofo::LetterK => '',
            Bopomofo::LetterH => '',
            Bopomofo::LetterJ => '',
            Bopomofo::LetterQ => '',
            Bopomofo::LetterX => '',
            Bopomofo::LetterZh => '',
            Bopomofo::LetterCh => '',
            Bopomofo::LetterSh => '',
            Bopomofo::LetterR => '',
            Bopomofo::LetterZ => '',
            Bopomofo::LetterC => '',
            Bopomofo::LetterS => '',
            Bopomofo::LetterA => '',
            Bopomofo::LetterO => '',
            Bopomofo::LetterE => '',
            Bopomofo::LetterEh => '',
            Bopomofo::LetterAi => '',
            Bopomofo::LetterEi => '',
            Bopomofo::LetterAu => '',
            Bopomofo::LetterOu => '',
            Bopomofo::LetterAn => '',
            Bopomofo::LetterEn => '',
            Bopomofo::LetterAng => '',
            Bopomofo::LetterEng => '',
            Bopomofo::LetterEr => '',
            Bopomofo::LetterI => '',
            Bopomofo::LetterU => '',
            Bopomofo::LetterIu => '',
            Bopomofo::LetterV => '',
            Bopomofo::LetterNg => '',
            Bopomofo::LetterGn => '',
            Bopomofo::LetterIh => '',
            Bopomofo::LetterOWithDotAbove => '',
        }
    }
}

impl std::convert::TryFrom<char> for Bopomofo {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '' => Ok(Bopomofo::LetterB),
            '' => Ok(Bopomofo::LetterP),
            '' => Ok(Bopomofo::LetterM),
            '' => Ok(Bopomofo::LetterF),
            '' => Ok(Bopomofo::LetterD),
            '' => Ok(Bopomofo::LetterT),
            '' => Ok(Bopomofo::LetterN),
            '' => Ok(Bopomofo::LetterL),
            '' => Ok(Bopomofo::LetterG),
            '' => Ok(Bopomofo::LetterK),
            '' => Ok(Bopomofo::LetterH),
            '' => Ok(Bopomofo::LetterJ),
            '' => Ok(Bopomofo::LetterQ),
            '' => Ok(Bopomofo::LetterX),
            '' => Ok(Bopomofo::LetterZh),
            '' => Ok(Bopomofo::LetterCh),
            '' => Ok(Bopomofo::LetterSh),
            '' => Ok(Bopomofo::LetterR),
            '' => Ok(Bopomofo::LetterZ),
            '' => Ok(Bopomofo::LetterC),
            '' => Ok(Bopomofo::LetterS),
            '' => Ok(Bopomofo::LetterA),
            '' => Ok(Bopomofo::LetterO),
            '' => Ok(Bopomofo::LetterE),
            '' => Ok(Bopomofo::LetterEh),
            '' => Ok(Bopomofo::LetterAi),
            '' => Ok(Bopomofo::LetterEi),
            '' => Ok(Bopomofo::LetterAu),
            '' => Ok(Bopomofo::LetterOu),
            '' => Ok(Bopomofo::LetterAn),
            '' => Ok(Bopomofo::LetterEn),
            '' => Ok(Bopomofo::LetterAng),
            '' => Ok(Bopomofo::LetterEng),
            '' => Ok(Bopomofo::LetterEr),
            '' => Ok(Bopomofo::LetterI),
            '' => Ok(Bopomofo::LetterU),
            '' => Ok(Bopomofo::LetterIu),
            '' => Ok(Bopomofo::LetterV),
            '' => Ok(Bopomofo::LetterNg),
            '' => Ok(Bopomofo::LetterGn),
            '' => Ok(Bopomofo::LetterIh),
            '' => Ok(Bopomofo::LetterOWithDotAbove),
            _ => Err(()),
        }
    }
}

impl Into<u32> for Bopomofo {
    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 Bopomofo {
    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 Bopomofo {
    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 Bopomofo {
    /// The character with the lowest index in this unicode block
    pub fn new() -> Self {
        Bopomofo::LetterB
    }

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