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 Batak block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Batak {
    /// \u{1bc0}: 'ᯀ'
    LetterA,
    /// \u{1bc1}: 'ᯁ'
    LetterSimalungunA,
    /// \u{1bc2}: 'ᯂ'
    LetterHa,
    /// \u{1bc3}: 'ᯃ'
    LetterSimalungunHa,
    /// \u{1bc4}: 'ᯄ'
    LetterMandailingHa,
    /// \u{1bc5}: 'ᯅ'
    LetterBa,
    /// \u{1bc6}: 'ᯆ'
    LetterKaroBa,
    /// \u{1bc7}: 'ᯇ'
    LetterPa,
    /// \u{1bc8}: 'ᯈ'
    LetterSimalungunPa,
    /// \u{1bc9}: 'ᯉ'
    LetterNa,
    /// \u{1bca}: 'ᯊ'
    LetterMandailingNa,
    /// \u{1bcb}: 'ᯋ'
    LetterWa,
    /// \u{1bcc}: 'ᯌ'
    LetterSimalungunWa,
    /// \u{1bcd}: 'ᯍ'
    LetterPakpakWa,
    /// \u{1bce}: 'ᯎ'
    LetterGa,
    /// \u{1bcf}: 'ᯏ'
    LetterSimalungunGa,
    /// \u{1bd0}: 'ᯐ'
    LetterJa,
    /// \u{1bd1}: 'ᯑ'
    LetterDa,
    /// \u{1bd2}: 'ᯒ'
    LetterRa,
    /// \u{1bd3}: 'ᯓ'
    LetterSimalungunRa,
    /// \u{1bd4}: 'ᯔ'
    LetterMa,
    /// \u{1bd5}: 'ᯕ'
    LetterSimalungunMa,
    /// \u{1bd6}: 'ᯖ'
    LetterSouthernTa,
    /// \u{1bd7}: 'ᯗ'
    LetterNorthernTa,
    /// \u{1bd8}: 'ᯘ'
    LetterSa,
    /// \u{1bd9}: 'ᯙ'
    LetterSimalungunSa,
    /// \u{1bda}: 'ᯚ'
    LetterMandailingSa,
    /// \u{1bdb}: 'ᯛ'
    LetterYa,
    /// \u{1bdc}: 'ᯜ'
    LetterSimalungunYa,
    /// \u{1bdd}: 'ᯝ'
    LetterNga,
    /// \u{1bde}: 'ᯞ'
    LetterLa,
    /// \u{1bdf}: 'ᯟ'
    LetterSimalungunLa,
    /// \u{1be0}: 'ᯠ'
    LetterNya,
    /// \u{1be1}: 'ᯡ'
    LetterCa,
    /// \u{1be2}: 'ᯢ'
    LetterNda,
    /// \u{1be3}: 'ᯣ'
    LetterMba,
    /// \u{1be4}: 'ᯤ'
    LetterI,
    /// \u{1be5}: 'ᯥ'
    LetterU,
    /// \u{1be6}: '᯦'
    SignTompi,
    /// \u{1be7}: 'ᯧ'
    VowelSignE,
    /// \u{1be8}: 'ᯨ'
    VowelSignPakpakE,
    /// \u{1be9}: 'ᯩ'
    VowelSignEe,
    /// \u{1bea}: 'ᯪ'
    VowelSignI,
    /// \u{1beb}: 'ᯫ'
    VowelSignKaroI,
    /// \u{1bec}: 'ᯬ'
    VowelSignO,
    /// \u{1bed}: 'ᯭ'
    VowelSignKaroO,
    /// \u{1bee}: 'ᯮ'
    VowelSignU,
    /// \u{1bef}: 'ᯯ'
    VowelSignUForSimalungunSa,
    /// \u{1bf0}: 'ᯰ'
    ConsonantSignNg,
    /// \u{1bf1}: 'ᯱ'
    ConsonantSignH,
    /// \u{1bf2}: '᯲'
    Pangolat,
    /// \u{1bf3}: '᯳'
    Panongonan,
    /// \u{1bfc}: '᯼'
    SymbolBinduNaMetek,
    /// \u{1bfd}: '᯽'
    SymbolBinduPinarboras,
    /// \u{1bfe}: '᯾'
    SymbolBinduJudul,
}

impl Into<char> for Batak {
    fn into(self) -> char {
        match self {
            Batak::LetterA => '',
            Batak::LetterSimalungunA => '',
            Batak::LetterHa => '',
            Batak::LetterSimalungunHa => '',
            Batak::LetterMandailingHa => '',
            Batak::LetterBa => '',
            Batak::LetterKaroBa => '',
            Batak::LetterPa => '',
            Batak::LetterSimalungunPa => '',
            Batak::LetterNa => '',
            Batak::LetterMandailingNa => '',
            Batak::LetterWa => '',
            Batak::LetterSimalungunWa => '',
            Batak::LetterPakpakWa => '',
            Batak::LetterGa => '',
            Batak::LetterSimalungunGa => '',
            Batak::LetterJa => '',
            Batak::LetterDa => '',
            Batak::LetterRa => '',
            Batak::LetterSimalungunRa => '',
            Batak::LetterMa => '',
            Batak::LetterSimalungunMa => '',
            Batak::LetterSouthernTa => '',
            Batak::LetterNorthernTa => '',
            Batak::LetterSa => '',
            Batak::LetterSimalungunSa => '',
            Batak::LetterMandailingSa => '',
            Batak::LetterYa => '',
            Batak::LetterSimalungunYa => '',
            Batak::LetterNga => '',
            Batak::LetterLa => '',
            Batak::LetterSimalungunLa => '',
            Batak::LetterNya => '',
            Batak::LetterCa => '',
            Batak::LetterNda => '',
            Batak::LetterMba => '',
            Batak::LetterI => '',
            Batak::LetterU => '',
            Batak::SignTompi => '',
            Batak::VowelSignE => '',
            Batak::VowelSignPakpakE => '',
            Batak::VowelSignEe => '',
            Batak::VowelSignI => '',
            Batak::VowelSignKaroI => '',
            Batak::VowelSignO => '',
            Batak::VowelSignKaroO => '',
            Batak::VowelSignU => '',
            Batak::VowelSignUForSimalungunSa => '',
            Batak::ConsonantSignNg => '',
            Batak::ConsonantSignH => '',
            Batak::Pangolat => '',
            Batak::Panongonan => '',
            Batak::SymbolBinduNaMetek => '',
            Batak::SymbolBinduPinarboras => '',
            Batak::SymbolBinduJudul => '',
        }
    }
}

impl std::convert::TryFrom<char> for Batak {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '' => Ok(Batak::LetterA),
            '' => Ok(Batak::LetterSimalungunA),
            '' => Ok(Batak::LetterHa),
            '' => Ok(Batak::LetterSimalungunHa),
            '' => Ok(Batak::LetterMandailingHa),
            '' => Ok(Batak::LetterBa),
            '' => Ok(Batak::LetterKaroBa),
            '' => Ok(Batak::LetterPa),
            '' => Ok(Batak::LetterSimalungunPa),
            '' => Ok(Batak::LetterNa),
            '' => Ok(Batak::LetterMandailingNa),
            '' => Ok(Batak::LetterWa),
            '' => Ok(Batak::LetterSimalungunWa),
            '' => Ok(Batak::LetterPakpakWa),
            '' => Ok(Batak::LetterGa),
            '' => Ok(Batak::LetterSimalungunGa),
            '' => Ok(Batak::LetterJa),
            '' => Ok(Batak::LetterDa),
            '' => Ok(Batak::LetterRa),
            '' => Ok(Batak::LetterSimalungunRa),
            '' => Ok(Batak::LetterMa),
            '' => Ok(Batak::LetterSimalungunMa),
            '' => Ok(Batak::LetterSouthernTa),
            '' => Ok(Batak::LetterNorthernTa),
            '' => Ok(Batak::LetterSa),
            '' => Ok(Batak::LetterSimalungunSa),
            '' => Ok(Batak::LetterMandailingSa),
            '' => Ok(Batak::LetterYa),
            '' => Ok(Batak::LetterSimalungunYa),
            '' => Ok(Batak::LetterNga),
            '' => Ok(Batak::LetterLa),
            '' => Ok(Batak::LetterSimalungunLa),
            '' => Ok(Batak::LetterNya),
            '' => Ok(Batak::LetterCa),
            '' => Ok(Batak::LetterNda),
            '' => Ok(Batak::LetterMba),
            '' => Ok(Batak::LetterI),
            '' => Ok(Batak::LetterU),
            '' => Ok(Batak::SignTompi),
            '' => Ok(Batak::VowelSignE),
            '' => Ok(Batak::VowelSignPakpakE),
            '' => Ok(Batak::VowelSignEe),
            '' => Ok(Batak::VowelSignI),
            '' => Ok(Batak::VowelSignKaroI),
            '' => Ok(Batak::VowelSignO),
            '' => Ok(Batak::VowelSignKaroO),
            '' => Ok(Batak::VowelSignU),
            '' => Ok(Batak::VowelSignUForSimalungunSa),
            '' => Ok(Batak::ConsonantSignNg),
            '' => Ok(Batak::ConsonantSignH),
            '' => Ok(Batak::Pangolat),
            '' => Ok(Batak::Panongonan),
            '' => Ok(Batak::SymbolBinduNaMetek),
            '' => Ok(Batak::SymbolBinduPinarboras),
            '' => Ok(Batak::SymbolBinduJudul),
            _ => Err(()),
        }
    }
}

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

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