mod constants {
pub const LETTER_ALEPH: char = '𐣠';
pub const LETTER_BETH: char = '𐣡';
pub const LETTER_GIMEL: char = '𐣢';
pub const LETTER_DALETH_DASH_RESH: char = '𐣣';
pub const LETTER_HE: char = '𐣤';
pub const LETTER_WAW: char = '𐣥';
pub const LETTER_ZAYN: char = '𐣦';
pub const LETTER_HETH: char = '𐣧';
pub const LETTER_TETH: char = '𐣨';
pub const LETTER_YODH: char = '𐣩';
pub const LETTER_KAPH: char = '𐣪';
pub const LETTER_LAMEDH: char = '𐣫';
pub const LETTER_MEM: char = '𐣬';
pub const LETTER_NUN: char = '𐣭';
pub const LETTER_SAMEKH: char = '𐣮';
pub const LETTER_AYN: char = '𐣯';
pub const LETTER_PE: char = '𐣰';
pub const LETTER_SADHE: char = '𐣱';
pub const LETTER_QOPH: char = '𐣲';
pub const LETTER_SHIN: char = '𐣴';
pub const LETTER_TAW: char = '𐣵';
pub const NUMBER_ONE: char = '𐣻';
pub const NUMBER_FIVE: char = '𐣼';
pub const NUMBER_TEN: char = '𐣽';
pub const NUMBER_TWENTY: char = '𐣾';
}
#[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 {
use constants::*;
match self {
Hatran::LetterAleph => LETTER_ALEPH,
Hatran::LetterBeth => LETTER_BETH,
Hatran::LetterGimel => LETTER_GIMEL,
Hatran::LetterDalethDashResh => LETTER_DALETH_DASH_RESH,
Hatran::LetterHe => LETTER_HE,
Hatran::LetterWaw => LETTER_WAW,
Hatran::LetterZayn => LETTER_ZAYN,
Hatran::LetterHeth => LETTER_HETH,
Hatran::LetterTeth => LETTER_TETH,
Hatran::LetterYodh => LETTER_YODH,
Hatran::LetterKaph => LETTER_KAPH,
Hatran::LetterLamedh => LETTER_LAMEDH,
Hatran::LetterMem => LETTER_MEM,
Hatran::LetterNun => LETTER_NUN,
Hatran::LetterSamekh => LETTER_SAMEKH,
Hatran::LetterAyn => LETTER_AYN,
Hatran::LetterPe => LETTER_PE,
Hatran::LetterSadhe => LETTER_SADHE,
Hatran::LetterQoph => LETTER_QOPH,
Hatran::LetterShin => LETTER_SHIN,
Hatran::LetterTaw => LETTER_TAW,
Hatran::NumberOne => NUMBER_ONE,
Hatran::NumberFive => NUMBER_FIVE,
Hatran::NumberTen => NUMBER_TEN,
Hatran::NumberTwenty => NUMBER_TWENTY,
}
}
}
impl std::convert::TryFrom<char> for Hatran {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
LETTER_ALEPH => Ok(Hatran::LetterAleph),
LETTER_BETH => Ok(Hatran::LetterBeth),
LETTER_GIMEL => Ok(Hatran::LetterGimel),
LETTER_DALETH_DASH_RESH => Ok(Hatran::LetterDalethDashResh),
LETTER_HE => Ok(Hatran::LetterHe),
LETTER_WAW => Ok(Hatran::LetterWaw),
LETTER_ZAYN => Ok(Hatran::LetterZayn),
LETTER_HETH => Ok(Hatran::LetterHeth),
LETTER_TETH => Ok(Hatran::LetterTeth),
LETTER_YODH => Ok(Hatran::LetterYodh),
LETTER_KAPH => Ok(Hatran::LetterKaph),
LETTER_LAMEDH => Ok(Hatran::LetterLamedh),
LETTER_MEM => Ok(Hatran::LetterMem),
LETTER_NUN => Ok(Hatran::LetterNun),
LETTER_SAMEKH => Ok(Hatran::LetterSamekh),
LETTER_AYN => Ok(Hatran::LetterAyn),
LETTER_PE => Ok(Hatran::LetterPe),
LETTER_SADHE => Ok(Hatran::LetterSadhe),
LETTER_QOPH => Ok(Hatran::LetterQoph),
LETTER_SHIN => Ok(Hatran::LetterShin),
LETTER_TAW => Ok(Hatran::LetterTaw),
NUMBER_ONE => Ok(Hatran::NumberOne),
NUMBER_FIVE => Ok(Hatran::NumberFive),
NUMBER_TEN => Ok(Hatran::NumberTen),
NUMBER_TWENTY => 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) -> &str {
match self {
Hatran::LetterAleph => "hatran letter aleph",
Hatran::LetterBeth => "hatran letter beth",
Hatran::LetterGimel => "hatran letter gimel",
Hatran::LetterDalethDashResh => "hatran letter daleth-resh",
Hatran::LetterHe => "hatran letter he",
Hatran::LetterWaw => "hatran letter waw",
Hatran::LetterZayn => "hatran letter zayn",
Hatran::LetterHeth => "hatran letter heth",
Hatran::LetterTeth => "hatran letter teth",
Hatran::LetterYodh => "hatran letter yodh",
Hatran::LetterKaph => "hatran letter kaph",
Hatran::LetterLamedh => "hatran letter lamedh",
Hatran::LetterMem => "hatran letter mem",
Hatran::LetterNun => "hatran letter nun",
Hatran::LetterSamekh => "hatran letter samekh",
Hatran::LetterAyn => "hatran letter ayn",
Hatran::LetterPe => "hatran letter pe",
Hatran::LetterSadhe => "hatran letter sadhe",
Hatran::LetterQoph => "hatran letter qoph",
Hatran::LetterShin => "hatran letter shin",
Hatran::LetterTaw => "hatran letter taw",
Hatran::NumberOne => "hatran number one",
Hatran::NumberFive => "hatran number five",
Hatran::NumberTen => "hatran number ten",
Hatran::NumberTwenty => "hatran number twenty",
}
}
}