#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Takri {
LetterA,
LetterAa,
LetterI,
LetterIi,
LetterU,
LetterUu,
LetterE,
LetterAi,
LetterO,
LetterAu,
LetterKa,
LetterKha,
LetterGa,
LetterGha,
LetterNga,
LetterCa,
LetterCha,
LetterJa,
LetterJha,
LetterNya,
LetterTta,
LetterTtha,
LetterDda,
LetterDdha,
LetterNna,
LetterTa,
LetterTha,
LetterDa,
LetterDha,
LetterNa,
LetterPa,
LetterPha,
LetterBa,
LetterBha,
LetterMa,
LetterYa,
LetterRa,
LetterLa,
LetterVa,
LetterSha,
LetterSa,
LetterHa,
LetterRra,
SignAnusvara,
SignVisarga,
VowelSignAa,
VowelSignI,
VowelSignIi,
VowelSignU,
VowelSignUu,
VowelSignE,
VowelSignAi,
VowelSignO,
VowelSignAu,
SignVirama,
SignNukta,
LetterArchaicKha,
DigitZero,
DigitOne,
DigitTwo,
DigitThree,
DigitFour,
DigitFive,
DigitSix,
DigitSeven,
DigitEight,
DigitNine,
}
impl Into<char> for Takri {
fn into(self) -> char {
match self {
Takri::LetterA => '𑚀',
Takri::LetterAa => '𑚁',
Takri::LetterI => '𑚂',
Takri::LetterIi => '𑚃',
Takri::LetterU => '𑚄',
Takri::LetterUu => '𑚅',
Takri::LetterE => '𑚆',
Takri::LetterAi => '𑚇',
Takri::LetterO => '𑚈',
Takri::LetterAu => '𑚉',
Takri::LetterKa => '𑚊',
Takri::LetterKha => '𑚋',
Takri::LetterGa => '𑚌',
Takri::LetterGha => '𑚍',
Takri::LetterNga => '𑚎',
Takri::LetterCa => '𑚏',
Takri::LetterCha => '𑚐',
Takri::LetterJa => '𑚑',
Takri::LetterJha => '𑚒',
Takri::LetterNya => '𑚓',
Takri::LetterTta => '𑚔',
Takri::LetterTtha => '𑚕',
Takri::LetterDda => '𑚖',
Takri::LetterDdha => '𑚗',
Takri::LetterNna => '𑚘',
Takri::LetterTa => '𑚙',
Takri::LetterTha => '𑚚',
Takri::LetterDa => '𑚛',
Takri::LetterDha => '𑚜',
Takri::LetterNa => '𑚝',
Takri::LetterPa => '𑚞',
Takri::LetterPha => '𑚟',
Takri::LetterBa => '𑚠',
Takri::LetterBha => '𑚡',
Takri::LetterMa => '𑚢',
Takri::LetterYa => '𑚣',
Takri::LetterRa => '𑚤',
Takri::LetterLa => '𑚥',
Takri::LetterVa => '𑚦',
Takri::LetterSha => '𑚧',
Takri::LetterSa => '𑚨',
Takri::LetterHa => '𑚩',
Takri::LetterRra => '𑚪',
Takri::SignAnusvara => '𑚫',
Takri::SignVisarga => '𑚬',
Takri::VowelSignAa => '𑚭',
Takri::VowelSignI => '𑚮',
Takri::VowelSignIi => '𑚯',
Takri::VowelSignU => '𑚰',
Takri::VowelSignUu => '𑚱',
Takri::VowelSignE => '𑚲',
Takri::VowelSignAi => '𑚳',
Takri::VowelSignO => '𑚴',
Takri::VowelSignAu => '𑚵',
Takri::SignVirama => '𑚶',
Takri::SignNukta => '𑚷',
Takri::LetterArchaicKha => '𑚸',
Takri::DigitZero => '𑛀',
Takri::DigitOne => '𑛁',
Takri::DigitTwo => '𑛂',
Takri::DigitThree => '𑛃',
Takri::DigitFour => '𑛄',
Takri::DigitFive => '𑛅',
Takri::DigitSix => '𑛆',
Takri::DigitSeven => '𑛇',
Takri::DigitEight => '𑛈',
Takri::DigitNine => '𑛉',
}
}
}
impl std::convert::TryFrom<char> for Takri {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'𑚀' => Ok(Takri::LetterA),
'𑚁' => Ok(Takri::LetterAa),
'𑚂' => Ok(Takri::LetterI),
'𑚃' => Ok(Takri::LetterIi),
'𑚄' => Ok(Takri::LetterU),
'𑚅' => Ok(Takri::LetterUu),
'𑚆' => Ok(Takri::LetterE),
'𑚇' => Ok(Takri::LetterAi),
'𑚈' => Ok(Takri::LetterO),
'𑚉' => Ok(Takri::LetterAu),
'𑚊' => Ok(Takri::LetterKa),
'𑚋' => Ok(Takri::LetterKha),
'𑚌' => Ok(Takri::LetterGa),
'𑚍' => Ok(Takri::LetterGha),
'𑚎' => Ok(Takri::LetterNga),
'𑚏' => Ok(Takri::LetterCa),
'𑚐' => Ok(Takri::LetterCha),
'𑚑' => Ok(Takri::LetterJa),
'𑚒' => Ok(Takri::LetterJha),
'𑚓' => Ok(Takri::LetterNya),
'𑚔' => Ok(Takri::LetterTta),
'𑚕' => Ok(Takri::LetterTtha),
'𑚖' => Ok(Takri::LetterDda),
'𑚗' => Ok(Takri::LetterDdha),
'𑚘' => Ok(Takri::LetterNna),
'𑚙' => Ok(Takri::LetterTa),
'𑚚' => Ok(Takri::LetterTha),
'𑚛' => Ok(Takri::LetterDa),
'𑚜' => Ok(Takri::LetterDha),
'𑚝' => Ok(Takri::LetterNa),
'𑚞' => Ok(Takri::LetterPa),
'𑚟' => Ok(Takri::LetterPha),
'𑚠' => Ok(Takri::LetterBa),
'𑚡' => Ok(Takri::LetterBha),
'𑚢' => Ok(Takri::LetterMa),
'𑚣' => Ok(Takri::LetterYa),
'𑚤' => Ok(Takri::LetterRa),
'𑚥' => Ok(Takri::LetterLa),
'𑚦' => Ok(Takri::LetterVa),
'𑚧' => Ok(Takri::LetterSha),
'𑚨' => Ok(Takri::LetterSa),
'𑚩' => Ok(Takri::LetterHa),
'𑚪' => Ok(Takri::LetterRra),
'𑚫' => Ok(Takri::SignAnusvara),
'𑚬' => Ok(Takri::SignVisarga),
'𑚭' => Ok(Takri::VowelSignAa),
'𑚮' => Ok(Takri::VowelSignI),
'𑚯' => Ok(Takri::VowelSignIi),
'𑚰' => Ok(Takri::VowelSignU),
'𑚱' => Ok(Takri::VowelSignUu),
'𑚲' => Ok(Takri::VowelSignE),
'𑚳' => Ok(Takri::VowelSignAi),
'𑚴' => Ok(Takri::VowelSignO),
'𑚵' => Ok(Takri::VowelSignAu),
'𑚶' => Ok(Takri::SignVirama),
'𑚷' => Ok(Takri::SignNukta),
'𑚸' => Ok(Takri::LetterArchaicKha),
'𑛀' => Ok(Takri::DigitZero),
'𑛁' => Ok(Takri::DigitOne),
'𑛂' => Ok(Takri::DigitTwo),
'𑛃' => Ok(Takri::DigitThree),
'𑛄' => Ok(Takri::DigitFour),
'𑛅' => Ok(Takri::DigitFive),
'𑛆' => Ok(Takri::DigitSix),
'𑛇' => Ok(Takri::DigitSeven),
'𑛈' => Ok(Takri::DigitEight),
'𑛉' => Ok(Takri::DigitNine),
_ => Err(()),
}
}
}
impl Into<u32> for Takri {
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 Takri {
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 Takri {
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 Takri {
pub fn new() -> Self {
Takri::LetterA
}
pub fn name(&self) -> String {
let s = std::format!("Takri{:#?}", self);
string_morph::to_sentence_case(&s)
}
}