mod constants {
pub const LETTER_KA: char = 'ᨀ';
pub const LETTER_GA: char = 'ᨁ';
pub const LETTER_NGA: char = 'ᨂ';
pub const LETTER_NGKA: char = 'ᨃ';
pub const LETTER_PA: char = 'ᨄ';
pub const LETTER_BA: char = 'ᨅ';
pub const LETTER_MA: char = 'ᨆ';
pub const LETTER_MPA: char = 'ᨇ';
pub const LETTER_TA: char = 'ᨈ';
pub const LETTER_DA: char = 'ᨉ';
pub const LETTER_NA: char = 'ᨊ';
pub const LETTER_NRA: char = 'ᨋ';
pub const LETTER_CA: char = 'ᨌ';
pub const LETTER_JA: char = 'ᨍ';
pub const LETTER_NYA: char = 'ᨎ';
pub const LETTER_NYCA: char = 'ᨏ';
pub const LETTER_YA: char = 'ᨐ';
pub const LETTER_RA: char = 'ᨑ';
pub const LETTER_LA: char = 'ᨒ';
pub const LETTER_VA: char = 'ᨓ';
pub const LETTER_SA: char = 'ᨔ';
pub const LETTER_A: char = 'ᨕ';
pub const LETTER_HA: char = 'ᨖ';
pub const VOWEL_SIGN_I: char = 'ᨗ';
pub const VOWEL_SIGN_U: char = 'ᨘ';
pub const VOWEL_SIGN_E: char = 'ᨙ';
pub const VOWEL_SIGN_O: char = 'ᨚ';
pub const VOWEL_SIGN_AE: char = 'ᨛ';
pub const PALLAWA: char = '᨞';
}
#[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 {
use constants::*;
match self {
Buginese::LetterKa => LETTER_KA,
Buginese::LetterGa => LETTER_GA,
Buginese::LetterNga => LETTER_NGA,
Buginese::LetterNgka => LETTER_NGKA,
Buginese::LetterPa => LETTER_PA,
Buginese::LetterBa => LETTER_BA,
Buginese::LetterMa => LETTER_MA,
Buginese::LetterMpa => LETTER_MPA,
Buginese::LetterTa => LETTER_TA,
Buginese::LetterDa => LETTER_DA,
Buginese::LetterNa => LETTER_NA,
Buginese::LetterNra => LETTER_NRA,
Buginese::LetterCa => LETTER_CA,
Buginese::LetterJa => LETTER_JA,
Buginese::LetterNya => LETTER_NYA,
Buginese::LetterNyca => LETTER_NYCA,
Buginese::LetterYa => LETTER_YA,
Buginese::LetterRa => LETTER_RA,
Buginese::LetterLa => LETTER_LA,
Buginese::LetterVa => LETTER_VA,
Buginese::LetterSa => LETTER_SA,
Buginese::LetterA => LETTER_A,
Buginese::LetterHa => LETTER_HA,
Buginese::VowelSignI => VOWEL_SIGN_I,
Buginese::VowelSignU => VOWEL_SIGN_U,
Buginese::VowelSignE => VOWEL_SIGN_E,
Buginese::VowelSignO => VOWEL_SIGN_O,
Buginese::VowelSignAe => VOWEL_SIGN_AE,
Buginese::Pallawa => PALLAWA,
}
}
}
impl std::convert::TryFrom<char> for Buginese {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
LETTER_KA => Ok(Buginese::LetterKa),
LETTER_GA => Ok(Buginese::LetterGa),
LETTER_NGA => Ok(Buginese::LetterNga),
LETTER_NGKA => Ok(Buginese::LetterNgka),
LETTER_PA => Ok(Buginese::LetterPa),
LETTER_BA => Ok(Buginese::LetterBa),
LETTER_MA => Ok(Buginese::LetterMa),
LETTER_MPA => Ok(Buginese::LetterMpa),
LETTER_TA => Ok(Buginese::LetterTa),
LETTER_DA => Ok(Buginese::LetterDa),
LETTER_NA => Ok(Buginese::LetterNa),
LETTER_NRA => Ok(Buginese::LetterNra),
LETTER_CA => Ok(Buginese::LetterCa),
LETTER_JA => Ok(Buginese::LetterJa),
LETTER_NYA => Ok(Buginese::LetterNya),
LETTER_NYCA => Ok(Buginese::LetterNyca),
LETTER_YA => Ok(Buginese::LetterYa),
LETTER_RA => Ok(Buginese::LetterRa),
LETTER_LA => Ok(Buginese::LetterLa),
LETTER_VA => Ok(Buginese::LetterVa),
LETTER_SA => Ok(Buginese::LetterSa),
LETTER_A => Ok(Buginese::LetterA),
LETTER_HA => Ok(Buginese::LetterHa),
VOWEL_SIGN_I => Ok(Buginese::VowelSignI),
VOWEL_SIGN_U => Ok(Buginese::VowelSignU),
VOWEL_SIGN_E => Ok(Buginese::VowelSignE),
VOWEL_SIGN_O => Ok(Buginese::VowelSignO),
VOWEL_SIGN_AE => Ok(Buginese::VowelSignAe),
PALLAWA => 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) -> &str {
match self {
Buginese::LetterKa => "buginese letter ka",
Buginese::LetterGa => "buginese letter ga",
Buginese::LetterNga => "buginese letter nga",
Buginese::LetterNgka => "buginese letter ngka",
Buginese::LetterPa => "buginese letter pa",
Buginese::LetterBa => "buginese letter ba",
Buginese::LetterMa => "buginese letter ma",
Buginese::LetterMpa => "buginese letter mpa",
Buginese::LetterTa => "buginese letter ta",
Buginese::LetterDa => "buginese letter da",
Buginese::LetterNa => "buginese letter na",
Buginese::LetterNra => "buginese letter nra",
Buginese::LetterCa => "buginese letter ca",
Buginese::LetterJa => "buginese letter ja",
Buginese::LetterNya => "buginese letter nya",
Buginese::LetterNyca => "buginese letter nyca",
Buginese::LetterYa => "buginese letter ya",
Buginese::LetterRa => "buginese letter ra",
Buginese::LetterLa => "buginese letter la",
Buginese::LetterVa => "buginese letter va",
Buginese::LetterSa => "buginese letter sa",
Buginese::LetterA => "buginese letter a",
Buginese::LetterHa => "buginese letter ha",
Buginese::VowelSignI => "buginese vowel sign i",
Buginese::VowelSignU => "buginese vowel sign u",
Buginese::VowelSignE => "buginese vowel sign e",
Buginese::VowelSignO => "buginese vowel sign o",
Buginese::VowelSignAe => "buginese vowel sign ae",
Buginese::Pallawa => "buginese pallawa",
}
}
}