#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Multani {
LetterA,
LetterI,
LetterU,
LetterE,
LetterKa,
LetterKha,
LetterGa,
LetterGha,
LetterCa,
LetterCha,
LetterJa,
LetterJja,
LetterNya,
LetterTta,
LetterTtha,
LetterDda,
LetterDdda,
LetterDdha,
LetterNna,
LetterTa,
LetterTha,
LetterDa,
LetterDha,
LetterNa,
LetterPa,
LetterPha,
LetterBa,
LetterBha,
LetterMa,
LetterYa,
LetterRa,
LetterLa,
LetterVa,
LetterSa,
LetterHa,
LetterRra,
LetterRha,
SectionMark,
}
impl Into<char> for Multani {
fn into(self) -> char {
match self {
Multani::LetterA => '𑊀',
Multani::LetterI => '𑊁',
Multani::LetterU => '𑊂',
Multani::LetterE => '𑊃',
Multani::LetterKa => '𑊄',
Multani::LetterKha => '𑊅',
Multani::LetterGa => '𑊆',
Multani::LetterGha => '𑊈',
Multani::LetterCa => '𑊊',
Multani::LetterCha => '𑊋',
Multani::LetterJa => '𑊌',
Multani::LetterJja => '𑊍',
Multani::LetterNya => '𑊏',
Multani::LetterTta => '𑊐',
Multani::LetterTtha => '𑊑',
Multani::LetterDda => '𑊒',
Multani::LetterDdda => '𑊓',
Multani::LetterDdha => '𑊔',
Multani::LetterNna => '𑊕',
Multani::LetterTa => '𑊖',
Multani::LetterTha => '𑊗',
Multani::LetterDa => '𑊘',
Multani::LetterDha => '𑊙',
Multani::LetterNa => '𑊚',
Multani::LetterPa => '𑊛',
Multani::LetterPha => '𑊜',
Multani::LetterBa => '𑊝',
Multani::LetterBha => '𑊟',
Multani::LetterMa => '𑊠',
Multani::LetterYa => '𑊡',
Multani::LetterRa => '𑊢',
Multani::LetterLa => '𑊣',
Multani::LetterVa => '𑊤',
Multani::LetterSa => '𑊥',
Multani::LetterHa => '𑊦',
Multani::LetterRra => '𑊧',
Multani::LetterRha => '𑊨',
Multani::SectionMark => '𑊩',
}
}
}
impl std::convert::TryFrom<char> for Multani {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'𑊀' => Ok(Multani::LetterA),
'𑊁' => Ok(Multani::LetterI),
'𑊂' => Ok(Multani::LetterU),
'𑊃' => Ok(Multani::LetterE),
'𑊄' => Ok(Multani::LetterKa),
'𑊅' => Ok(Multani::LetterKha),
'𑊆' => Ok(Multani::LetterGa),
'𑊈' => Ok(Multani::LetterGha),
'𑊊' => Ok(Multani::LetterCa),
'𑊋' => Ok(Multani::LetterCha),
'𑊌' => Ok(Multani::LetterJa),
'𑊍' => Ok(Multani::LetterJja),
'𑊏' => Ok(Multani::LetterNya),
'𑊐' => Ok(Multani::LetterTta),
'𑊑' => Ok(Multani::LetterTtha),
'𑊒' => Ok(Multani::LetterDda),
'𑊓' => Ok(Multani::LetterDdda),
'𑊔' => Ok(Multani::LetterDdha),
'𑊕' => Ok(Multani::LetterNna),
'𑊖' => Ok(Multani::LetterTa),
'𑊗' => Ok(Multani::LetterTha),
'𑊘' => Ok(Multani::LetterDa),
'𑊙' => Ok(Multani::LetterDha),
'𑊚' => Ok(Multani::LetterNa),
'𑊛' => Ok(Multani::LetterPa),
'𑊜' => Ok(Multani::LetterPha),
'𑊝' => Ok(Multani::LetterBa),
'𑊟' => Ok(Multani::LetterBha),
'𑊠' => Ok(Multani::LetterMa),
'𑊡' => Ok(Multani::LetterYa),
'𑊢' => Ok(Multani::LetterRa),
'𑊣' => Ok(Multani::LetterLa),
'𑊤' => Ok(Multani::LetterVa),
'𑊥' => Ok(Multani::LetterSa),
'𑊦' => Ok(Multani::LetterHa),
'𑊧' => Ok(Multani::LetterRra),
'𑊨' => Ok(Multani::LetterRha),
'𑊩' => Ok(Multani::SectionMark),
_ => Err(()),
}
}
}
impl Into<u32> for Multani {
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 Multani {
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 Multani {
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 Multani {
pub fn new() -> Self {
Multani::LetterA
}
pub fn name(&self) -> String {
let s = std::format!("Multani{:#?}", self);
string_morph::to_sentence_case(&s)
}
}