#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Hiragana {
LetterSmallA,
LetterA,
LetterSmallI,
LetterI,
LetterSmallU,
LetterU,
LetterSmallE,
LetterE,
LetterSmallO,
LetterO,
LetterKa,
LetterGa,
LetterKi,
LetterGi,
LetterKu,
LetterGu,
LetterKe,
LetterGe,
LetterKo,
LetterGo,
LetterSa,
LetterZa,
LetterSi,
LetterZi,
LetterSu,
LetterZu,
LetterSe,
LetterZe,
LetterSo,
LetterZo,
LetterTa,
LetterDa,
LetterTi,
LetterDi,
LetterSmallTu,
LetterTu,
LetterDu,
LetterTe,
LetterDe,
LetterTo,
LetterDo,
LetterNa,
LetterNi,
LetterNu,
LetterNe,
LetterNo,
LetterHa,
LetterBa,
LetterPa,
LetterHi,
LetterBi,
LetterPi,
LetterHu,
LetterBu,
LetterPu,
LetterHe,
LetterBe,
LetterPe,
LetterHo,
LetterBo,
LetterPo,
LetterMa,
LetterMi,
LetterMu,
LetterMe,
LetterMo,
LetterSmallYa,
LetterYa,
LetterSmallYu,
LetterYu,
LetterSmallYo,
LetterYo,
LetterRa,
LetterRi,
LetterRu,
LetterRe,
LetterRo,
LetterSmallWa,
LetterWa,
LetterWi,
LetterWe,
LetterWo,
LetterN,
LetterVu,
LetterSmallKa,
LetterSmallKe,
CombiningKatakanaDashVoicedSoundMark,
CombiningKatakanaDashSemiDashVoicedSoundMark,
KatakanaDashVoicedSoundMark,
KatakanaDashSemiDashVoicedSoundMark,
IterationMark,
VoicedIterationMark,
}
impl Into<char> for Hiragana {
fn into(self) -> char {
match self {
Hiragana::LetterSmallA => 'ぁ',
Hiragana::LetterA => 'あ',
Hiragana::LetterSmallI => 'ぃ',
Hiragana::LetterI => 'い',
Hiragana::LetterSmallU => 'ぅ',
Hiragana::LetterU => 'う',
Hiragana::LetterSmallE => 'ぇ',
Hiragana::LetterE => 'え',
Hiragana::LetterSmallO => 'ぉ',
Hiragana::LetterO => 'お',
Hiragana::LetterKa => 'か',
Hiragana::LetterGa => 'が',
Hiragana::LetterKi => 'き',
Hiragana::LetterGi => 'ぎ',
Hiragana::LetterKu => 'く',
Hiragana::LetterGu => 'ぐ',
Hiragana::LetterKe => 'け',
Hiragana::LetterGe => 'げ',
Hiragana::LetterKo => 'こ',
Hiragana::LetterGo => 'ご',
Hiragana::LetterSa => 'さ',
Hiragana::LetterZa => 'ざ',
Hiragana::LetterSi => 'し',
Hiragana::LetterZi => 'じ',
Hiragana::LetterSu => 'す',
Hiragana::LetterZu => 'ず',
Hiragana::LetterSe => 'せ',
Hiragana::LetterZe => 'ぜ',
Hiragana::LetterSo => 'そ',
Hiragana::LetterZo => 'ぞ',
Hiragana::LetterTa => 'た',
Hiragana::LetterDa => 'だ',
Hiragana::LetterTi => 'ち',
Hiragana::LetterDi => 'ぢ',
Hiragana::LetterSmallTu => 'っ',
Hiragana::LetterTu => 'つ',
Hiragana::LetterDu => 'づ',
Hiragana::LetterTe => 'て',
Hiragana::LetterDe => 'で',
Hiragana::LetterTo => 'と',
Hiragana::LetterDo => 'ど',
Hiragana::LetterNa => 'な',
Hiragana::LetterNi => 'に',
Hiragana::LetterNu => 'ぬ',
Hiragana::LetterNe => 'ね',
Hiragana::LetterNo => 'の',
Hiragana::LetterHa => 'は',
Hiragana::LetterBa => 'ば',
Hiragana::LetterPa => 'ぱ',
Hiragana::LetterHi => 'ひ',
Hiragana::LetterBi => 'び',
Hiragana::LetterPi => 'ぴ',
Hiragana::LetterHu => 'ふ',
Hiragana::LetterBu => 'ぶ',
Hiragana::LetterPu => 'ぷ',
Hiragana::LetterHe => 'へ',
Hiragana::LetterBe => 'べ',
Hiragana::LetterPe => 'ぺ',
Hiragana::LetterHo => 'ほ',
Hiragana::LetterBo => 'ぼ',
Hiragana::LetterPo => 'ぽ',
Hiragana::LetterMa => 'ま',
Hiragana::LetterMi => 'み',
Hiragana::LetterMu => 'む',
Hiragana::LetterMe => 'め',
Hiragana::LetterMo => 'も',
Hiragana::LetterSmallYa => 'ゃ',
Hiragana::LetterYa => 'や',
Hiragana::LetterSmallYu => 'ゅ',
Hiragana::LetterYu => 'ゆ',
Hiragana::LetterSmallYo => 'ょ',
Hiragana::LetterYo => 'よ',
Hiragana::LetterRa => 'ら',
Hiragana::LetterRi => 'り',
Hiragana::LetterRu => 'る',
Hiragana::LetterRe => 'れ',
Hiragana::LetterRo => 'ろ',
Hiragana::LetterSmallWa => 'ゎ',
Hiragana::LetterWa => 'わ',
Hiragana::LetterWi => 'ゐ',
Hiragana::LetterWe => 'ゑ',
Hiragana::LetterWo => 'を',
Hiragana::LetterN => 'ん',
Hiragana::LetterVu => 'ゔ',
Hiragana::LetterSmallKa => 'ゕ',
Hiragana::LetterSmallKe => 'ゖ',
Hiragana::CombiningKatakanaDashVoicedSoundMark => '゙',
Hiragana::CombiningKatakanaDashSemiDashVoicedSoundMark => '゚',
Hiragana::KatakanaDashVoicedSoundMark => '゛',
Hiragana::KatakanaDashSemiDashVoicedSoundMark => '゜',
Hiragana::IterationMark => 'ゝ',
Hiragana::VoicedIterationMark => 'ゞ',
}
}
}
impl std::convert::TryFrom<char> for Hiragana {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'ぁ' => Ok(Hiragana::LetterSmallA),
'あ' => Ok(Hiragana::LetterA),
'ぃ' => Ok(Hiragana::LetterSmallI),
'い' => Ok(Hiragana::LetterI),
'ぅ' => Ok(Hiragana::LetterSmallU),
'う' => Ok(Hiragana::LetterU),
'ぇ' => Ok(Hiragana::LetterSmallE),
'え' => Ok(Hiragana::LetterE),
'ぉ' => Ok(Hiragana::LetterSmallO),
'お' => Ok(Hiragana::LetterO),
'か' => Ok(Hiragana::LetterKa),
'が' => Ok(Hiragana::LetterGa),
'き' => Ok(Hiragana::LetterKi),
'ぎ' => Ok(Hiragana::LetterGi),
'く' => Ok(Hiragana::LetterKu),
'ぐ' => Ok(Hiragana::LetterGu),
'け' => Ok(Hiragana::LetterKe),
'げ' => Ok(Hiragana::LetterGe),
'こ' => Ok(Hiragana::LetterKo),
'ご' => Ok(Hiragana::LetterGo),
'さ' => Ok(Hiragana::LetterSa),
'ざ' => Ok(Hiragana::LetterZa),
'し' => Ok(Hiragana::LetterSi),
'じ' => Ok(Hiragana::LetterZi),
'す' => Ok(Hiragana::LetterSu),
'ず' => Ok(Hiragana::LetterZu),
'せ' => Ok(Hiragana::LetterSe),
'ぜ' => Ok(Hiragana::LetterZe),
'そ' => Ok(Hiragana::LetterSo),
'ぞ' => Ok(Hiragana::LetterZo),
'た' => Ok(Hiragana::LetterTa),
'だ' => Ok(Hiragana::LetterDa),
'ち' => Ok(Hiragana::LetterTi),
'ぢ' => Ok(Hiragana::LetterDi),
'っ' => Ok(Hiragana::LetterSmallTu),
'つ' => Ok(Hiragana::LetterTu),
'づ' => Ok(Hiragana::LetterDu),
'て' => Ok(Hiragana::LetterTe),
'で' => Ok(Hiragana::LetterDe),
'と' => Ok(Hiragana::LetterTo),
'ど' => Ok(Hiragana::LetterDo),
'な' => Ok(Hiragana::LetterNa),
'に' => Ok(Hiragana::LetterNi),
'ぬ' => Ok(Hiragana::LetterNu),
'ね' => Ok(Hiragana::LetterNe),
'の' => Ok(Hiragana::LetterNo),
'は' => Ok(Hiragana::LetterHa),
'ば' => Ok(Hiragana::LetterBa),
'ぱ' => Ok(Hiragana::LetterPa),
'ひ' => Ok(Hiragana::LetterHi),
'び' => Ok(Hiragana::LetterBi),
'ぴ' => Ok(Hiragana::LetterPi),
'ふ' => Ok(Hiragana::LetterHu),
'ぶ' => Ok(Hiragana::LetterBu),
'ぷ' => Ok(Hiragana::LetterPu),
'へ' => Ok(Hiragana::LetterHe),
'べ' => Ok(Hiragana::LetterBe),
'ぺ' => Ok(Hiragana::LetterPe),
'ほ' => Ok(Hiragana::LetterHo),
'ぼ' => Ok(Hiragana::LetterBo),
'ぽ' => Ok(Hiragana::LetterPo),
'ま' => Ok(Hiragana::LetterMa),
'み' => Ok(Hiragana::LetterMi),
'む' => Ok(Hiragana::LetterMu),
'め' => Ok(Hiragana::LetterMe),
'も' => Ok(Hiragana::LetterMo),
'ゃ' => Ok(Hiragana::LetterSmallYa),
'や' => Ok(Hiragana::LetterYa),
'ゅ' => Ok(Hiragana::LetterSmallYu),
'ゆ' => Ok(Hiragana::LetterYu),
'ょ' => Ok(Hiragana::LetterSmallYo),
'よ' => Ok(Hiragana::LetterYo),
'ら' => Ok(Hiragana::LetterRa),
'り' => Ok(Hiragana::LetterRi),
'る' => Ok(Hiragana::LetterRu),
'れ' => Ok(Hiragana::LetterRe),
'ろ' => Ok(Hiragana::LetterRo),
'ゎ' => Ok(Hiragana::LetterSmallWa),
'わ' => Ok(Hiragana::LetterWa),
'ゐ' => Ok(Hiragana::LetterWi),
'ゑ' => Ok(Hiragana::LetterWe),
'を' => Ok(Hiragana::LetterWo),
'ん' => Ok(Hiragana::LetterN),
'ゔ' => Ok(Hiragana::LetterVu),
'ゕ' => Ok(Hiragana::LetterSmallKa),
'ゖ' => Ok(Hiragana::LetterSmallKe),
'゙' => Ok(Hiragana::CombiningKatakanaDashVoicedSoundMark),
'゚' => Ok(Hiragana::CombiningKatakanaDashSemiDashVoicedSoundMark),
'゛' => Ok(Hiragana::KatakanaDashVoicedSoundMark),
'゜' => Ok(Hiragana::KatakanaDashSemiDashVoicedSoundMark),
'ゝ' => Ok(Hiragana::IterationMark),
'ゞ' => Ok(Hiragana::VoicedIterationMark),
_ => Err(()),
}
}
}
impl Into<u32> for Hiragana {
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 Hiragana {
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 Hiragana {
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 Hiragana {
pub fn new() -> Self {
Hiragana::LetterSmallA
}
pub fn name(&self) -> String {
let s = std::format!("Hiragana{:#?}", self);
string_morph::to_sentence_case(&s)
}
}