#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Katakana {
DashHiraganaDoubleHyphen,
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,
LetterVa,
LetterVi,
LetterVe,
LetterVo,
MiddleDot,
DashHiraganaProlongedSoundMark,
IterationMark,
VoicedIterationMark,
}
impl Into<char> for Katakana {
fn into(self) -> char {
match self {
Katakana::DashHiraganaDoubleHyphen => '゠',
Katakana::LetterSmallA => 'ァ',
Katakana::LetterA => 'ア',
Katakana::LetterSmallI => 'ィ',
Katakana::LetterI => 'イ',
Katakana::LetterSmallU => 'ゥ',
Katakana::LetterU => 'ウ',
Katakana::LetterSmallE => 'ェ',
Katakana::LetterE => 'エ',
Katakana::LetterSmallO => 'ォ',
Katakana::LetterO => 'オ',
Katakana::LetterKa => 'カ',
Katakana::LetterGa => 'ガ',
Katakana::LetterKi => 'キ',
Katakana::LetterGi => 'ギ',
Katakana::LetterKu => 'ク',
Katakana::LetterGu => 'グ',
Katakana::LetterKe => 'ケ',
Katakana::LetterGe => 'ゲ',
Katakana::LetterKo => 'コ',
Katakana::LetterGo => 'ゴ',
Katakana::LetterSa => 'サ',
Katakana::LetterZa => 'ザ',
Katakana::LetterSi => 'シ',
Katakana::LetterZi => 'ジ',
Katakana::LetterSu => 'ス',
Katakana::LetterZu => 'ズ',
Katakana::LetterSe => 'セ',
Katakana::LetterZe => 'ゼ',
Katakana::LetterSo => 'ソ',
Katakana::LetterZo => 'ゾ',
Katakana::LetterTa => 'タ',
Katakana::LetterDa => 'ダ',
Katakana::LetterTi => 'チ',
Katakana::LetterDi => 'ヂ',
Katakana::LetterSmallTu => 'ッ',
Katakana::LetterTu => 'ツ',
Katakana::LetterDu => 'ヅ',
Katakana::LetterTe => 'テ',
Katakana::LetterDe => 'デ',
Katakana::LetterTo => 'ト',
Katakana::LetterDo => 'ド',
Katakana::LetterNa => 'ナ',
Katakana::LetterNi => 'ニ',
Katakana::LetterNu => 'ヌ',
Katakana::LetterNe => 'ネ',
Katakana::LetterNo => 'ノ',
Katakana::LetterHa => 'ハ',
Katakana::LetterBa => 'バ',
Katakana::LetterPa => 'パ',
Katakana::LetterHi => 'ヒ',
Katakana::LetterBi => 'ビ',
Katakana::LetterPi => 'ピ',
Katakana::LetterHu => 'フ',
Katakana::LetterBu => 'ブ',
Katakana::LetterPu => 'プ',
Katakana::LetterHe => 'ヘ',
Katakana::LetterBe => 'ベ',
Katakana::LetterPe => 'ペ',
Katakana::LetterHo => 'ホ',
Katakana::LetterBo => 'ボ',
Katakana::LetterPo => 'ポ',
Katakana::LetterMa => 'マ',
Katakana::LetterMi => 'ミ',
Katakana::LetterMu => 'ム',
Katakana::LetterMe => 'メ',
Katakana::LetterMo => 'モ',
Katakana::LetterSmallYa => 'ャ',
Katakana::LetterYa => 'ヤ',
Katakana::LetterSmallYu => 'ュ',
Katakana::LetterYu => 'ユ',
Katakana::LetterSmallYo => 'ョ',
Katakana::LetterYo => 'ヨ',
Katakana::LetterRa => 'ラ',
Katakana::LetterRi => 'リ',
Katakana::LetterRu => 'ル',
Katakana::LetterRe => 'レ',
Katakana::LetterRo => 'ロ',
Katakana::LetterSmallWa => 'ヮ',
Katakana::LetterWa => 'ワ',
Katakana::LetterWi => 'ヰ',
Katakana::LetterWe => 'ヱ',
Katakana::LetterWo => 'ヲ',
Katakana::LetterN => 'ン',
Katakana::LetterVu => 'ヴ',
Katakana::LetterSmallKa => 'ヵ',
Katakana::LetterSmallKe => 'ヶ',
Katakana::LetterVa => 'ヷ',
Katakana::LetterVi => 'ヸ',
Katakana::LetterVe => 'ヹ',
Katakana::LetterVo => 'ヺ',
Katakana::MiddleDot => '・',
Katakana::DashHiraganaProlongedSoundMark => 'ー',
Katakana::IterationMark => 'ヽ',
Katakana::VoicedIterationMark => 'ヾ',
}
}
}
impl std::convert::TryFrom<char> for Katakana {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'゠' => Ok(Katakana::DashHiraganaDoubleHyphen),
'ァ' => Ok(Katakana::LetterSmallA),
'ア' => Ok(Katakana::LetterA),
'ィ' => Ok(Katakana::LetterSmallI),
'イ' => Ok(Katakana::LetterI),
'ゥ' => Ok(Katakana::LetterSmallU),
'ウ' => Ok(Katakana::LetterU),
'ェ' => Ok(Katakana::LetterSmallE),
'エ' => Ok(Katakana::LetterE),
'ォ' => Ok(Katakana::LetterSmallO),
'オ' => Ok(Katakana::LetterO),
'カ' => Ok(Katakana::LetterKa),
'ガ' => Ok(Katakana::LetterGa),
'キ' => Ok(Katakana::LetterKi),
'ギ' => Ok(Katakana::LetterGi),
'ク' => Ok(Katakana::LetterKu),
'グ' => Ok(Katakana::LetterGu),
'ケ' => Ok(Katakana::LetterKe),
'ゲ' => Ok(Katakana::LetterGe),
'コ' => Ok(Katakana::LetterKo),
'ゴ' => Ok(Katakana::LetterGo),
'サ' => Ok(Katakana::LetterSa),
'ザ' => Ok(Katakana::LetterZa),
'シ' => Ok(Katakana::LetterSi),
'ジ' => Ok(Katakana::LetterZi),
'ス' => Ok(Katakana::LetterSu),
'ズ' => Ok(Katakana::LetterZu),
'セ' => Ok(Katakana::LetterSe),
'ゼ' => Ok(Katakana::LetterZe),
'ソ' => Ok(Katakana::LetterSo),
'ゾ' => Ok(Katakana::LetterZo),
'タ' => Ok(Katakana::LetterTa),
'ダ' => Ok(Katakana::LetterDa),
'チ' => Ok(Katakana::LetterTi),
'ヂ' => Ok(Katakana::LetterDi),
'ッ' => Ok(Katakana::LetterSmallTu),
'ツ' => Ok(Katakana::LetterTu),
'ヅ' => Ok(Katakana::LetterDu),
'テ' => Ok(Katakana::LetterTe),
'デ' => Ok(Katakana::LetterDe),
'ト' => Ok(Katakana::LetterTo),
'ド' => Ok(Katakana::LetterDo),
'ナ' => Ok(Katakana::LetterNa),
'ニ' => Ok(Katakana::LetterNi),
'ヌ' => Ok(Katakana::LetterNu),
'ネ' => Ok(Katakana::LetterNe),
'ノ' => Ok(Katakana::LetterNo),
'ハ' => Ok(Katakana::LetterHa),
'バ' => Ok(Katakana::LetterBa),
'パ' => Ok(Katakana::LetterPa),
'ヒ' => Ok(Katakana::LetterHi),
'ビ' => Ok(Katakana::LetterBi),
'ピ' => Ok(Katakana::LetterPi),
'フ' => Ok(Katakana::LetterHu),
'ブ' => Ok(Katakana::LetterBu),
'プ' => Ok(Katakana::LetterPu),
'ヘ' => Ok(Katakana::LetterHe),
'ベ' => Ok(Katakana::LetterBe),
'ペ' => Ok(Katakana::LetterPe),
'ホ' => Ok(Katakana::LetterHo),
'ボ' => Ok(Katakana::LetterBo),
'ポ' => Ok(Katakana::LetterPo),
'マ' => Ok(Katakana::LetterMa),
'ミ' => Ok(Katakana::LetterMi),
'ム' => Ok(Katakana::LetterMu),
'メ' => Ok(Katakana::LetterMe),
'モ' => Ok(Katakana::LetterMo),
'ャ' => Ok(Katakana::LetterSmallYa),
'ヤ' => Ok(Katakana::LetterYa),
'ュ' => Ok(Katakana::LetterSmallYu),
'ユ' => Ok(Katakana::LetterYu),
'ョ' => Ok(Katakana::LetterSmallYo),
'ヨ' => Ok(Katakana::LetterYo),
'ラ' => Ok(Katakana::LetterRa),
'リ' => Ok(Katakana::LetterRi),
'ル' => Ok(Katakana::LetterRu),
'レ' => Ok(Katakana::LetterRe),
'ロ' => Ok(Katakana::LetterRo),
'ヮ' => Ok(Katakana::LetterSmallWa),
'ワ' => Ok(Katakana::LetterWa),
'ヰ' => Ok(Katakana::LetterWi),
'ヱ' => Ok(Katakana::LetterWe),
'ヲ' => Ok(Katakana::LetterWo),
'ン' => Ok(Katakana::LetterN),
'ヴ' => Ok(Katakana::LetterVu),
'ヵ' => Ok(Katakana::LetterSmallKa),
'ヶ' => Ok(Katakana::LetterSmallKe),
'ヷ' => Ok(Katakana::LetterVa),
'ヸ' => Ok(Katakana::LetterVi),
'ヹ' => Ok(Katakana::LetterVe),
'ヺ' => Ok(Katakana::LetterVo),
'・' => Ok(Katakana::MiddleDot),
'ー' => Ok(Katakana::DashHiraganaProlongedSoundMark),
'ヽ' => Ok(Katakana::IterationMark),
'ヾ' => Ok(Katakana::VoicedIterationMark),
_ => Err(()),
}
}
}
impl Into<u32> for Katakana {
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 Katakana {
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 Katakana {
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 Katakana {
pub fn new() -> Self {
Katakana::DashHiraganaDoubleHyphen
}
pub fn name(&self) -> String {
let s = std::format!("Katakana{:#?}", self);
string_morph::to_sentence_case(&s)
}
}