mod constants {
pub const LETTER_KA: char = 'ᥐ';
pub const LETTER_XA: char = 'ᥑ';
pub const LETTER_NGA: char = 'ᥒ';
pub const LETTER_TSA: char = 'ᥓ';
pub const LETTER_SA: char = 'ᥔ';
pub const LETTER_YA: char = 'ᥕ';
pub const LETTER_TA: char = 'ᥖ';
pub const LETTER_THA: char = 'ᥗ';
pub const LETTER_LA: char = 'ᥘ';
pub const LETTER_PA: char = 'ᥙ';
pub const LETTER_PHA: char = 'ᥚ';
pub const LETTER_MA: char = 'ᥛ';
pub const LETTER_FA: char = 'ᥜ';
pub const LETTER_VA: char = 'ᥝ';
pub const LETTER_HA: char = 'ᥞ';
pub const LETTER_QA: char = 'ᥟ';
pub const LETTER_KHA: char = 'ᥠ';
pub const LETTER_TSHA: char = 'ᥡ';
pub const LETTER_NA: char = 'ᥢ';
pub const LETTER_A: char = 'ᥣ';
pub const LETTER_I: char = 'ᥤ';
pub const LETTER_EE: char = 'ᥥ';
pub const LETTER_EH: char = 'ᥦ';
pub const LETTER_U: char = 'ᥧ';
pub const LETTER_OO: char = 'ᥨ';
pub const LETTER_O: char = 'ᥩ';
pub const LETTER_UE: char = 'ᥪ';
pub const LETTER_E: char = 'ᥫ';
pub const LETTER_AUE: char = 'ᥬ';
pub const LETTER_AI: char = 'ᥭ';
pub const LETTER_TONE_DASH_2: char = 'ᥰ';
pub const LETTER_TONE_DASH_3: char = 'ᥱ';
pub const LETTER_TONE_DASH_4: char = 'ᥲ';
pub const LETTER_TONE_DASH_5: char = 'ᥳ';
pub const LETTER_TONE_DASH_6: char = 'ᥴ';
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum TaiLe {
LetterKa,
LetterXa,
LetterNga,
LetterTsa,
LetterSa,
LetterYa,
LetterTa,
LetterTha,
LetterLa,
LetterPa,
LetterPha,
LetterMa,
LetterFa,
LetterVa,
LetterHa,
LetterQa,
LetterKha,
LetterTsha,
LetterNa,
LetterA,
LetterI,
LetterEe,
LetterEh,
LetterU,
LetterOo,
LetterO,
LetterUe,
LetterE,
LetterAue,
LetterAi,
LetterToneDash2,
LetterToneDash3,
LetterToneDash4,
LetterToneDash5,
LetterToneDash6,
}
impl Into<char> for TaiLe {
fn into(self) -> char {
use constants::*;
match self {
TaiLe::LetterKa => LETTER_KA,
TaiLe::LetterXa => LETTER_XA,
TaiLe::LetterNga => LETTER_NGA,
TaiLe::LetterTsa => LETTER_TSA,
TaiLe::LetterSa => LETTER_SA,
TaiLe::LetterYa => LETTER_YA,
TaiLe::LetterTa => LETTER_TA,
TaiLe::LetterTha => LETTER_THA,
TaiLe::LetterLa => LETTER_LA,
TaiLe::LetterPa => LETTER_PA,
TaiLe::LetterPha => LETTER_PHA,
TaiLe::LetterMa => LETTER_MA,
TaiLe::LetterFa => LETTER_FA,
TaiLe::LetterVa => LETTER_VA,
TaiLe::LetterHa => LETTER_HA,
TaiLe::LetterQa => LETTER_QA,
TaiLe::LetterKha => LETTER_KHA,
TaiLe::LetterTsha => LETTER_TSHA,
TaiLe::LetterNa => LETTER_NA,
TaiLe::LetterA => LETTER_A,
TaiLe::LetterI => LETTER_I,
TaiLe::LetterEe => LETTER_EE,
TaiLe::LetterEh => LETTER_EH,
TaiLe::LetterU => LETTER_U,
TaiLe::LetterOo => LETTER_OO,
TaiLe::LetterO => LETTER_O,
TaiLe::LetterUe => LETTER_UE,
TaiLe::LetterE => LETTER_E,
TaiLe::LetterAue => LETTER_AUE,
TaiLe::LetterAi => LETTER_AI,
TaiLe::LetterToneDash2 => LETTER_TONE_DASH_2,
TaiLe::LetterToneDash3 => LETTER_TONE_DASH_3,
TaiLe::LetterToneDash4 => LETTER_TONE_DASH_4,
TaiLe::LetterToneDash5 => LETTER_TONE_DASH_5,
TaiLe::LetterToneDash6 => LETTER_TONE_DASH_6,
}
}
}
impl std::convert::TryFrom<char> for TaiLe {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
LETTER_KA => Ok(TaiLe::LetterKa),
LETTER_XA => Ok(TaiLe::LetterXa),
LETTER_NGA => Ok(TaiLe::LetterNga),
LETTER_TSA => Ok(TaiLe::LetterTsa),
LETTER_SA => Ok(TaiLe::LetterSa),
LETTER_YA => Ok(TaiLe::LetterYa),
LETTER_TA => Ok(TaiLe::LetterTa),
LETTER_THA => Ok(TaiLe::LetterTha),
LETTER_LA => Ok(TaiLe::LetterLa),
LETTER_PA => Ok(TaiLe::LetterPa),
LETTER_PHA => Ok(TaiLe::LetterPha),
LETTER_MA => Ok(TaiLe::LetterMa),
LETTER_FA => Ok(TaiLe::LetterFa),
LETTER_VA => Ok(TaiLe::LetterVa),
LETTER_HA => Ok(TaiLe::LetterHa),
LETTER_QA => Ok(TaiLe::LetterQa),
LETTER_KHA => Ok(TaiLe::LetterKha),
LETTER_TSHA => Ok(TaiLe::LetterTsha),
LETTER_NA => Ok(TaiLe::LetterNa),
LETTER_A => Ok(TaiLe::LetterA),
LETTER_I => Ok(TaiLe::LetterI),
LETTER_EE => Ok(TaiLe::LetterEe),
LETTER_EH => Ok(TaiLe::LetterEh),
LETTER_U => Ok(TaiLe::LetterU),
LETTER_OO => Ok(TaiLe::LetterOo),
LETTER_O => Ok(TaiLe::LetterO),
LETTER_UE => Ok(TaiLe::LetterUe),
LETTER_E => Ok(TaiLe::LetterE),
LETTER_AUE => Ok(TaiLe::LetterAue),
LETTER_AI => Ok(TaiLe::LetterAi),
LETTER_TONE_DASH_2 => Ok(TaiLe::LetterToneDash2),
LETTER_TONE_DASH_3 => Ok(TaiLe::LetterToneDash3),
LETTER_TONE_DASH_4 => Ok(TaiLe::LetterToneDash4),
LETTER_TONE_DASH_5 => Ok(TaiLe::LetterToneDash5),
LETTER_TONE_DASH_6 => Ok(TaiLe::LetterToneDash6),
_ => Err(()),
}
}
}
impl Into<u32> for TaiLe {
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 TaiLe {
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 TaiLe {
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 TaiLe {
pub fn new() -> Self {
TaiLe::LetterKa
}
pub fn name(&self) -> &str {
match self {
TaiLe::LetterKa => "tai le letter ka",
TaiLe::LetterXa => "tai le letter xa",
TaiLe::LetterNga => "tai le letter nga",
TaiLe::LetterTsa => "tai le letter tsa",
TaiLe::LetterSa => "tai le letter sa",
TaiLe::LetterYa => "tai le letter ya",
TaiLe::LetterTa => "tai le letter ta",
TaiLe::LetterTha => "tai le letter tha",
TaiLe::LetterLa => "tai le letter la",
TaiLe::LetterPa => "tai le letter pa",
TaiLe::LetterPha => "tai le letter pha",
TaiLe::LetterMa => "tai le letter ma",
TaiLe::LetterFa => "tai le letter fa",
TaiLe::LetterVa => "tai le letter va",
TaiLe::LetterHa => "tai le letter ha",
TaiLe::LetterQa => "tai le letter qa",
TaiLe::LetterKha => "tai le letter kha",
TaiLe::LetterTsha => "tai le letter tsha",
TaiLe::LetterNa => "tai le letter na",
TaiLe::LetterA => "tai le letter a",
TaiLe::LetterI => "tai le letter i",
TaiLe::LetterEe => "tai le letter ee",
TaiLe::LetterEh => "tai le letter eh",
TaiLe::LetterU => "tai le letter u",
TaiLe::LetterOo => "tai le letter oo",
TaiLe::LetterO => "tai le letter o",
TaiLe::LetterUe => "tai le letter ue",
TaiLe::LetterE => "tai le letter e",
TaiLe::LetterAue => "tai le letter aue",
TaiLe::LetterAi => "tai le letter ai",
TaiLe::LetterToneDash2 => "tai le letter tone-2",
TaiLe::LetterToneDash3 => "tai le letter tone-3",
TaiLe::LetterToneDash4 => "tai le letter tone-4",
TaiLe::LetterToneDash5 => "tai le letter tone-5",
TaiLe::LetterToneDash6 => "tai le letter tone-6",
}
}
}