#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Lisu {
LetterBa,
LetterPa,
LetterPha,
LetterDa,
LetterTa,
LetterTha,
LetterGa,
LetterKa,
LetterKha,
LetterJa,
LetterCa,
LetterCha,
LetterDza,
LetterTsa,
LetterTsha,
LetterMa,
LetterNa,
LetterLa,
LetterSa,
LetterZha,
LetterZa,
LetterNga,
LetterHa,
LetterXa,
LetterHha,
LetterFa,
LetterWa,
LetterSha,
LetterYa,
LetterGha,
LetterA,
LetterAe,
LetterE,
LetterEu,
LetterI,
LetterO,
LetterU,
LetterUe,
LetterUh,
LetterOe,
LetterToneMyaTi,
LetterToneNaPo,
LetterToneMyaCya,
LetterToneMyaBo,
LetterToneMyaNa,
LetterToneMyaJeu,
PunctuationComma,
}
impl Into<char> for Lisu {
fn into(self) -> char {
match self {
Lisu::LetterBa => 'ꓐ',
Lisu::LetterPa => 'ꓑ',
Lisu::LetterPha => 'ꓒ',
Lisu::LetterDa => 'ꓓ',
Lisu::LetterTa => 'ꓔ',
Lisu::LetterTha => 'ꓕ',
Lisu::LetterGa => 'ꓖ',
Lisu::LetterKa => 'ꓗ',
Lisu::LetterKha => 'ꓘ',
Lisu::LetterJa => 'ꓙ',
Lisu::LetterCa => 'ꓚ',
Lisu::LetterCha => 'ꓛ',
Lisu::LetterDza => 'ꓜ',
Lisu::LetterTsa => 'ꓝ',
Lisu::LetterTsha => 'ꓞ',
Lisu::LetterMa => 'ꓟ',
Lisu::LetterNa => 'ꓠ',
Lisu::LetterLa => 'ꓡ',
Lisu::LetterSa => 'ꓢ',
Lisu::LetterZha => 'ꓣ',
Lisu::LetterZa => 'ꓤ',
Lisu::LetterNga => 'ꓥ',
Lisu::LetterHa => 'ꓦ',
Lisu::LetterXa => 'ꓧ',
Lisu::LetterHha => 'ꓨ',
Lisu::LetterFa => 'ꓩ',
Lisu::LetterWa => 'ꓪ',
Lisu::LetterSha => 'ꓫ',
Lisu::LetterYa => 'ꓬ',
Lisu::LetterGha => 'ꓭ',
Lisu::LetterA => 'ꓮ',
Lisu::LetterAe => 'ꓯ',
Lisu::LetterE => 'ꓰ',
Lisu::LetterEu => 'ꓱ',
Lisu::LetterI => 'ꓲ',
Lisu::LetterO => 'ꓳ',
Lisu::LetterU => 'ꓴ',
Lisu::LetterUe => 'ꓵ',
Lisu::LetterUh => 'ꓶ',
Lisu::LetterOe => 'ꓷ',
Lisu::LetterToneMyaTi => 'ꓸ',
Lisu::LetterToneNaPo => 'ꓹ',
Lisu::LetterToneMyaCya => 'ꓺ',
Lisu::LetterToneMyaBo => 'ꓻ',
Lisu::LetterToneMyaNa => 'ꓼ',
Lisu::LetterToneMyaJeu => 'ꓽ',
Lisu::PunctuationComma => '꓾',
}
}
}
impl std::convert::TryFrom<char> for Lisu {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ꓐ' => Ok(Lisu::LetterBa),
'ꓑ' => Ok(Lisu::LetterPa),
'ꓒ' => Ok(Lisu::LetterPha),
'ꓓ' => Ok(Lisu::LetterDa),
'ꓔ' => Ok(Lisu::LetterTa),
'ꓕ' => Ok(Lisu::LetterTha),
'ꓖ' => Ok(Lisu::LetterGa),
'ꓗ' => Ok(Lisu::LetterKa),
'ꓘ' => Ok(Lisu::LetterKha),
'ꓙ' => Ok(Lisu::LetterJa),
'ꓚ' => Ok(Lisu::LetterCa),
'ꓛ' => Ok(Lisu::LetterCha),
'ꓜ' => Ok(Lisu::LetterDza),
'ꓝ' => Ok(Lisu::LetterTsa),
'ꓞ' => Ok(Lisu::LetterTsha),
'ꓟ' => Ok(Lisu::LetterMa),
'ꓠ' => Ok(Lisu::LetterNa),
'ꓡ' => Ok(Lisu::LetterLa),
'ꓢ' => Ok(Lisu::LetterSa),
'ꓣ' => Ok(Lisu::LetterZha),
'ꓤ' => Ok(Lisu::LetterZa),
'ꓥ' => Ok(Lisu::LetterNga),
'ꓦ' => Ok(Lisu::LetterHa),
'ꓧ' => Ok(Lisu::LetterXa),
'ꓨ' => Ok(Lisu::LetterHha),
'ꓩ' => Ok(Lisu::LetterFa),
'ꓪ' => Ok(Lisu::LetterWa),
'ꓫ' => Ok(Lisu::LetterSha),
'ꓬ' => Ok(Lisu::LetterYa),
'ꓭ' => Ok(Lisu::LetterGha),
'ꓮ' => Ok(Lisu::LetterA),
'ꓯ' => Ok(Lisu::LetterAe),
'ꓰ' => Ok(Lisu::LetterE),
'ꓱ' => Ok(Lisu::LetterEu),
'ꓲ' => Ok(Lisu::LetterI),
'ꓳ' => Ok(Lisu::LetterO),
'ꓴ' => Ok(Lisu::LetterU),
'ꓵ' => Ok(Lisu::LetterUe),
'ꓶ' => Ok(Lisu::LetterUh),
'ꓷ' => Ok(Lisu::LetterOe),
'ꓸ' => Ok(Lisu::LetterToneMyaTi),
'ꓹ' => Ok(Lisu::LetterToneNaPo),
'ꓺ' => Ok(Lisu::LetterToneMyaCya),
'ꓻ' => Ok(Lisu::LetterToneMyaBo),
'ꓼ' => Ok(Lisu::LetterToneMyaNa),
'ꓽ' => Ok(Lisu::LetterToneMyaJeu),
'꓾' => Ok(Lisu::PunctuationComma),
_ => Err(()),
}
}
}
impl Into<u32> for Lisu {
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 Lisu {
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 Lisu {
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 Lisu {
pub fn new() -> Self {
Lisu::LetterBa
}
pub fn name(&self) -> String {
let s = std::format!("Lisu{:#?}", self);
string_morph::to_sentence_case(&s)
}
}