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 Tifinagh block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Tifinagh {
    /// \u{2d30}: 'ⴰ'
    LetterYa,
    /// \u{2d31}: 'ⴱ'
    LetterYab,
    /// \u{2d32}: 'ⴲ'
    LetterYabh,
    /// \u{2d33}: 'ⴳ'
    LetterYag,
    /// \u{2d34}: 'ⴴ'
    LetterYaghh,
    /// \u{2d35}: 'ⴵ'
    LetterBerberAcademyYaj,
    /// \u{2d36}: 'ⴶ'
    LetterYaj,
    /// \u{2d37}: 'ⴷ'
    LetterYad,
    /// \u{2d38}: 'ⴸ'
    LetterYadh,
    /// \u{2d39}: 'ⴹ'
    LetterYadd,
    /// \u{2d3a}: 'ⴺ'
    LetterYaddh,
    /// \u{2d3b}: 'ⴻ'
    LetterYey,
    /// \u{2d3c}: 'ⴼ'
    LetterYaf,
    /// \u{2d3d}: 'ⴽ'
    LetterYak,
    /// \u{2d3e}: 'ⴾ'
    LetterTuaregYak,
    /// \u{2d3f}: 'ⴿ'
    LetterYakhh,
    /// \u{2d40}: 'ⵀ'
    LetterYah,
    /// \u{2d41}: 'ⵁ'
    LetterBerberAcademyYah,
    /// \u{2d42}: 'ⵂ'
    LetterTuaregYah,
    /// \u{2d43}: 'ⵃ'
    LetterYahh,
    /// \u{2d44}: 'ⵄ'
    LetterYaa,
    /// \u{2d45}: 'ⵅ'
    LetterYakh,
    /// \u{2d46}: 'ⵆ'
    LetterTuaregYakh,
    /// \u{2d47}: 'ⵇ'
    LetterYaq,
    /// \u{2d48}: 'ⵈ'
    LetterTuaregYaq,
    /// \u{2d49}: 'ⵉ'
    LetterYi,
    /// \u{2d4a}: 'ⵊ'
    LetterYazh,
    /// \u{2d4b}: 'ⵋ'
    LetterAhaggarYazh,
    /// \u{2d4c}: 'ⵌ'
    LetterTuaregYazh,
    /// \u{2d4d}: 'ⵍ'
    LetterYal,
    /// \u{2d4e}: 'ⵎ'
    LetterYam,
    /// \u{2d4f}: 'ⵏ'
    LetterYan,
    /// \u{2d50}: 'ⵐ'
    LetterTuaregYagn,
    /// \u{2d51}: 'ⵑ'
    LetterTuaregYang,
    /// \u{2d52}: 'ⵒ'
    LetterYap,
    /// \u{2d53}: 'ⵓ'
    LetterYu,
    /// \u{2d54}: 'ⵔ'
    LetterYar,
    /// \u{2d55}: 'ⵕ'
    LetterYarr,
    /// \u{2d56}: 'ⵖ'
    LetterYagh,
    /// \u{2d57}: 'ⵗ'
    LetterTuaregYagh,
    /// \u{2d58}: 'ⵘ'
    LetterAyerYagh,
    /// \u{2d59}: 'ⵙ'
    LetterYas,
    /// \u{2d5a}: 'ⵚ'
    LetterYass,
    /// \u{2d5b}: 'ⵛ'
    LetterYash,
    /// \u{2d5c}: 'ⵜ'
    LetterYat,
    /// \u{2d5d}: 'ⵝ'
    LetterYath,
    /// \u{2d5e}: 'ⵞ'
    LetterYach,
    /// \u{2d5f}: 'ⵟ'
    LetterYatt,
    /// \u{2d60}: 'ⵠ'
    LetterYav,
    /// \u{2d61}: 'ⵡ'
    LetterYaw,
    /// \u{2d62}: 'ⵢ'
    LetterYay,
    /// \u{2d63}: 'ⵣ'
    LetterYaz,
    /// \u{2d64}: 'ⵤ'
    LetterTawellemetYaz,
    /// \u{2d65}: 'ⵥ'
    LetterYazz,
    /// \u{2d66}: 'ⵦ'
    LetterYe,
    /// \u{2d67}: 'ⵧ'
    LetterYo,
    /// \u{2d6f}: 'ⵯ'
    ModifierLetterLabializationMark,
    /// \u{2d70}: '⵰'
    SeparatorMark,
}

impl Into<char> for Tifinagh {
    fn into(self) -> char {
        match self {
            Tifinagh::LetterYa => '',
            Tifinagh::LetterYab => '',
            Tifinagh::LetterYabh => '',
            Tifinagh::LetterYag => '',
            Tifinagh::LetterYaghh => '',
            Tifinagh::LetterBerberAcademyYaj => '',
            Tifinagh::LetterYaj => '',
            Tifinagh::LetterYad => '',
            Tifinagh::LetterYadh => '',
            Tifinagh::LetterYadd => '',
            Tifinagh::LetterYaddh => '',
            Tifinagh::LetterYey => '',
            Tifinagh::LetterYaf => '',
            Tifinagh::LetterYak => '',
            Tifinagh::LetterTuaregYak => '',
            Tifinagh::LetterYakhh => 'ⴿ',
            Tifinagh::LetterYah => '',
            Tifinagh::LetterBerberAcademyYah => '',
            Tifinagh::LetterTuaregYah => '',
            Tifinagh::LetterYahh => '',
            Tifinagh::LetterYaa => '',
            Tifinagh::LetterYakh => '',
            Tifinagh::LetterTuaregYakh => '',
            Tifinagh::LetterYaq => '',
            Tifinagh::LetterTuaregYaq => '',
            Tifinagh::LetterYi => '',
            Tifinagh::LetterYazh => '',
            Tifinagh::LetterAhaggarYazh => '',
            Tifinagh::LetterTuaregYazh => '',
            Tifinagh::LetterYal => '',
            Tifinagh::LetterYam => '',
            Tifinagh::LetterYan => '',
            Tifinagh::LetterTuaregYagn => '',
            Tifinagh::LetterTuaregYang => '',
            Tifinagh::LetterYap => '',
            Tifinagh::LetterYu => '',
            Tifinagh::LetterYar => '',
            Tifinagh::LetterYarr => '',
            Tifinagh::LetterYagh => '',
            Tifinagh::LetterTuaregYagh => '',
            Tifinagh::LetterAyerYagh => '',
            Tifinagh::LetterYas => '',
            Tifinagh::LetterYass => '',
            Tifinagh::LetterYash => '',
            Tifinagh::LetterYat => '',
            Tifinagh::LetterYath => '',
            Tifinagh::LetterYach => '',
            Tifinagh::LetterYatt => '',
            Tifinagh::LetterYav => '',
            Tifinagh::LetterYaw => '',
            Tifinagh::LetterYay => '',
            Tifinagh::LetterYaz => '',
            Tifinagh::LetterTawellemetYaz => '',
            Tifinagh::LetterYazz => '',
            Tifinagh::LetterYe => '',
            Tifinagh::LetterYo => '',
            Tifinagh::ModifierLetterLabializationMark => '',
            Tifinagh::SeparatorMark => '',
        }
    }
}

impl std::convert::TryFrom<char> for Tifinagh {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '' => Ok(Tifinagh::LetterYa),
            '' => Ok(Tifinagh::LetterYab),
            '' => Ok(Tifinagh::LetterYabh),
            '' => Ok(Tifinagh::LetterYag),
            '' => Ok(Tifinagh::LetterYaghh),
            '' => Ok(Tifinagh::LetterBerberAcademyYaj),
            '' => Ok(Tifinagh::LetterYaj),
            '' => Ok(Tifinagh::LetterYad),
            '' => Ok(Tifinagh::LetterYadh),
            '' => Ok(Tifinagh::LetterYadd),
            '' => Ok(Tifinagh::LetterYaddh),
            '' => Ok(Tifinagh::LetterYey),
            '' => Ok(Tifinagh::LetterYaf),
            '' => Ok(Tifinagh::LetterYak),
            '' => Ok(Tifinagh::LetterTuaregYak),
            'ⴿ' => Ok(Tifinagh::LetterYakhh),
            '' => Ok(Tifinagh::LetterYah),
            '' => Ok(Tifinagh::LetterBerberAcademyYah),
            '' => Ok(Tifinagh::LetterTuaregYah),
            '' => Ok(Tifinagh::LetterYahh),
            '' => Ok(Tifinagh::LetterYaa),
            '' => Ok(Tifinagh::LetterYakh),
            '' => Ok(Tifinagh::LetterTuaregYakh),
            '' => Ok(Tifinagh::LetterYaq),
            '' => Ok(Tifinagh::LetterTuaregYaq),
            '' => Ok(Tifinagh::LetterYi),
            '' => Ok(Tifinagh::LetterYazh),
            '' => Ok(Tifinagh::LetterAhaggarYazh),
            '' => Ok(Tifinagh::LetterTuaregYazh),
            '' => Ok(Tifinagh::LetterYal),
            '' => Ok(Tifinagh::LetterYam),
            '' => Ok(Tifinagh::LetterYan),
            '' => Ok(Tifinagh::LetterTuaregYagn),
            '' => Ok(Tifinagh::LetterTuaregYang),
            '' => Ok(Tifinagh::LetterYap),
            '' => Ok(Tifinagh::LetterYu),
            '' => Ok(Tifinagh::LetterYar),
            '' => Ok(Tifinagh::LetterYarr),
            '' => Ok(Tifinagh::LetterYagh),
            '' => Ok(Tifinagh::LetterTuaregYagh),
            '' => Ok(Tifinagh::LetterAyerYagh),
            '' => Ok(Tifinagh::LetterYas),
            '' => Ok(Tifinagh::LetterYass),
            '' => Ok(Tifinagh::LetterYash),
            '' => Ok(Tifinagh::LetterYat),
            '' => Ok(Tifinagh::LetterYath),
            '' => Ok(Tifinagh::LetterYach),
            '' => Ok(Tifinagh::LetterYatt),
            '' => Ok(Tifinagh::LetterYav),
            '' => Ok(Tifinagh::LetterYaw),
            '' => Ok(Tifinagh::LetterYay),
            '' => Ok(Tifinagh::LetterYaz),
            '' => Ok(Tifinagh::LetterTawellemetYaz),
            '' => Ok(Tifinagh::LetterYazz),
            '' => Ok(Tifinagh::LetterYe),
            '' => Ok(Tifinagh::LetterYo),
            '' => Ok(Tifinagh::ModifierLetterLabializationMark),
            '' => Ok(Tifinagh::SeparatorMark),
            _ => Err(()),
        }
    }
}

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

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