#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Khmer {
LetterKa,
LetterKha,
LetterKo,
LetterKho,
LetterNgo,
LetterCa,
LetterCha,
LetterCo,
LetterCho,
LetterNyo,
LetterDa,
LetterTtha,
LetterDo,
LetterTtho,
LetterNno,
LetterTa,
LetterTha,
LetterTo,
LetterTho,
LetterNo,
LetterBa,
LetterPha,
LetterPo,
LetterPho,
LetterMo,
LetterYo,
LetterRo,
LetterLo,
LetterVo,
LetterSha,
LetterSso,
LetterSa,
LetterHa,
LetterLa,
LetterQa,
IndependentVowelQaq,
IndependentVowelQaa,
IndependentVowelQi,
IndependentVowelQii,
IndependentVowelQu,
IndependentVowelQuk,
IndependentVowelQuu,
IndependentVowelQuuv,
IndependentVowelRy,
IndependentVowelRyy,
IndependentVowelLy,
IndependentVowelLyy,
IndependentVowelQe,
IndependentVowelQai,
IndependentVowelQooTypeOne,
IndependentVowelQooTypeTwo,
IndependentVowelQau,
VowelInherentAq,
VowelInherentAa,
VowelSignAa,
VowelSignI,
VowelSignIi,
VowelSignY,
VowelSignYy,
VowelSignU,
VowelSignUu,
VowelSignUa,
VowelSignOe,
VowelSignYa,
VowelSignIe,
VowelSignE,
VowelSignAe,
VowelSignAi,
VowelSignOo,
VowelSignAu,
SignNikahit,
SignReahmuk,
SignYuukaleapintu,
SignMuusikatoan,
SignTriisap,
SignBantoc,
SignRobat,
SignToandakhiat,
SignKakabat,
SignAhsda,
SignSamyokSannya,
SignViriam,
SignCoeng,
SignBathamasat,
SignKhan,
SignBariyoosan,
SignCamnucPiiKuuh,
SignLekToo,
SignBeyyal,
SignPhnaekMuan,
SignKoomuut,
CurrencySymbolRiel,
SignAvakrahasanya,
SignAtthacan,
DigitZero,
DigitOne,
DigitTwo,
DigitThree,
DigitFour,
DigitFive,
DigitSix,
DigitSeven,
DigitEight,
DigitNine,
SymbolLekAttakSon,
SymbolLekAttakMuoy,
SymbolLekAttakPii,
SymbolLekAttakBei,
SymbolLekAttakBuon,
SymbolLekAttakPram,
SymbolLekAttakPramDashMuoy,
SymbolLekAttakPramDashPii,
SymbolLekAttakPramDashBei,
SymbolLekAttakPramDashBuon,
}
impl Into<char> for Khmer {
fn into(self) -> char {
match self {
Khmer::LetterKa => 'ក',
Khmer::LetterKha => 'ខ',
Khmer::LetterKo => 'គ',
Khmer::LetterKho => 'ឃ',
Khmer::LetterNgo => 'ង',
Khmer::LetterCa => 'ច',
Khmer::LetterCha => 'ឆ',
Khmer::LetterCo => 'ជ',
Khmer::LetterCho => 'ឈ',
Khmer::LetterNyo => 'ញ',
Khmer::LetterDa => 'ដ',
Khmer::LetterTtha => 'ឋ',
Khmer::LetterDo => 'ឌ',
Khmer::LetterTtho => 'ឍ',
Khmer::LetterNno => 'ណ',
Khmer::LetterTa => 'ត',
Khmer::LetterTha => 'ថ',
Khmer::LetterTo => 'ទ',
Khmer::LetterTho => 'ធ',
Khmer::LetterNo => 'ន',
Khmer::LetterBa => 'ប',
Khmer::LetterPha => 'ផ',
Khmer::LetterPo => 'ព',
Khmer::LetterPho => 'ភ',
Khmer::LetterMo => 'ម',
Khmer::LetterYo => 'យ',
Khmer::LetterRo => 'រ',
Khmer::LetterLo => 'ល',
Khmer::LetterVo => 'វ',
Khmer::LetterSha => 'ឝ',
Khmer::LetterSso => 'ឞ',
Khmer::LetterSa => 'ស',
Khmer::LetterHa => 'ហ',
Khmer::LetterLa => 'ឡ',
Khmer::LetterQa => 'អ',
Khmer::IndependentVowelQaq => 'ឣ',
Khmer::IndependentVowelQaa => 'ឤ',
Khmer::IndependentVowelQi => 'ឥ',
Khmer::IndependentVowelQii => 'ឦ',
Khmer::IndependentVowelQu => 'ឧ',
Khmer::IndependentVowelQuk => 'ឨ',
Khmer::IndependentVowelQuu => 'ឩ',
Khmer::IndependentVowelQuuv => 'ឪ',
Khmer::IndependentVowelRy => 'ឫ',
Khmer::IndependentVowelRyy => 'ឬ',
Khmer::IndependentVowelLy => 'ឭ',
Khmer::IndependentVowelLyy => 'ឮ',
Khmer::IndependentVowelQe => 'ឯ',
Khmer::IndependentVowelQai => 'ឰ',
Khmer::IndependentVowelQooTypeOne => 'ឱ',
Khmer::IndependentVowelQooTypeTwo => 'ឲ',
Khmer::IndependentVowelQau => 'ឳ',
Khmer::VowelInherentAq => '឴',
Khmer::VowelInherentAa => '឵',
Khmer::VowelSignAa => 'ា',
Khmer::VowelSignI => 'ិ',
Khmer::VowelSignIi => 'ី',
Khmer::VowelSignY => 'ឹ',
Khmer::VowelSignYy => 'ឺ',
Khmer::VowelSignU => 'ុ',
Khmer::VowelSignUu => 'ូ',
Khmer::VowelSignUa => 'ួ',
Khmer::VowelSignOe => 'ើ',
Khmer::VowelSignYa => 'ឿ',
Khmer::VowelSignIe => 'ៀ',
Khmer::VowelSignE => 'េ',
Khmer::VowelSignAe => 'ែ',
Khmer::VowelSignAi => 'ៃ',
Khmer::VowelSignOo => 'ោ',
Khmer::VowelSignAu => 'ៅ',
Khmer::SignNikahit => 'ំ',
Khmer::SignReahmuk => 'ះ',
Khmer::SignYuukaleapintu => 'ៈ',
Khmer::SignMuusikatoan => '៉',
Khmer::SignTriisap => '៊',
Khmer::SignBantoc => '់',
Khmer::SignRobat => '៌',
Khmer::SignToandakhiat => '៍',
Khmer::SignKakabat => '៎',
Khmer::SignAhsda => '៏',
Khmer::SignSamyokSannya => '័',
Khmer::SignViriam => '៑',
Khmer::SignCoeng => '្',
Khmer::SignBathamasat => '៓',
Khmer::SignKhan => '។',
Khmer::SignBariyoosan => '៕',
Khmer::SignCamnucPiiKuuh => '៖',
Khmer::SignLekToo => 'ៗ',
Khmer::SignBeyyal => '៘',
Khmer::SignPhnaekMuan => '៙',
Khmer::SignKoomuut => '៚',
Khmer::CurrencySymbolRiel => '៛',
Khmer::SignAvakrahasanya => 'ៜ',
Khmer::SignAtthacan => '៝',
Khmer::DigitZero => '០',
Khmer::DigitOne => '១',
Khmer::DigitTwo => '២',
Khmer::DigitThree => '៣',
Khmer::DigitFour => '៤',
Khmer::DigitFive => '៥',
Khmer::DigitSix => '៦',
Khmer::DigitSeven => '៧',
Khmer::DigitEight => '៨',
Khmer::DigitNine => '៩',
Khmer::SymbolLekAttakSon => '៰',
Khmer::SymbolLekAttakMuoy => '៱',
Khmer::SymbolLekAttakPii => '៲',
Khmer::SymbolLekAttakBei => '៳',
Khmer::SymbolLekAttakBuon => '៴',
Khmer::SymbolLekAttakPram => '៵',
Khmer::SymbolLekAttakPramDashMuoy => '៶',
Khmer::SymbolLekAttakPramDashPii => '៷',
Khmer::SymbolLekAttakPramDashBei => '៸',
Khmer::SymbolLekAttakPramDashBuon => '៹',
}
}
}
impl std::convert::TryFrom<char> for Khmer {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ក' => Ok(Khmer::LetterKa),
'ខ' => Ok(Khmer::LetterKha),
'គ' => Ok(Khmer::LetterKo),
'ឃ' => Ok(Khmer::LetterKho),
'ង' => Ok(Khmer::LetterNgo),
'ច' => Ok(Khmer::LetterCa),
'ឆ' => Ok(Khmer::LetterCha),
'ជ' => Ok(Khmer::LetterCo),
'ឈ' => Ok(Khmer::LetterCho),
'ញ' => Ok(Khmer::LetterNyo),
'ដ' => Ok(Khmer::LetterDa),
'ឋ' => Ok(Khmer::LetterTtha),
'ឌ' => Ok(Khmer::LetterDo),
'ឍ' => Ok(Khmer::LetterTtho),
'ណ' => Ok(Khmer::LetterNno),
'ត' => Ok(Khmer::LetterTa),
'ថ' => Ok(Khmer::LetterTha),
'ទ' => Ok(Khmer::LetterTo),
'ធ' => Ok(Khmer::LetterTho),
'ន' => Ok(Khmer::LetterNo),
'ប' => Ok(Khmer::LetterBa),
'ផ' => Ok(Khmer::LetterPha),
'ព' => Ok(Khmer::LetterPo),
'ភ' => Ok(Khmer::LetterPho),
'ម' => Ok(Khmer::LetterMo),
'យ' => Ok(Khmer::LetterYo),
'រ' => Ok(Khmer::LetterRo),
'ល' => Ok(Khmer::LetterLo),
'វ' => Ok(Khmer::LetterVo),
'ឝ' => Ok(Khmer::LetterSha),
'ឞ' => Ok(Khmer::LetterSso),
'ស' => Ok(Khmer::LetterSa),
'ហ' => Ok(Khmer::LetterHa),
'ឡ' => Ok(Khmer::LetterLa),
'អ' => Ok(Khmer::LetterQa),
'ឣ' => Ok(Khmer::IndependentVowelQaq),
'ឤ' => Ok(Khmer::IndependentVowelQaa),
'ឥ' => Ok(Khmer::IndependentVowelQi),
'ឦ' => Ok(Khmer::IndependentVowelQii),
'ឧ' => Ok(Khmer::IndependentVowelQu),
'ឨ' => Ok(Khmer::IndependentVowelQuk),
'ឩ' => Ok(Khmer::IndependentVowelQuu),
'ឪ' => Ok(Khmer::IndependentVowelQuuv),
'ឫ' => Ok(Khmer::IndependentVowelRy),
'ឬ' => Ok(Khmer::IndependentVowelRyy),
'ឭ' => Ok(Khmer::IndependentVowelLy),
'ឮ' => Ok(Khmer::IndependentVowelLyy),
'ឯ' => Ok(Khmer::IndependentVowelQe),
'ឰ' => Ok(Khmer::IndependentVowelQai),
'ឱ' => Ok(Khmer::IndependentVowelQooTypeOne),
'ឲ' => Ok(Khmer::IndependentVowelQooTypeTwo),
'ឳ' => Ok(Khmer::IndependentVowelQau),
'឴' => Ok(Khmer::VowelInherentAq),
'឵' => Ok(Khmer::VowelInherentAa),
'ា' => Ok(Khmer::VowelSignAa),
'ិ' => Ok(Khmer::VowelSignI),
'ី' => Ok(Khmer::VowelSignIi),
'ឹ' => Ok(Khmer::VowelSignY),
'ឺ' => Ok(Khmer::VowelSignYy),
'ុ' => Ok(Khmer::VowelSignU),
'ូ' => Ok(Khmer::VowelSignUu),
'ួ' => Ok(Khmer::VowelSignUa),
'ើ' => Ok(Khmer::VowelSignOe),
'ឿ' => Ok(Khmer::VowelSignYa),
'ៀ' => Ok(Khmer::VowelSignIe),
'េ' => Ok(Khmer::VowelSignE),
'ែ' => Ok(Khmer::VowelSignAe),
'ៃ' => Ok(Khmer::VowelSignAi),
'ោ' => Ok(Khmer::VowelSignOo),
'ៅ' => Ok(Khmer::VowelSignAu),
'ំ' => Ok(Khmer::SignNikahit),
'ះ' => Ok(Khmer::SignReahmuk),
'ៈ' => Ok(Khmer::SignYuukaleapintu),
'៉' => Ok(Khmer::SignMuusikatoan),
'៊' => Ok(Khmer::SignTriisap),
'់' => Ok(Khmer::SignBantoc),
'៌' => Ok(Khmer::SignRobat),
'៍' => Ok(Khmer::SignToandakhiat),
'៎' => Ok(Khmer::SignKakabat),
'៏' => Ok(Khmer::SignAhsda),
'័' => Ok(Khmer::SignSamyokSannya),
'៑' => Ok(Khmer::SignViriam),
'្' => Ok(Khmer::SignCoeng),
'៓' => Ok(Khmer::SignBathamasat),
'។' => Ok(Khmer::SignKhan),
'៕' => Ok(Khmer::SignBariyoosan),
'៖' => Ok(Khmer::SignCamnucPiiKuuh),
'ៗ' => Ok(Khmer::SignLekToo),
'៘' => Ok(Khmer::SignBeyyal),
'៙' => Ok(Khmer::SignPhnaekMuan),
'៚' => Ok(Khmer::SignKoomuut),
'៛' => Ok(Khmer::CurrencySymbolRiel),
'ៜ' => Ok(Khmer::SignAvakrahasanya),
'៝' => Ok(Khmer::SignAtthacan),
'០' => Ok(Khmer::DigitZero),
'១' => Ok(Khmer::DigitOne),
'២' => Ok(Khmer::DigitTwo),
'៣' => Ok(Khmer::DigitThree),
'៤' => Ok(Khmer::DigitFour),
'៥' => Ok(Khmer::DigitFive),
'៦' => Ok(Khmer::DigitSix),
'៧' => Ok(Khmer::DigitSeven),
'៨' => Ok(Khmer::DigitEight),
'៩' => Ok(Khmer::DigitNine),
'៰' => Ok(Khmer::SymbolLekAttakSon),
'៱' => Ok(Khmer::SymbolLekAttakMuoy),
'៲' => Ok(Khmer::SymbolLekAttakPii),
'៳' => Ok(Khmer::SymbolLekAttakBei),
'៴' => Ok(Khmer::SymbolLekAttakBuon),
'៵' => Ok(Khmer::SymbolLekAttakPram),
'៶' => Ok(Khmer::SymbolLekAttakPramDashMuoy),
'៷' => Ok(Khmer::SymbolLekAttakPramDashPii),
'៸' => Ok(Khmer::SymbolLekAttakPramDashBei),
'៹' => Ok(Khmer::SymbolLekAttakPramDashBuon),
_ => Err(()),
}
}
}
impl Into<u32> for Khmer {
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 Khmer {
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 Khmer {
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 Khmer {
pub fn new() -> Self {
Khmer::LetterKa
}
pub fn name(&self) -> String {
let s = std::format!("Khmer{:#?}", self);
string_morph::to_sentence_case(&s)
}
}