1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/// A number of constants to give a name to all characters in this block.
mod constants {
    /// \u{860}: 'ࡠ'
    pub const SYRIAC_LETTER_MALAYALAM_NGA: char = 'ࡠ';
    /// \u{861}: 'ࡡ'
    pub const SYRIAC_LETTER_MALAYALAM_JA: char = 'ࡡ';
    /// \u{862}: 'ࡢ'
    pub const SYRIAC_LETTER_MALAYALAM_NYA: char = 'ࡢ';
    /// \u{863}: 'ࡣ'
    pub const SYRIAC_LETTER_MALAYALAM_TTA: char = 'ࡣ';
    /// \u{864}: 'ࡤ'
    pub const SYRIAC_LETTER_MALAYALAM_NNA: char = 'ࡤ';
    /// \u{865}: 'ࡥ'
    pub const SYRIAC_LETTER_MALAYALAM_NNNA: char = 'ࡥ';
    /// \u{866}: 'ࡦ'
    pub const SYRIAC_LETTER_MALAYALAM_BHA: char = 'ࡦ';
    /// \u{867}: 'ࡧ'
    pub const SYRIAC_LETTER_MALAYALAM_RA: char = 'ࡧ';
    /// \u{868}: 'ࡨ'
    pub const SYRIAC_LETTER_MALAYALAM_LLA: char = 'ࡨ';
    /// \u{869}: 'ࡩ'
    pub const SYRIAC_LETTER_MALAYALAM_LLLA: char = 'ࡩ';
    /// \u{86a}: 'ࡪ'
    pub const SYRIAC_LETTER_MALAYALAM_SSA: char = 'ࡪ';
}

/// An enum to represent all characters in the SyriacSupplement block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum SyriacSupplement {
    /// \u{860}: 'ࡠ'
    SyriacLetterMalayalamNga,
    /// \u{861}: 'ࡡ'
    SyriacLetterMalayalamJa,
    /// \u{862}: 'ࡢ'
    SyriacLetterMalayalamNya,
    /// \u{863}: 'ࡣ'
    SyriacLetterMalayalamTta,
    /// \u{864}: 'ࡤ'
    SyriacLetterMalayalamNna,
    /// \u{865}: 'ࡥ'
    SyriacLetterMalayalamNnna,
    /// \u{866}: 'ࡦ'
    SyriacLetterMalayalamBha,
    /// \u{867}: 'ࡧ'
    SyriacLetterMalayalamRa,
    /// \u{868}: 'ࡨ'
    SyriacLetterMalayalamLla,
    /// \u{869}: 'ࡩ'
    SyriacLetterMalayalamLlla,
    /// \u{86a}: 'ࡪ'
    SyriacLetterMalayalamSsa,
}

impl Into<char> for SyriacSupplement {
    fn into(self) -> char {
        use constants::*;
        match self {
            SyriacSupplement::SyriacLetterMalayalamNga => SYRIAC_LETTER_MALAYALAM_NGA,
            SyriacSupplement::SyriacLetterMalayalamJa => SYRIAC_LETTER_MALAYALAM_JA,
            SyriacSupplement::SyriacLetterMalayalamNya => SYRIAC_LETTER_MALAYALAM_NYA,
            SyriacSupplement::SyriacLetterMalayalamTta => SYRIAC_LETTER_MALAYALAM_TTA,
            SyriacSupplement::SyriacLetterMalayalamNna => SYRIAC_LETTER_MALAYALAM_NNA,
            SyriacSupplement::SyriacLetterMalayalamNnna => SYRIAC_LETTER_MALAYALAM_NNNA,
            SyriacSupplement::SyriacLetterMalayalamBha => SYRIAC_LETTER_MALAYALAM_BHA,
            SyriacSupplement::SyriacLetterMalayalamRa => SYRIAC_LETTER_MALAYALAM_RA,
            SyriacSupplement::SyriacLetterMalayalamLla => SYRIAC_LETTER_MALAYALAM_LLA,
            SyriacSupplement::SyriacLetterMalayalamLlla => SYRIAC_LETTER_MALAYALAM_LLLA,
            SyriacSupplement::SyriacLetterMalayalamSsa => SYRIAC_LETTER_MALAYALAM_SSA,
        }
    }
}

impl std::convert::TryFrom<char> for SyriacSupplement {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        use constants::*;
        match c {
            SYRIAC_LETTER_MALAYALAM_NGA => Ok(SyriacSupplement::SyriacLetterMalayalamNga),
            SYRIAC_LETTER_MALAYALAM_JA => Ok(SyriacSupplement::SyriacLetterMalayalamJa),
            SYRIAC_LETTER_MALAYALAM_NYA => Ok(SyriacSupplement::SyriacLetterMalayalamNya),
            SYRIAC_LETTER_MALAYALAM_TTA => Ok(SyriacSupplement::SyriacLetterMalayalamTta),
            SYRIAC_LETTER_MALAYALAM_NNA => Ok(SyriacSupplement::SyriacLetterMalayalamNna),
            SYRIAC_LETTER_MALAYALAM_NNNA => Ok(SyriacSupplement::SyriacLetterMalayalamNnna),
            SYRIAC_LETTER_MALAYALAM_BHA => Ok(SyriacSupplement::SyriacLetterMalayalamBha),
            SYRIAC_LETTER_MALAYALAM_RA => Ok(SyriacSupplement::SyriacLetterMalayalamRa),
            SYRIAC_LETTER_MALAYALAM_LLA => Ok(SyriacSupplement::SyriacLetterMalayalamLla),
            SYRIAC_LETTER_MALAYALAM_LLLA => Ok(SyriacSupplement::SyriacLetterMalayalamLlla),
            SYRIAC_LETTER_MALAYALAM_SSA => Ok(SyriacSupplement::SyriacLetterMalayalamSsa),
            _ => Err(()),
        }
    }
}

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

    /// The character's name, all lowercase and space-separated
    pub fn name(&self) -> &str {
        match self {
            SyriacSupplement::SyriacLetterMalayalamNga => "syriac letter malayalam nga",
            SyriacSupplement::SyriacLetterMalayalamJa => "syriac letter malayalam ja",
            SyriacSupplement::SyriacLetterMalayalamNya => "syriac letter malayalam nya",
            SyriacSupplement::SyriacLetterMalayalamTta => "syriac letter malayalam tta",
            SyriacSupplement::SyriacLetterMalayalamNna => "syriac letter malayalam nna",
            SyriacSupplement::SyriacLetterMalayalamNnna => "syriac letter malayalam nnna",
            SyriacSupplement::SyriacLetterMalayalamBha => "syriac letter malayalam bha",
            SyriacSupplement::SyriacLetterMalayalamRa => "syriac letter malayalam ra",
            SyriacSupplement::SyriacLetterMalayalamLla => "syriac letter malayalam lla",
            SyriacSupplement::SyriacLetterMalayalamLlla => "syriac letter malayalam llla",
            SyriacSupplement::SyriacLetterMalayalamSsa => "syriac letter malayalam ssa",
        }
    }
}