#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Buginese {
LetterKa,
LetterGa,
LetterNga,
LetterNgka,
LetterPa,
LetterBa,
LetterMa,
LetterMpa,
LetterTa,
LetterDa,
LetterNa,
LetterNra,
LetterCa,
LetterJa,
LetterNya,
LetterNyca,
LetterYa,
LetterRa,
LetterLa,
LetterVa,
LetterSa,
LetterA,
LetterHa,
VowelSignI,
VowelSignU,
VowelSignE,
VowelSignO,
VowelSignAe,
Pallawa,
}
impl Into<char> for Buginese {
fn into(self) -> char {
match self {
Buginese::LetterKa => 'ᨀ',
Buginese::LetterGa => 'ᨁ',
Buginese::LetterNga => 'ᨂ',
Buginese::LetterNgka => 'ᨃ',
Buginese::LetterPa => 'ᨄ',
Buginese::LetterBa => 'ᨅ',
Buginese::LetterMa => 'ᨆ',
Buginese::LetterMpa => 'ᨇ',
Buginese::LetterTa => 'ᨈ',
Buginese::LetterDa => 'ᨉ',
Buginese::LetterNa => 'ᨊ',
Buginese::LetterNra => 'ᨋ',
Buginese::LetterCa => 'ᨌ',
Buginese::LetterJa => 'ᨍ',
Buginese::LetterNya => 'ᨎ',
Buginese::LetterNyca => 'ᨏ',
Buginese::LetterYa => 'ᨐ',
Buginese::LetterRa => 'ᨑ',
Buginese::LetterLa => 'ᨒ',
Buginese::LetterVa => 'ᨓ',
Buginese::LetterSa => 'ᨔ',
Buginese::LetterA => 'ᨕ',
Buginese::LetterHa => 'ᨖ',
Buginese::VowelSignI => 'ᨗ',
Buginese::VowelSignU => 'ᨘ',
Buginese::VowelSignE => 'ᨙ',
Buginese::VowelSignO => 'ᨚ',
Buginese::VowelSignAe => 'ᨛ',
Buginese::Pallawa => '᨞',
}
}
}
impl std::convert::TryFrom<char> for Buginese {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ᨀ' => Ok(Buginese::LetterKa),
'ᨁ' => Ok(Buginese::LetterGa),
'ᨂ' => Ok(Buginese::LetterNga),
'ᨃ' => Ok(Buginese::LetterNgka),
'ᨄ' => Ok(Buginese::LetterPa),
'ᨅ' => Ok(Buginese::LetterBa),
'ᨆ' => Ok(Buginese::LetterMa),
'ᨇ' => Ok(Buginese::LetterMpa),
'ᨈ' => Ok(Buginese::LetterTa),
'ᨉ' => Ok(Buginese::LetterDa),
'ᨊ' => Ok(Buginese::LetterNa),
'ᨋ' => Ok(Buginese::LetterNra),
'ᨌ' => Ok(Buginese::LetterCa),
'ᨍ' => Ok(Buginese::LetterJa),
'ᨎ' => Ok(Buginese::LetterNya),
'ᨏ' => Ok(Buginese::LetterNyca),
'ᨐ' => Ok(Buginese::LetterYa),
'ᨑ' => Ok(Buginese::LetterRa),
'ᨒ' => Ok(Buginese::LetterLa),
'ᨓ' => Ok(Buginese::LetterVa),
'ᨔ' => Ok(Buginese::LetterSa),
'ᨕ' => Ok(Buginese::LetterA),
'ᨖ' => Ok(Buginese::LetterHa),
'ᨗ' => Ok(Buginese::VowelSignI),
'ᨘ' => Ok(Buginese::VowelSignU),
'ᨙ' => Ok(Buginese::VowelSignE),
'ᨚ' => Ok(Buginese::VowelSignO),
'ᨛ' => Ok(Buginese::VowelSignAe),
'᨞' => Ok(Buginese::Pallawa),
_ => Err(()),
}
}
}
impl Into<u32> for Buginese {
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 Buginese {
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 Buginese {
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 Buginese {
pub fn new() -> Self {
Buginese::LetterKa
}
pub fn name(&self) -> String {
let s = std::format!("Buginese{:#?}", self);
string_morph::to_sentence_case(&s)
}
}