#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Cham {
LetterA,
LetterI,
LetterU,
LetterE,
LetterAi,
LetterO,
LetterKa,
LetterKha,
LetterGa,
LetterGha,
LetterNgue,
LetterNga,
LetterCha,
LetterChha,
LetterJa,
LetterJha,
LetterNhue,
LetterNha,
LetterNhja,
LetterTa,
LetterTha,
LetterDa,
LetterDha,
LetterNue,
LetterNa,
LetterDda,
LetterPa,
LetterPpa,
LetterPha,
LetterBa,
LetterBha,
LetterMue,
LetterMa,
LetterBba,
LetterYa,
LetterRa,
LetterLa,
LetterVa,
LetterSsa,
LetterSa,
LetterHa,
VowelSignAa,
VowelSignI,
VowelSignIi,
VowelSignEi,
VowelSignU,
VowelSignOe,
VowelSignO,
VowelSignAi,
VowelSignAu,
VowelSignUe,
ConsonantSignYa,
ConsonantSignRa,
ConsonantSignLa,
ConsonantSignWa,
LetterFinalK,
LetterFinalG,
LetterFinalNg,
ConsonantSignFinalNg,
LetterFinalCh,
LetterFinalT,
LetterFinalN,
LetterFinalP,
LetterFinalY,
LetterFinalR,
LetterFinalL,
LetterFinalSs,
ConsonantSignFinalM,
ConsonantSignFinalH,
DigitZero,
DigitOne,
DigitTwo,
DigitThree,
DigitFour,
DigitFive,
DigitSix,
DigitSeven,
DigitEight,
DigitNine,
PunctuationSpiral,
PunctuationDanda,
PunctuationDoubleDanda,
}
impl Into<char> for Cham {
fn into(self) -> char {
match self {
Cham::LetterA => 'ꨀ',
Cham::LetterI => 'ꨁ',
Cham::LetterU => 'ꨂ',
Cham::LetterE => 'ꨃ',
Cham::LetterAi => 'ꨄ',
Cham::LetterO => 'ꨅ',
Cham::LetterKa => 'ꨆ',
Cham::LetterKha => 'ꨇ',
Cham::LetterGa => 'ꨈ',
Cham::LetterGha => 'ꨉ',
Cham::LetterNgue => 'ꨊ',
Cham::LetterNga => 'ꨋ',
Cham::LetterCha => 'ꨌ',
Cham::LetterChha => 'ꨍ',
Cham::LetterJa => 'ꨎ',
Cham::LetterJha => 'ꨏ',
Cham::LetterNhue => 'ꨐ',
Cham::LetterNha => 'ꨑ',
Cham::LetterNhja => 'ꨒ',
Cham::LetterTa => 'ꨓ',
Cham::LetterTha => 'ꨔ',
Cham::LetterDa => 'ꨕ',
Cham::LetterDha => 'ꨖ',
Cham::LetterNue => 'ꨗ',
Cham::LetterNa => 'ꨘ',
Cham::LetterDda => 'ꨙ',
Cham::LetterPa => 'ꨚ',
Cham::LetterPpa => 'ꨛ',
Cham::LetterPha => 'ꨜ',
Cham::LetterBa => 'ꨝ',
Cham::LetterBha => 'ꨞ',
Cham::LetterMue => 'ꨟ',
Cham::LetterMa => 'ꨠ',
Cham::LetterBba => 'ꨡ',
Cham::LetterYa => 'ꨢ',
Cham::LetterRa => 'ꨣ',
Cham::LetterLa => 'ꨤ',
Cham::LetterVa => 'ꨥ',
Cham::LetterSsa => 'ꨦ',
Cham::LetterSa => 'ꨧ',
Cham::LetterHa => 'ꨨ',
Cham::VowelSignAa => 'ꨩ',
Cham::VowelSignI => 'ꨪ',
Cham::VowelSignIi => 'ꨫ',
Cham::VowelSignEi => 'ꨬ',
Cham::VowelSignU => 'ꨭ',
Cham::VowelSignOe => 'ꨮ',
Cham::VowelSignO => 'ꨯ',
Cham::VowelSignAi => 'ꨰ',
Cham::VowelSignAu => 'ꨱ',
Cham::VowelSignUe => 'ꨲ',
Cham::ConsonantSignYa => 'ꨳ',
Cham::ConsonantSignRa => 'ꨴ',
Cham::ConsonantSignLa => 'ꨵ',
Cham::ConsonantSignWa => 'ꨶ',
Cham::LetterFinalK => 'ꩀ',
Cham::LetterFinalG => 'ꩁ',
Cham::LetterFinalNg => 'ꩂ',
Cham::ConsonantSignFinalNg => 'ꩃ',
Cham::LetterFinalCh => 'ꩄ',
Cham::LetterFinalT => 'ꩅ',
Cham::LetterFinalN => 'ꩆ',
Cham::LetterFinalP => 'ꩇ',
Cham::LetterFinalY => 'ꩈ',
Cham::LetterFinalR => 'ꩉ',
Cham::LetterFinalL => 'ꩊ',
Cham::LetterFinalSs => 'ꩋ',
Cham::ConsonantSignFinalM => 'ꩌ',
Cham::ConsonantSignFinalH => 'ꩍ',
Cham::DigitZero => '꩐',
Cham::DigitOne => '꩑',
Cham::DigitTwo => '꩒',
Cham::DigitThree => '꩓',
Cham::DigitFour => '꩔',
Cham::DigitFive => '꩕',
Cham::DigitSix => '꩖',
Cham::DigitSeven => '꩗',
Cham::DigitEight => '꩘',
Cham::DigitNine => '꩙',
Cham::PunctuationSpiral => '꩜',
Cham::PunctuationDanda => '꩝',
Cham::PunctuationDoubleDanda => '꩞',
}
}
}
impl std::convert::TryFrom<char> for Cham {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ꨀ' => Ok(Cham::LetterA),
'ꨁ' => Ok(Cham::LetterI),
'ꨂ' => Ok(Cham::LetterU),
'ꨃ' => Ok(Cham::LetterE),
'ꨄ' => Ok(Cham::LetterAi),
'ꨅ' => Ok(Cham::LetterO),
'ꨆ' => Ok(Cham::LetterKa),
'ꨇ' => Ok(Cham::LetterKha),
'ꨈ' => Ok(Cham::LetterGa),
'ꨉ' => Ok(Cham::LetterGha),
'ꨊ' => Ok(Cham::LetterNgue),
'ꨋ' => Ok(Cham::LetterNga),
'ꨌ' => Ok(Cham::LetterCha),
'ꨍ' => Ok(Cham::LetterChha),
'ꨎ' => Ok(Cham::LetterJa),
'ꨏ' => Ok(Cham::LetterJha),
'ꨐ' => Ok(Cham::LetterNhue),
'ꨑ' => Ok(Cham::LetterNha),
'ꨒ' => Ok(Cham::LetterNhja),
'ꨓ' => Ok(Cham::LetterTa),
'ꨔ' => Ok(Cham::LetterTha),
'ꨕ' => Ok(Cham::LetterDa),
'ꨖ' => Ok(Cham::LetterDha),
'ꨗ' => Ok(Cham::LetterNue),
'ꨘ' => Ok(Cham::LetterNa),
'ꨙ' => Ok(Cham::LetterDda),
'ꨚ' => Ok(Cham::LetterPa),
'ꨛ' => Ok(Cham::LetterPpa),
'ꨜ' => Ok(Cham::LetterPha),
'ꨝ' => Ok(Cham::LetterBa),
'ꨞ' => Ok(Cham::LetterBha),
'ꨟ' => Ok(Cham::LetterMue),
'ꨠ' => Ok(Cham::LetterMa),
'ꨡ' => Ok(Cham::LetterBba),
'ꨢ' => Ok(Cham::LetterYa),
'ꨣ' => Ok(Cham::LetterRa),
'ꨤ' => Ok(Cham::LetterLa),
'ꨥ' => Ok(Cham::LetterVa),
'ꨦ' => Ok(Cham::LetterSsa),
'ꨧ' => Ok(Cham::LetterSa),
'ꨨ' => Ok(Cham::LetterHa),
'ꨩ' => Ok(Cham::VowelSignAa),
'ꨪ' => Ok(Cham::VowelSignI),
'ꨫ' => Ok(Cham::VowelSignIi),
'ꨬ' => Ok(Cham::VowelSignEi),
'ꨭ' => Ok(Cham::VowelSignU),
'ꨮ' => Ok(Cham::VowelSignOe),
'ꨯ' => Ok(Cham::VowelSignO),
'ꨰ' => Ok(Cham::VowelSignAi),
'ꨱ' => Ok(Cham::VowelSignAu),
'ꨲ' => Ok(Cham::VowelSignUe),
'ꨳ' => Ok(Cham::ConsonantSignYa),
'ꨴ' => Ok(Cham::ConsonantSignRa),
'ꨵ' => Ok(Cham::ConsonantSignLa),
'ꨶ' => Ok(Cham::ConsonantSignWa),
'ꩀ' => Ok(Cham::LetterFinalK),
'ꩁ' => Ok(Cham::LetterFinalG),
'ꩂ' => Ok(Cham::LetterFinalNg),
'ꩃ' => Ok(Cham::ConsonantSignFinalNg),
'ꩄ' => Ok(Cham::LetterFinalCh),
'ꩅ' => Ok(Cham::LetterFinalT),
'ꩆ' => Ok(Cham::LetterFinalN),
'ꩇ' => Ok(Cham::LetterFinalP),
'ꩈ' => Ok(Cham::LetterFinalY),
'ꩉ' => Ok(Cham::LetterFinalR),
'ꩊ' => Ok(Cham::LetterFinalL),
'ꩋ' => Ok(Cham::LetterFinalSs),
'ꩌ' => Ok(Cham::ConsonantSignFinalM),
'ꩍ' => Ok(Cham::ConsonantSignFinalH),
'꩐' => Ok(Cham::DigitZero),
'꩑' => Ok(Cham::DigitOne),
'꩒' => Ok(Cham::DigitTwo),
'꩓' => Ok(Cham::DigitThree),
'꩔' => Ok(Cham::DigitFour),
'꩕' => Ok(Cham::DigitFive),
'꩖' => Ok(Cham::DigitSix),
'꩗' => Ok(Cham::DigitSeven),
'꩘' => Ok(Cham::DigitEight),
'꩙' => Ok(Cham::DigitNine),
'꩜' => Ok(Cham::PunctuationSpiral),
'꩝' => Ok(Cham::PunctuationDanda),
'꩞' => Ok(Cham::PunctuationDoubleDanda),
_ => Err(()),
}
}
}
impl Into<u32> for Cham {
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 Cham {
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 Cham {
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 Cham {
pub fn new() -> Self {
Cham::LetterA
}
pub fn name(&self) -> String {
let s = std::format!("Cham{:#?}", self);
string_morph::to_sentence_case(&s)
}
}