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

/// An enum to represent all characters in the AncientSymbols block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum AncientSymbols {
    /// \u{10190}: '𐆐'
    RomanSextansSign,
    /// \u{10191}: '𐆑'
    RomanUnciaSign,
    /// \u{10192}: '𐆒'
    RomanSemunciaSign,
    /// \u{10193}: '𐆓'
    RomanSextulaSign,
    /// \u{10194}: '𐆔'
    RomanDimidiaSextulaSign,
    /// \u{10195}: '𐆕'
    RomanSiliquaSign,
    /// \u{10196}: '𐆖'
    RomanDenariusSign,
    /// \u{10197}: '𐆗'
    RomanQuinariusSign,
    /// \u{10198}: '𐆘'
    RomanSestertiusSign,
    /// \u{10199}: '𐆙'
    RomanDupondiusSign,
    /// \u{1019a}: '𐆚'
    RomanAsSign,
    /// \u{1019b}: '𐆛'
    RomanCenturialSign,
    /// \u{101a0}: '𐆠'
    GreekSymbolTauRho,
}

impl Into<char> for AncientSymbols {
    fn into(self) -> char {
        match self {
            AncientSymbols::RomanSextansSign => '𐆐',
            AncientSymbols::RomanUnciaSign => '𐆑',
            AncientSymbols::RomanSemunciaSign => '𐆒',
            AncientSymbols::RomanSextulaSign => '𐆓',
            AncientSymbols::RomanDimidiaSextulaSign => '𐆔',
            AncientSymbols::RomanSiliquaSign => '𐆕',
            AncientSymbols::RomanDenariusSign => '𐆖',
            AncientSymbols::RomanQuinariusSign => '𐆗',
            AncientSymbols::RomanSestertiusSign => '𐆘',
            AncientSymbols::RomanDupondiusSign => '𐆙',
            AncientSymbols::RomanAsSign => '𐆚',
            AncientSymbols::RomanCenturialSign => '𐆛',
            AncientSymbols::GreekSymbolTauRho => '𐆠',
        }
    }
}

impl std::convert::TryFrom<char> for AncientSymbols {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '𐆐' => Ok(AncientSymbols::RomanSextansSign),
            '𐆑' => Ok(AncientSymbols::RomanUnciaSign),
            '𐆒' => Ok(AncientSymbols::RomanSemunciaSign),
            '𐆓' => Ok(AncientSymbols::RomanSextulaSign),
            '𐆔' => Ok(AncientSymbols::RomanDimidiaSextulaSign),
            '𐆕' => Ok(AncientSymbols::RomanSiliquaSign),
            '𐆖' => Ok(AncientSymbols::RomanDenariusSign),
            '𐆗' => Ok(AncientSymbols::RomanQuinariusSign),
            '𐆘' => Ok(AncientSymbols::RomanSestertiusSign),
            '𐆙' => Ok(AncientSymbols::RomanDupondiusSign),
            '𐆚' => Ok(AncientSymbols::RomanAsSign),
            '𐆛' => Ok(AncientSymbols::RomanCenturialSign),
            '𐆠' => Ok(AncientSymbols::GreekSymbolTauRho),
            _ => Err(()),
        }
    }
}

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

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