#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Bopomofo {
LetterB,
LetterP,
LetterM,
LetterF,
LetterD,
LetterT,
LetterN,
LetterL,
LetterG,
LetterK,
LetterH,
LetterJ,
LetterQ,
LetterX,
LetterZh,
LetterCh,
LetterSh,
LetterR,
LetterZ,
LetterC,
LetterS,
LetterA,
LetterO,
LetterE,
LetterEh,
LetterAi,
LetterEi,
LetterAu,
LetterOu,
LetterAn,
LetterEn,
LetterAng,
LetterEng,
LetterEr,
LetterI,
LetterU,
LetterIu,
LetterV,
LetterNg,
LetterGn,
LetterIh,
LetterOWithDotAbove,
}
impl Into<char> for Bopomofo {
fn into(self) -> char {
match self {
Bopomofo::LetterB => 'ㄅ',
Bopomofo::LetterP => 'ㄆ',
Bopomofo::LetterM => 'ㄇ',
Bopomofo::LetterF => 'ㄈ',
Bopomofo::LetterD => 'ㄉ',
Bopomofo::LetterT => 'ㄊ',
Bopomofo::LetterN => 'ㄋ',
Bopomofo::LetterL => 'ㄌ',
Bopomofo::LetterG => 'ㄍ',
Bopomofo::LetterK => 'ㄎ',
Bopomofo::LetterH => 'ㄏ',
Bopomofo::LetterJ => 'ㄐ',
Bopomofo::LetterQ => 'ㄑ',
Bopomofo::LetterX => 'ㄒ',
Bopomofo::LetterZh => 'ㄓ',
Bopomofo::LetterCh => 'ㄔ',
Bopomofo::LetterSh => 'ㄕ',
Bopomofo::LetterR => 'ㄖ',
Bopomofo::LetterZ => 'ㄗ',
Bopomofo::LetterC => 'ㄘ',
Bopomofo::LetterS => 'ㄙ',
Bopomofo::LetterA => 'ㄚ',
Bopomofo::LetterO => 'ㄛ',
Bopomofo::LetterE => 'ㄜ',
Bopomofo::LetterEh => 'ㄝ',
Bopomofo::LetterAi => 'ㄞ',
Bopomofo::LetterEi => 'ㄟ',
Bopomofo::LetterAu => 'ㄠ',
Bopomofo::LetterOu => 'ㄡ',
Bopomofo::LetterAn => 'ㄢ',
Bopomofo::LetterEn => 'ㄣ',
Bopomofo::LetterAng => 'ㄤ',
Bopomofo::LetterEng => 'ㄥ',
Bopomofo::LetterEr => 'ㄦ',
Bopomofo::LetterI => 'ㄧ',
Bopomofo::LetterU => 'ㄨ',
Bopomofo::LetterIu => 'ㄩ',
Bopomofo::LetterV => 'ㄪ',
Bopomofo::LetterNg => 'ㄫ',
Bopomofo::LetterGn => 'ㄬ',
Bopomofo::LetterIh => 'ㄭ',
Bopomofo::LetterOWithDotAbove => 'ㄮ',
}
}
}
impl std::convert::TryFrom<char> for Bopomofo {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ㄅ' => Ok(Bopomofo::LetterB),
'ㄆ' => Ok(Bopomofo::LetterP),
'ㄇ' => Ok(Bopomofo::LetterM),
'ㄈ' => Ok(Bopomofo::LetterF),
'ㄉ' => Ok(Bopomofo::LetterD),
'ㄊ' => Ok(Bopomofo::LetterT),
'ㄋ' => Ok(Bopomofo::LetterN),
'ㄌ' => Ok(Bopomofo::LetterL),
'ㄍ' => Ok(Bopomofo::LetterG),
'ㄎ' => Ok(Bopomofo::LetterK),
'ㄏ' => Ok(Bopomofo::LetterH),
'ㄐ' => Ok(Bopomofo::LetterJ),
'ㄑ' => Ok(Bopomofo::LetterQ),
'ㄒ' => Ok(Bopomofo::LetterX),
'ㄓ' => Ok(Bopomofo::LetterZh),
'ㄔ' => Ok(Bopomofo::LetterCh),
'ㄕ' => Ok(Bopomofo::LetterSh),
'ㄖ' => Ok(Bopomofo::LetterR),
'ㄗ' => Ok(Bopomofo::LetterZ),
'ㄘ' => Ok(Bopomofo::LetterC),
'ㄙ' => Ok(Bopomofo::LetterS),
'ㄚ' => Ok(Bopomofo::LetterA),
'ㄛ' => Ok(Bopomofo::LetterO),
'ㄜ' => Ok(Bopomofo::LetterE),
'ㄝ' => Ok(Bopomofo::LetterEh),
'ㄞ' => Ok(Bopomofo::LetterAi),
'ㄟ' => Ok(Bopomofo::LetterEi),
'ㄠ' => Ok(Bopomofo::LetterAu),
'ㄡ' => Ok(Bopomofo::LetterOu),
'ㄢ' => Ok(Bopomofo::LetterAn),
'ㄣ' => Ok(Bopomofo::LetterEn),
'ㄤ' => Ok(Bopomofo::LetterAng),
'ㄥ' => Ok(Bopomofo::LetterEng),
'ㄦ' => Ok(Bopomofo::LetterEr),
'ㄧ' => Ok(Bopomofo::LetterI),
'ㄨ' => Ok(Bopomofo::LetterU),
'ㄩ' => Ok(Bopomofo::LetterIu),
'ㄪ' => Ok(Bopomofo::LetterV),
'ㄫ' => Ok(Bopomofo::LetterNg),
'ㄬ' => Ok(Bopomofo::LetterGn),
'ㄭ' => Ok(Bopomofo::LetterIh),
'ㄮ' => Ok(Bopomofo::LetterOWithDotAbove),
_ => Err(()),
}
}
}
impl Into<u32> for Bopomofo {
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 Bopomofo {
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 Bopomofo {
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 Bopomofo {
pub fn new() -> Self {
Bopomofo::LetterB
}
pub fn name(&self) -> String {
let s = std::format!("Bopomofo{:#?}", self);
string_morph::to_sentence_case(&s)
}
}