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 Lisu block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Lisu {
    /// \u{a4d0}: 'ꓐ'
    LetterBa,
    /// \u{a4d1}: 'ꓑ'
    LetterPa,
    /// \u{a4d2}: 'ꓒ'
    LetterPha,
    /// \u{a4d3}: 'ꓓ'
    LetterDa,
    /// \u{a4d4}: 'ꓔ'
    LetterTa,
    /// \u{a4d5}: 'ꓕ'
    LetterTha,
    /// \u{a4d6}: 'ꓖ'
    LetterGa,
    /// \u{a4d7}: 'ꓗ'
    LetterKa,
    /// \u{a4d8}: 'ꓘ'
    LetterKha,
    /// \u{a4d9}: 'ꓙ'
    LetterJa,
    /// \u{a4da}: 'ꓚ'
    LetterCa,
    /// \u{a4db}: 'ꓛ'
    LetterCha,
    /// \u{a4dc}: 'ꓜ'
    LetterDza,
    /// \u{a4dd}: 'ꓝ'
    LetterTsa,
    /// \u{a4de}: 'ꓞ'
    LetterTsha,
    /// \u{a4df}: 'ꓟ'
    LetterMa,
    /// \u{a4e0}: 'ꓠ'
    LetterNa,
    /// \u{a4e1}: 'ꓡ'
    LetterLa,
    /// \u{a4e2}: 'ꓢ'
    LetterSa,
    /// \u{a4e3}: 'ꓣ'
    LetterZha,
    /// \u{a4e4}: 'ꓤ'
    LetterZa,
    /// \u{a4e5}: 'ꓥ'
    LetterNga,
    /// \u{a4e6}: 'ꓦ'
    LetterHa,
    /// \u{a4e7}: 'ꓧ'
    LetterXa,
    /// \u{a4e8}: 'ꓨ'
    LetterHha,
    /// \u{a4e9}: 'ꓩ'
    LetterFa,
    /// \u{a4ea}: 'ꓪ'
    LetterWa,
    /// \u{a4eb}: 'ꓫ'
    LetterSha,
    /// \u{a4ec}: 'ꓬ'
    LetterYa,
    /// \u{a4ed}: 'ꓭ'
    LetterGha,
    /// \u{a4ee}: 'ꓮ'
    LetterA,
    /// \u{a4ef}: 'ꓯ'
    LetterAe,
    /// \u{a4f0}: 'ꓰ'
    LetterE,
    /// \u{a4f1}: 'ꓱ'
    LetterEu,
    /// \u{a4f2}: 'ꓲ'
    LetterI,
    /// \u{a4f3}: 'ꓳ'
    LetterO,
    /// \u{a4f4}: 'ꓴ'
    LetterU,
    /// \u{a4f5}: 'ꓵ'
    LetterUe,
    /// \u{a4f6}: 'ꓶ'
    LetterUh,
    /// \u{a4f7}: 'ꓷ'
    LetterOe,
    /// \u{a4f8}: 'ꓸ'
    LetterToneMyaTi,
    /// \u{a4f9}: 'ꓹ'
    LetterToneNaPo,
    /// \u{a4fa}: 'ꓺ'
    LetterToneMyaCya,
    /// \u{a4fb}: 'ꓻ'
    LetterToneMyaBo,
    /// \u{a4fc}: 'ꓼ'
    LetterToneMyaNa,
    /// \u{a4fd}: 'ꓽ'
    LetterToneMyaJeu,
    /// \u{a4fe}: '꓾'
    PunctuationComma,
}

impl Into<char> for Lisu {
    fn into(self) -> char {
        match self {
            Lisu::LetterBa => '',
            Lisu::LetterPa => '',
            Lisu::LetterPha => '',
            Lisu::LetterDa => '',
            Lisu::LetterTa => '',
            Lisu::LetterTha => '',
            Lisu::LetterGa => '',
            Lisu::LetterKa => '',
            Lisu::LetterKha => '',
            Lisu::LetterJa => '',
            Lisu::LetterCa => '',
            Lisu::LetterCha => '',
            Lisu::LetterDza => '',
            Lisu::LetterTsa => '',
            Lisu::LetterTsha => '',
            Lisu::LetterMa => '',
            Lisu::LetterNa => '',
            Lisu::LetterLa => '',
            Lisu::LetterSa => '',
            Lisu::LetterZha => '',
            Lisu::LetterZa => '',
            Lisu::LetterNga => '',
            Lisu::LetterHa => '',
            Lisu::LetterXa => '',
            Lisu::LetterHha => '',
            Lisu::LetterFa => '',
            Lisu::LetterWa => '',
            Lisu::LetterSha => '',
            Lisu::LetterYa => '',
            Lisu::LetterGha => '',
            Lisu::LetterA => '',
            Lisu::LetterAe => '',
            Lisu::LetterE => '',
            Lisu::LetterEu => '',
            Lisu::LetterI => '',
            Lisu::LetterO => '',
            Lisu::LetterU => '',
            Lisu::LetterUe => '',
            Lisu::LetterUh => '',
            Lisu::LetterOe => '',
            Lisu::LetterToneMyaTi => '',
            Lisu::LetterToneNaPo => '',
            Lisu::LetterToneMyaCya => '',
            Lisu::LetterToneMyaBo => '',
            Lisu::LetterToneMyaNa => '',
            Lisu::LetterToneMyaJeu => '',
            Lisu::PunctuationComma => '',
        }
    }
}

impl std::convert::TryFrom<char> for Lisu {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '' => Ok(Lisu::LetterBa),
            '' => Ok(Lisu::LetterPa),
            '' => Ok(Lisu::LetterPha),
            '' => Ok(Lisu::LetterDa),
            '' => Ok(Lisu::LetterTa),
            '' => Ok(Lisu::LetterTha),
            '' => Ok(Lisu::LetterGa),
            '' => Ok(Lisu::LetterKa),
            '' => Ok(Lisu::LetterKha),
            '' => Ok(Lisu::LetterJa),
            '' => Ok(Lisu::LetterCa),
            '' => Ok(Lisu::LetterCha),
            '' => Ok(Lisu::LetterDza),
            '' => Ok(Lisu::LetterTsa),
            '' => Ok(Lisu::LetterTsha),
            '' => Ok(Lisu::LetterMa),
            '' => Ok(Lisu::LetterNa),
            '' => Ok(Lisu::LetterLa),
            '' => Ok(Lisu::LetterSa),
            '' => Ok(Lisu::LetterZha),
            '' => Ok(Lisu::LetterZa),
            '' => Ok(Lisu::LetterNga),
            '' => Ok(Lisu::LetterHa),
            '' => Ok(Lisu::LetterXa),
            '' => Ok(Lisu::LetterHha),
            '' => Ok(Lisu::LetterFa),
            '' => Ok(Lisu::LetterWa),
            '' => Ok(Lisu::LetterSha),
            '' => Ok(Lisu::LetterYa),
            '' => Ok(Lisu::LetterGha),
            '' => Ok(Lisu::LetterA),
            '' => Ok(Lisu::LetterAe),
            '' => Ok(Lisu::LetterE),
            '' => Ok(Lisu::LetterEu),
            '' => Ok(Lisu::LetterI),
            '' => Ok(Lisu::LetterO),
            '' => Ok(Lisu::LetterU),
            '' => Ok(Lisu::LetterUe),
            '' => Ok(Lisu::LetterUh),
            '' => Ok(Lisu::LetterOe),
            '' => Ok(Lisu::LetterToneMyaTi),
            '' => Ok(Lisu::LetterToneNaPo),
            '' => Ok(Lisu::LetterToneMyaCya),
            '' => Ok(Lisu::LetterToneMyaBo),
            '' => Ok(Lisu::LetterToneMyaNa),
            '' => Ok(Lisu::LetterToneMyaJeu),
            '' => Ok(Lisu::PunctuationComma),
            _ => Err(()),
        }
    }
}

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

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