mod constants {
pub const LETTER_LOW_KO: char = 'ꪀ';
pub const LETTER_HIGH_KO: char = 'ꪁ';
pub const LETTER_LOW_KHO: char = 'ꪂ';
pub const LETTER_HIGH_KHO: char = 'ꪃ';
pub const LETTER_LOW_KHHO: char = 'ꪄ';
pub const LETTER_HIGH_KHHO: char = 'ꪅ';
pub const LETTER_LOW_GO: char = 'ꪆ';
pub const LETTER_HIGH_GO: char = 'ꪇ';
pub const LETTER_LOW_NGO: char = 'ꪈ';
pub const LETTER_HIGH_NGO: char = 'ꪉ';
pub const LETTER_LOW_CO: char = 'ꪊ';
pub const LETTER_HIGH_CO: char = 'ꪋ';
pub const LETTER_LOW_CHO: char = 'ꪌ';
pub const LETTER_HIGH_CHO: char = 'ꪍ';
pub const LETTER_LOW_SO: char = 'ꪎ';
pub const LETTER_HIGH_SO: char = 'ꪏ';
pub const LETTER_LOW_NYO: char = 'ꪐ';
pub const LETTER_HIGH_NYO: char = 'ꪑ';
pub const LETTER_LOW_DO: char = 'ꪒ';
pub const LETTER_HIGH_DO: char = 'ꪓ';
pub const LETTER_LOW_TO: char = 'ꪔ';
pub const LETTER_HIGH_TO: char = 'ꪕ';
pub const LETTER_LOW_THO: char = 'ꪖ';
pub const LETTER_HIGH_THO: char = 'ꪗ';
pub const LETTER_LOW_NO: char = 'ꪘ';
pub const LETTER_HIGH_NO: char = 'ꪙ';
pub const LETTER_LOW_BO: char = 'ꪚ';
pub const LETTER_HIGH_BO: char = 'ꪛ';
pub const LETTER_LOW_PO: char = 'ꪜ';
pub const LETTER_HIGH_PO: char = 'ꪝ';
pub const LETTER_LOW_PHO: char = 'ꪞ';
pub const LETTER_HIGH_PHO: char = 'ꪟ';
pub const LETTER_LOW_FO: char = 'ꪠ';
pub const LETTER_HIGH_FO: char = 'ꪡ';
pub const LETTER_LOW_MO: char = 'ꪢ';
pub const LETTER_HIGH_MO: char = 'ꪣ';
pub const LETTER_LOW_YO: char = 'ꪤ';
pub const LETTER_HIGH_YO: char = 'ꪥ';
pub const LETTER_LOW_RO: char = 'ꪦ';
pub const LETTER_HIGH_RO: char = 'ꪧ';
pub const LETTER_LOW_LO: char = 'ꪨ';
pub const LETTER_HIGH_LO: char = 'ꪩ';
pub const LETTER_LOW_VO: char = 'ꪪ';
pub const LETTER_HIGH_VO: char = 'ꪫ';
pub const LETTER_LOW_HO: char = 'ꪬ';
pub const LETTER_HIGH_HO: char = 'ꪭ';
pub const LETTER_LOW_O: char = 'ꪮ';
pub const LETTER_HIGH_O: char = 'ꪯ';
pub const MAI_KANG: char = 'ꪰ';
pub const VOWEL_AA: char = 'ꪱ';
pub const VOWEL_I: char = 'ꪲ';
pub const VOWEL_UE: char = 'ꪳ';
pub const VOWEL_U: char = 'ꪴ';
pub const VOWEL_E: char = 'ꪵ';
pub const VOWEL_O: char = 'ꪶ';
pub const MAI_KHIT: char = 'ꪷ';
pub const VOWEL_IA: char = 'ꪸ';
pub const VOWEL_UEA: char = 'ꪹ';
pub const VOWEL_UA: char = 'ꪺ';
pub const VOWEL_AUE: char = 'ꪻ';
pub const VOWEL_AY: char = 'ꪼ';
pub const VOWEL_AN: char = 'ꪽ';
pub const VOWEL_AM: char = 'ꪾ';
pub const TONE_MAI_EK: char = '꪿';
pub const TONE_MAI_NUENG: char = 'ꫀ';
pub const TONE_MAI_THO: char = '꫁';
pub const TONE_MAI_SONG: char = 'ꫂ';
pub const SYMBOL_KON: char = 'ꫛ';
pub const SYMBOL_NUENG: char = 'ꫜ';
pub const SYMBOL_SAM: char = 'ꫝ';
pub const SYMBOL_HO_HOI: char = '꫞';
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum TaiViet {
LetterLowKo,
LetterHighKo,
LetterLowKho,
LetterHighKho,
LetterLowKhho,
LetterHighKhho,
LetterLowGo,
LetterHighGo,
LetterLowNgo,
LetterHighNgo,
LetterLowCo,
LetterHighCo,
LetterLowCho,
LetterHighCho,
LetterLowSo,
LetterHighSo,
LetterLowNyo,
LetterHighNyo,
LetterLowDo,
LetterHighDo,
LetterLowTo,
LetterHighTo,
LetterLowTho,
LetterHighTho,
LetterLowNo,
LetterHighNo,
LetterLowBo,
LetterHighBo,
LetterLowPo,
LetterHighPo,
LetterLowPho,
LetterHighPho,
LetterLowFo,
LetterHighFo,
LetterLowMo,
LetterHighMo,
LetterLowYo,
LetterHighYo,
LetterLowRo,
LetterHighRo,
LetterLowLo,
LetterHighLo,
LetterLowVo,
LetterHighVo,
LetterLowHo,
LetterHighHo,
LetterLowO,
LetterHighO,
MaiKang,
VowelAa,
VowelI,
VowelUe,
VowelU,
VowelE,
VowelO,
MaiKhit,
VowelIa,
VowelUea,
VowelUa,
VowelAue,
VowelAy,
VowelAn,
VowelAm,
ToneMaiEk,
ToneMaiNueng,
ToneMaiTho,
ToneMaiSong,
SymbolKon,
SymbolNueng,
SymbolSam,
SymbolHoHoi,
}
impl Into<char> for TaiViet {
fn into(self) -> char {
use constants::*;
match self {
TaiViet::LetterLowKo => LETTER_LOW_KO,
TaiViet::LetterHighKo => LETTER_HIGH_KO,
TaiViet::LetterLowKho => LETTER_LOW_KHO,
TaiViet::LetterHighKho => LETTER_HIGH_KHO,
TaiViet::LetterLowKhho => LETTER_LOW_KHHO,
TaiViet::LetterHighKhho => LETTER_HIGH_KHHO,
TaiViet::LetterLowGo => LETTER_LOW_GO,
TaiViet::LetterHighGo => LETTER_HIGH_GO,
TaiViet::LetterLowNgo => LETTER_LOW_NGO,
TaiViet::LetterHighNgo => LETTER_HIGH_NGO,
TaiViet::LetterLowCo => LETTER_LOW_CO,
TaiViet::LetterHighCo => LETTER_HIGH_CO,
TaiViet::LetterLowCho => LETTER_LOW_CHO,
TaiViet::LetterHighCho => LETTER_HIGH_CHO,
TaiViet::LetterLowSo => LETTER_LOW_SO,
TaiViet::LetterHighSo => LETTER_HIGH_SO,
TaiViet::LetterLowNyo => LETTER_LOW_NYO,
TaiViet::LetterHighNyo => LETTER_HIGH_NYO,
TaiViet::LetterLowDo => LETTER_LOW_DO,
TaiViet::LetterHighDo => LETTER_HIGH_DO,
TaiViet::LetterLowTo => LETTER_LOW_TO,
TaiViet::LetterHighTo => LETTER_HIGH_TO,
TaiViet::LetterLowTho => LETTER_LOW_THO,
TaiViet::LetterHighTho => LETTER_HIGH_THO,
TaiViet::LetterLowNo => LETTER_LOW_NO,
TaiViet::LetterHighNo => LETTER_HIGH_NO,
TaiViet::LetterLowBo => LETTER_LOW_BO,
TaiViet::LetterHighBo => LETTER_HIGH_BO,
TaiViet::LetterLowPo => LETTER_LOW_PO,
TaiViet::LetterHighPo => LETTER_HIGH_PO,
TaiViet::LetterLowPho => LETTER_LOW_PHO,
TaiViet::LetterHighPho => LETTER_HIGH_PHO,
TaiViet::LetterLowFo => LETTER_LOW_FO,
TaiViet::LetterHighFo => LETTER_HIGH_FO,
TaiViet::LetterLowMo => LETTER_LOW_MO,
TaiViet::LetterHighMo => LETTER_HIGH_MO,
TaiViet::LetterLowYo => LETTER_LOW_YO,
TaiViet::LetterHighYo => LETTER_HIGH_YO,
TaiViet::LetterLowRo => LETTER_LOW_RO,
TaiViet::LetterHighRo => LETTER_HIGH_RO,
TaiViet::LetterLowLo => LETTER_LOW_LO,
TaiViet::LetterHighLo => LETTER_HIGH_LO,
TaiViet::LetterLowVo => LETTER_LOW_VO,
TaiViet::LetterHighVo => LETTER_HIGH_VO,
TaiViet::LetterLowHo => LETTER_LOW_HO,
TaiViet::LetterHighHo => LETTER_HIGH_HO,
TaiViet::LetterLowO => LETTER_LOW_O,
TaiViet::LetterHighO => LETTER_HIGH_O,
TaiViet::MaiKang => MAI_KANG,
TaiViet::VowelAa => VOWEL_AA,
TaiViet::VowelI => VOWEL_I,
TaiViet::VowelUe => VOWEL_UE,
TaiViet::VowelU => VOWEL_U,
TaiViet::VowelE => VOWEL_E,
TaiViet::VowelO => VOWEL_O,
TaiViet::MaiKhit => MAI_KHIT,
TaiViet::VowelIa => VOWEL_IA,
TaiViet::VowelUea => VOWEL_UEA,
TaiViet::VowelUa => VOWEL_UA,
TaiViet::VowelAue => VOWEL_AUE,
TaiViet::VowelAy => VOWEL_AY,
TaiViet::VowelAn => VOWEL_AN,
TaiViet::VowelAm => VOWEL_AM,
TaiViet::ToneMaiEk => TONE_MAI_EK,
TaiViet::ToneMaiNueng => TONE_MAI_NUENG,
TaiViet::ToneMaiTho => TONE_MAI_THO,
TaiViet::ToneMaiSong => TONE_MAI_SONG,
TaiViet::SymbolKon => SYMBOL_KON,
TaiViet::SymbolNueng => SYMBOL_NUENG,
TaiViet::SymbolSam => SYMBOL_SAM,
TaiViet::SymbolHoHoi => SYMBOL_HO_HOI,
}
}
}
impl std::convert::TryFrom<char> for TaiViet {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
LETTER_LOW_KO => Ok(TaiViet::LetterLowKo),
LETTER_HIGH_KO => Ok(TaiViet::LetterHighKo),
LETTER_LOW_KHO => Ok(TaiViet::LetterLowKho),
LETTER_HIGH_KHO => Ok(TaiViet::LetterHighKho),
LETTER_LOW_KHHO => Ok(TaiViet::LetterLowKhho),
LETTER_HIGH_KHHO => Ok(TaiViet::LetterHighKhho),
LETTER_LOW_GO => Ok(TaiViet::LetterLowGo),
LETTER_HIGH_GO => Ok(TaiViet::LetterHighGo),
LETTER_LOW_NGO => Ok(TaiViet::LetterLowNgo),
LETTER_HIGH_NGO => Ok(TaiViet::LetterHighNgo),
LETTER_LOW_CO => Ok(TaiViet::LetterLowCo),
LETTER_HIGH_CO => Ok(TaiViet::LetterHighCo),
LETTER_LOW_CHO => Ok(TaiViet::LetterLowCho),
LETTER_HIGH_CHO => Ok(TaiViet::LetterHighCho),
LETTER_LOW_SO => Ok(TaiViet::LetterLowSo),
LETTER_HIGH_SO => Ok(TaiViet::LetterHighSo),
LETTER_LOW_NYO => Ok(TaiViet::LetterLowNyo),
LETTER_HIGH_NYO => Ok(TaiViet::LetterHighNyo),
LETTER_LOW_DO => Ok(TaiViet::LetterLowDo),
LETTER_HIGH_DO => Ok(TaiViet::LetterHighDo),
LETTER_LOW_TO => Ok(TaiViet::LetterLowTo),
LETTER_HIGH_TO => Ok(TaiViet::LetterHighTo),
LETTER_LOW_THO => Ok(TaiViet::LetterLowTho),
LETTER_HIGH_THO => Ok(TaiViet::LetterHighTho),
LETTER_LOW_NO => Ok(TaiViet::LetterLowNo),
LETTER_HIGH_NO => Ok(TaiViet::LetterHighNo),
LETTER_LOW_BO => Ok(TaiViet::LetterLowBo),
LETTER_HIGH_BO => Ok(TaiViet::LetterHighBo),
LETTER_LOW_PO => Ok(TaiViet::LetterLowPo),
LETTER_HIGH_PO => Ok(TaiViet::LetterHighPo),
LETTER_LOW_PHO => Ok(TaiViet::LetterLowPho),
LETTER_HIGH_PHO => Ok(TaiViet::LetterHighPho),
LETTER_LOW_FO => Ok(TaiViet::LetterLowFo),
LETTER_HIGH_FO => Ok(TaiViet::LetterHighFo),
LETTER_LOW_MO => Ok(TaiViet::LetterLowMo),
LETTER_HIGH_MO => Ok(TaiViet::LetterHighMo),
LETTER_LOW_YO => Ok(TaiViet::LetterLowYo),
LETTER_HIGH_YO => Ok(TaiViet::LetterHighYo),
LETTER_LOW_RO => Ok(TaiViet::LetterLowRo),
LETTER_HIGH_RO => Ok(TaiViet::LetterHighRo),
LETTER_LOW_LO => Ok(TaiViet::LetterLowLo),
LETTER_HIGH_LO => Ok(TaiViet::LetterHighLo),
LETTER_LOW_VO => Ok(TaiViet::LetterLowVo),
LETTER_HIGH_VO => Ok(TaiViet::LetterHighVo),
LETTER_LOW_HO => Ok(TaiViet::LetterLowHo),
LETTER_HIGH_HO => Ok(TaiViet::LetterHighHo),
LETTER_LOW_O => Ok(TaiViet::LetterLowO),
LETTER_HIGH_O => Ok(TaiViet::LetterHighO),
MAI_KANG => Ok(TaiViet::MaiKang),
VOWEL_AA => Ok(TaiViet::VowelAa),
VOWEL_I => Ok(TaiViet::VowelI),
VOWEL_UE => Ok(TaiViet::VowelUe),
VOWEL_U => Ok(TaiViet::VowelU),
VOWEL_E => Ok(TaiViet::VowelE),
VOWEL_O => Ok(TaiViet::VowelO),
MAI_KHIT => Ok(TaiViet::MaiKhit),
VOWEL_IA => Ok(TaiViet::VowelIa),
VOWEL_UEA => Ok(TaiViet::VowelUea),
VOWEL_UA => Ok(TaiViet::VowelUa),
VOWEL_AUE => Ok(TaiViet::VowelAue),
VOWEL_AY => Ok(TaiViet::VowelAy),
VOWEL_AN => Ok(TaiViet::VowelAn),
VOWEL_AM => Ok(TaiViet::VowelAm),
TONE_MAI_EK => Ok(TaiViet::ToneMaiEk),
TONE_MAI_NUENG => Ok(TaiViet::ToneMaiNueng),
TONE_MAI_THO => Ok(TaiViet::ToneMaiTho),
TONE_MAI_SONG => Ok(TaiViet::ToneMaiSong),
SYMBOL_KON => Ok(TaiViet::SymbolKon),
SYMBOL_NUENG => Ok(TaiViet::SymbolNueng),
SYMBOL_SAM => Ok(TaiViet::SymbolSam),
SYMBOL_HO_HOI => Ok(TaiViet::SymbolHoHoi),
_ => Err(()),
}
}
}
impl Into<u32> for TaiViet {
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 TaiViet {
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 TaiViet {
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 TaiViet {
pub fn new() -> Self {
TaiViet::LetterLowKo
}
pub fn name(&self) -> &str {
match self {
TaiViet::LetterLowKo => "tai viet letter low ko",
TaiViet::LetterHighKo => "tai viet letter high ko",
TaiViet::LetterLowKho => "tai viet letter low kho",
TaiViet::LetterHighKho => "tai viet letter high kho",
TaiViet::LetterLowKhho => "tai viet letter low khho",
TaiViet::LetterHighKhho => "tai viet letter high khho",
TaiViet::LetterLowGo => "tai viet letter low go",
TaiViet::LetterHighGo => "tai viet letter high go",
TaiViet::LetterLowNgo => "tai viet letter low ngo",
TaiViet::LetterHighNgo => "tai viet letter high ngo",
TaiViet::LetterLowCo => "tai viet letter low co",
TaiViet::LetterHighCo => "tai viet letter high co",
TaiViet::LetterLowCho => "tai viet letter low cho",
TaiViet::LetterHighCho => "tai viet letter high cho",
TaiViet::LetterLowSo => "tai viet letter low so",
TaiViet::LetterHighSo => "tai viet letter high so",
TaiViet::LetterLowNyo => "tai viet letter low nyo",
TaiViet::LetterHighNyo => "tai viet letter high nyo",
TaiViet::LetterLowDo => "tai viet letter low do",
TaiViet::LetterHighDo => "tai viet letter high do",
TaiViet::LetterLowTo => "tai viet letter low to",
TaiViet::LetterHighTo => "tai viet letter high to",
TaiViet::LetterLowTho => "tai viet letter low tho",
TaiViet::LetterHighTho => "tai viet letter high tho",
TaiViet::LetterLowNo => "tai viet letter low no",
TaiViet::LetterHighNo => "tai viet letter high no",
TaiViet::LetterLowBo => "tai viet letter low bo",
TaiViet::LetterHighBo => "tai viet letter high bo",
TaiViet::LetterLowPo => "tai viet letter low po",
TaiViet::LetterHighPo => "tai viet letter high po",
TaiViet::LetterLowPho => "tai viet letter low pho",
TaiViet::LetterHighPho => "tai viet letter high pho",
TaiViet::LetterLowFo => "tai viet letter low fo",
TaiViet::LetterHighFo => "tai viet letter high fo",
TaiViet::LetterLowMo => "tai viet letter low mo",
TaiViet::LetterHighMo => "tai viet letter high mo",
TaiViet::LetterLowYo => "tai viet letter low yo",
TaiViet::LetterHighYo => "tai viet letter high yo",
TaiViet::LetterLowRo => "tai viet letter low ro",
TaiViet::LetterHighRo => "tai viet letter high ro",
TaiViet::LetterLowLo => "tai viet letter low lo",
TaiViet::LetterHighLo => "tai viet letter high lo",
TaiViet::LetterLowVo => "tai viet letter low vo",
TaiViet::LetterHighVo => "tai viet letter high vo",
TaiViet::LetterLowHo => "tai viet letter low ho",
TaiViet::LetterHighHo => "tai viet letter high ho",
TaiViet::LetterLowO => "tai viet letter low o",
TaiViet::LetterHighO => "tai viet letter high o",
TaiViet::MaiKang => "tai viet mai kang",
TaiViet::VowelAa => "tai viet vowel aa",
TaiViet::VowelI => "tai viet vowel i",
TaiViet::VowelUe => "tai viet vowel ue",
TaiViet::VowelU => "tai viet vowel u",
TaiViet::VowelE => "tai viet vowel e",
TaiViet::VowelO => "tai viet vowel o",
TaiViet::MaiKhit => "tai viet mai khit",
TaiViet::VowelIa => "tai viet vowel ia",
TaiViet::VowelUea => "tai viet vowel uea",
TaiViet::VowelUa => "tai viet vowel ua",
TaiViet::VowelAue => "tai viet vowel aue",
TaiViet::VowelAy => "tai viet vowel ay",
TaiViet::VowelAn => "tai viet vowel an",
TaiViet::VowelAm => "tai viet vowel am",
TaiViet::ToneMaiEk => "tai viet tone mai ek",
TaiViet::ToneMaiNueng => "tai viet tone mai nueng",
TaiViet::ToneMaiTho => "tai viet tone mai tho",
TaiViet::ToneMaiSong => "tai viet tone mai song",
TaiViet::SymbolKon => "tai viet symbol kon",
TaiViet::SymbolNueng => "tai viet symbol nueng",
TaiViet::SymbolSam => "tai viet symbol sam",
TaiViet::SymbolHoHoi => "tai viet symbol ho hoi",
}
}
}