#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Grantha {
SignCombiningAnusvaraAbove,
SignCandrabindu,
SignAnusvara,
SignVisarga,
LetterA,
LetterAa,
LetterI,
LetterIi,
LetterU,
LetterUu,
LetterVocalicR,
LetterVocalicL,
LetterEe,
LetterAi,
LetterOo,
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,
LetterLla,
LetterVa,
LetterSha,
LetterSsa,
LetterSa,
LetterHa,
CombiningBinduBelow,
SignNukta,
SignAvagraha,
VowelSignAa,
VowelSignI,
VowelSignIi,
VowelSignU,
VowelSignUu,
VowelSignVocalicR,
VowelSignVocalicRr,
VowelSignEe,
VowelSignAi,
VowelSignOo,
VowelSignAu,
SignVirama,
Om,
AuLengthMark,
SignPluta,
LetterVedicAnusvara,
LetterVedicDoubleAnusvara,
LetterVocalicRr,
LetterVocalicLl,
VowelSignVocalicL,
VowelSignVocalicLl,
CombiningDigitZero,
CombiningDigitOne,
CombiningDigitTwo,
CombiningDigitThree,
CombiningDigitFour,
CombiningDigitFive,
CombiningDigitSix,
CombiningLetterA,
CombiningLetterKa,
CombiningLetterNa,
CombiningLetterVi,
CombiningLetterPa,
}
impl Into<char> for Grantha {
fn into(self) -> char {
match self {
Grantha::SignCombiningAnusvaraAbove => '𑌀',
Grantha::SignCandrabindu => '𑌁',
Grantha::SignAnusvara => '𑌂',
Grantha::SignVisarga => '𑌃',
Grantha::LetterA => '𑌅',
Grantha::LetterAa => '𑌆',
Grantha::LetterI => '𑌇',
Grantha::LetterIi => '𑌈',
Grantha::LetterU => '𑌉',
Grantha::LetterUu => '𑌊',
Grantha::LetterVocalicR => '𑌋',
Grantha::LetterVocalicL => '𑌌',
Grantha::LetterEe => '𑌏',
Grantha::LetterAi => '𑌐',
Grantha::LetterOo => '𑌓',
Grantha::LetterAu => '𑌔',
Grantha::LetterKa => '𑌕',
Grantha::LetterKha => '𑌖',
Grantha::LetterGa => '𑌗',
Grantha::LetterGha => '𑌘',
Grantha::LetterNga => '𑌙',
Grantha::LetterCa => '𑌚',
Grantha::LetterCha => '𑌛',
Grantha::LetterJa => '𑌜',
Grantha::LetterJha => '𑌝',
Grantha::LetterNya => '𑌞',
Grantha::LetterTta => '𑌟',
Grantha::LetterTtha => '𑌠',
Grantha::LetterDda => '𑌡',
Grantha::LetterDdha => '𑌢',
Grantha::LetterNna => '𑌣',
Grantha::LetterTa => '𑌤',
Grantha::LetterTha => '𑌥',
Grantha::LetterDa => '𑌦',
Grantha::LetterDha => '𑌧',
Grantha::LetterNa => '𑌨',
Grantha::LetterPa => '𑌪',
Grantha::LetterPha => '𑌫',
Grantha::LetterBa => '𑌬',
Grantha::LetterBha => '𑌭',
Grantha::LetterMa => '𑌮',
Grantha::LetterYa => '𑌯',
Grantha::LetterRa => '𑌰',
Grantha::LetterLa => '𑌲',
Grantha::LetterLla => '𑌳',
Grantha::LetterVa => '𑌵',
Grantha::LetterSha => '𑌶',
Grantha::LetterSsa => '𑌷',
Grantha::LetterSa => '𑌸',
Grantha::LetterHa => '𑌹',
Grantha::CombiningBinduBelow => '𑌻',
Grantha::SignNukta => '𑌼',
Grantha::SignAvagraha => '𑌽',
Grantha::VowelSignAa => '𑌾',
Grantha::VowelSignI => '𑌿',
Grantha::VowelSignIi => '𑍀',
Grantha::VowelSignU => '𑍁',
Grantha::VowelSignUu => '𑍂',
Grantha::VowelSignVocalicR => '𑍃',
Grantha::VowelSignVocalicRr => '𑍄',
Grantha::VowelSignEe => '𑍇',
Grantha::VowelSignAi => '𑍈',
Grantha::VowelSignOo => '𑍋',
Grantha::VowelSignAu => '𑍌',
Grantha::SignVirama => '𑍍',
Grantha::Om => '𑍐',
Grantha::AuLengthMark => '𑍗',
Grantha::SignPluta => '𑍝',
Grantha::LetterVedicAnusvara => '𑍞',
Grantha::LetterVedicDoubleAnusvara => '𑍟',
Grantha::LetterVocalicRr => '𑍠',
Grantha::LetterVocalicLl => '𑍡',
Grantha::VowelSignVocalicL => '𑍢',
Grantha::VowelSignVocalicLl => '𑍣',
Grantha::CombiningDigitZero => '𑍦',
Grantha::CombiningDigitOne => '𑍧',
Grantha::CombiningDigitTwo => '𑍨',
Grantha::CombiningDigitThree => '𑍩',
Grantha::CombiningDigitFour => '𑍪',
Grantha::CombiningDigitFive => '𑍫',
Grantha::CombiningDigitSix => '𑍬',
Grantha::CombiningLetterA => '𑍰',
Grantha::CombiningLetterKa => '𑍱',
Grantha::CombiningLetterNa => '𑍲',
Grantha::CombiningLetterVi => '𑍳',
Grantha::CombiningLetterPa => '𑍴',
}
}
}
impl std::convert::TryFrom<char> for Grantha {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'𑌀' => Ok(Grantha::SignCombiningAnusvaraAbove),
'𑌁' => Ok(Grantha::SignCandrabindu),
'𑌂' => Ok(Grantha::SignAnusvara),
'𑌃' => Ok(Grantha::SignVisarga),
'𑌅' => Ok(Grantha::LetterA),
'𑌆' => Ok(Grantha::LetterAa),
'𑌇' => Ok(Grantha::LetterI),
'𑌈' => Ok(Grantha::LetterIi),
'𑌉' => Ok(Grantha::LetterU),
'𑌊' => Ok(Grantha::LetterUu),
'𑌋' => Ok(Grantha::LetterVocalicR),
'𑌌' => Ok(Grantha::LetterVocalicL),
'𑌏' => Ok(Grantha::LetterEe),
'𑌐' => Ok(Grantha::LetterAi),
'𑌓' => Ok(Grantha::LetterOo),
'𑌔' => Ok(Grantha::LetterAu),
'𑌕' => Ok(Grantha::LetterKa),
'𑌖' => Ok(Grantha::LetterKha),
'𑌗' => Ok(Grantha::LetterGa),
'𑌘' => Ok(Grantha::LetterGha),
'𑌙' => Ok(Grantha::LetterNga),
'𑌚' => Ok(Grantha::LetterCa),
'𑌛' => Ok(Grantha::LetterCha),
'𑌜' => Ok(Grantha::LetterJa),
'𑌝' => Ok(Grantha::LetterJha),
'𑌞' => Ok(Grantha::LetterNya),
'𑌟' => Ok(Grantha::LetterTta),
'𑌠' => Ok(Grantha::LetterTtha),
'𑌡' => Ok(Grantha::LetterDda),
'𑌢' => Ok(Grantha::LetterDdha),
'𑌣' => Ok(Grantha::LetterNna),
'𑌤' => Ok(Grantha::LetterTa),
'𑌥' => Ok(Grantha::LetterTha),
'𑌦' => Ok(Grantha::LetterDa),
'𑌧' => Ok(Grantha::LetterDha),
'𑌨' => Ok(Grantha::LetterNa),
'𑌪' => Ok(Grantha::LetterPa),
'𑌫' => Ok(Grantha::LetterPha),
'𑌬' => Ok(Grantha::LetterBa),
'𑌭' => Ok(Grantha::LetterBha),
'𑌮' => Ok(Grantha::LetterMa),
'𑌯' => Ok(Grantha::LetterYa),
'𑌰' => Ok(Grantha::LetterRa),
'𑌲' => Ok(Grantha::LetterLa),
'𑌳' => Ok(Grantha::LetterLla),
'𑌵' => Ok(Grantha::LetterVa),
'𑌶' => Ok(Grantha::LetterSha),
'𑌷' => Ok(Grantha::LetterSsa),
'𑌸' => Ok(Grantha::LetterSa),
'𑌹' => Ok(Grantha::LetterHa),
'𑌻' => Ok(Grantha::CombiningBinduBelow),
'𑌼' => Ok(Grantha::SignNukta),
'𑌽' => Ok(Grantha::SignAvagraha),
'𑌾' => Ok(Grantha::VowelSignAa),
'𑌿' => Ok(Grantha::VowelSignI),
'𑍀' => Ok(Grantha::VowelSignIi),
'𑍁' => Ok(Grantha::VowelSignU),
'𑍂' => Ok(Grantha::VowelSignUu),
'𑍃' => Ok(Grantha::VowelSignVocalicR),
'𑍄' => Ok(Grantha::VowelSignVocalicRr),
'𑍇' => Ok(Grantha::VowelSignEe),
'𑍈' => Ok(Grantha::VowelSignAi),
'𑍋' => Ok(Grantha::VowelSignOo),
'𑍌' => Ok(Grantha::VowelSignAu),
'𑍍' => Ok(Grantha::SignVirama),
'𑍐' => Ok(Grantha::Om),
'𑍗' => Ok(Grantha::AuLengthMark),
'𑍝' => Ok(Grantha::SignPluta),
'𑍞' => Ok(Grantha::LetterVedicAnusvara),
'𑍟' => Ok(Grantha::LetterVedicDoubleAnusvara),
'𑍠' => Ok(Grantha::LetterVocalicRr),
'𑍡' => Ok(Grantha::LetterVocalicLl),
'𑍢' => Ok(Grantha::VowelSignVocalicL),
'𑍣' => Ok(Grantha::VowelSignVocalicLl),
'𑍦' => Ok(Grantha::CombiningDigitZero),
'𑍧' => Ok(Grantha::CombiningDigitOne),
'𑍨' => Ok(Grantha::CombiningDigitTwo),
'𑍩' => Ok(Grantha::CombiningDigitThree),
'𑍪' => Ok(Grantha::CombiningDigitFour),
'𑍫' => Ok(Grantha::CombiningDigitFive),
'𑍬' => Ok(Grantha::CombiningDigitSix),
'𑍰' => Ok(Grantha::CombiningLetterA),
'𑍱' => Ok(Grantha::CombiningLetterKa),
'𑍲' => Ok(Grantha::CombiningLetterNa),
'𑍳' => Ok(Grantha::CombiningLetterVi),
'𑍴' => Ok(Grantha::CombiningLetterPa),
_ => Err(()),
}
}
}
impl Into<u32> for Grantha {
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 Grantha {
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 Grantha {
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 Grantha {
pub fn new() -> Self {
Grantha::SignCombiningAnusvaraAbove
}
pub fn name(&self) -> String {
let s = std::format!("Grantha{:#?}", self);
string_morph::to_sentence_case(&s)
}
}