#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Hatran {
LetterAleph,
LetterBeth,
LetterGimel,
LetterDalethDashResh,
LetterHe,
LetterWaw,
LetterZayn,
LetterHeth,
LetterTeth,
LetterYodh,
LetterKaph,
LetterLamedh,
LetterMem,
LetterNun,
LetterSamekh,
LetterAyn,
LetterPe,
LetterSadhe,
LetterQoph,
LetterShin,
LetterTaw,
NumberOne,
NumberFive,
NumberTen,
NumberTwenty,
}
impl Into<char> for Hatran {
fn into(self) -> char {
match self {
Hatran::LetterAleph => '𐣠',
Hatran::LetterBeth => '𐣡',
Hatran::LetterGimel => '𐣢',
Hatran::LetterDalethDashResh => '𐣣',
Hatran::LetterHe => '𐣤',
Hatran::LetterWaw => '𐣥',
Hatran::LetterZayn => '𐣦',
Hatran::LetterHeth => '𐣧',
Hatran::LetterTeth => '𐣨',
Hatran::LetterYodh => '𐣩',
Hatran::LetterKaph => '𐣪',
Hatran::LetterLamedh => '𐣫',
Hatran::LetterMem => '𐣬',
Hatran::LetterNun => '𐣭',
Hatran::LetterSamekh => '𐣮',
Hatran::LetterAyn => '𐣯',
Hatran::LetterPe => '𐣰',
Hatran::LetterSadhe => '𐣱',
Hatran::LetterQoph => '𐣲',
Hatran::LetterShin => '𐣴',
Hatran::LetterTaw => '𐣵',
Hatran::NumberOne => '𐣻',
Hatran::NumberFive => '𐣼',
Hatran::NumberTen => '𐣽',
Hatran::NumberTwenty => '𐣾',
}
}
}
impl std::convert::TryFrom<char> for Hatran {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'𐣠' => Ok(Hatran::LetterAleph),
'𐣡' => Ok(Hatran::LetterBeth),
'𐣢' => Ok(Hatran::LetterGimel),
'𐣣' => Ok(Hatran::LetterDalethDashResh),
'𐣤' => Ok(Hatran::LetterHe),
'𐣥' => Ok(Hatran::LetterWaw),
'𐣦' => Ok(Hatran::LetterZayn),
'𐣧' => Ok(Hatran::LetterHeth),
'𐣨' => Ok(Hatran::LetterTeth),
'𐣩' => Ok(Hatran::LetterYodh),
'𐣪' => Ok(Hatran::LetterKaph),
'𐣫' => Ok(Hatran::LetterLamedh),
'𐣬' => Ok(Hatran::LetterMem),
'𐣭' => Ok(Hatran::LetterNun),
'𐣮' => Ok(Hatran::LetterSamekh),
'𐣯' => Ok(Hatran::LetterAyn),
'𐣰' => Ok(Hatran::LetterPe),
'𐣱' => Ok(Hatran::LetterSadhe),
'𐣲' => Ok(Hatran::LetterQoph),
'𐣴' => Ok(Hatran::LetterShin),
'𐣵' => Ok(Hatran::LetterTaw),
'𐣻' => Ok(Hatran::NumberOne),
'𐣼' => Ok(Hatran::NumberFive),
'𐣽' => Ok(Hatran::NumberTen),
'𐣾' => Ok(Hatran::NumberTwenty),
_ => Err(()),
}
}
}
impl Into<u32> for Hatran {
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 Hatran {
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 Hatran {
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 Hatran {
pub fn new() -> Self {
Hatran::LetterAleph
}
pub fn name(&self) -> String {
let s = std::format!("Hatran{:#?}", self);
string_morph::to_sentence_case(&s)
}
}