#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Shavian {
LetterPeep,
LetterTot,
LetterKick,
LetterFee,
LetterThigh,
LetterSo,
LetterSure,
LetterChurch,
LetterYea,
LetterHung,
LetterBib,
LetterDead,
LetterGag,
LetterVow,
LetterThey,
LetterZoo,
LetterMeasure,
LetterJudge,
LetterWoe,
LetterHaDashHa,
LetterLoll,
LetterMime,
LetterIf,
LetterEgg,
LetterAsh,
LetterAdo,
LetterOn,
LetterWool,
LetterOut,
LetterAh,
LetterRoar,
LetterNun,
LetterEat,
LetterAge,
LetterIce,
LetterUp,
LetterOak,
LetterOoze,
LetterOil,
LetterAwe,
LetterAre,
LetterOr,
LetterAir,
LetterErr,
LetterArray,
LetterEar,
LetterIan,
}
impl Into<char> for Shavian {
fn into(self) -> char {
match self {
Shavian::LetterPeep => '𐑐',
Shavian::LetterTot => '𐑑',
Shavian::LetterKick => '𐑒',
Shavian::LetterFee => '𐑓',
Shavian::LetterThigh => '𐑔',
Shavian::LetterSo => '𐑕',
Shavian::LetterSure => '𐑖',
Shavian::LetterChurch => '𐑗',
Shavian::LetterYea => '𐑘',
Shavian::LetterHung => '𐑙',
Shavian::LetterBib => '𐑚',
Shavian::LetterDead => '𐑛',
Shavian::LetterGag => '𐑜',
Shavian::LetterVow => '𐑝',
Shavian::LetterThey => '𐑞',
Shavian::LetterZoo => '𐑟',
Shavian::LetterMeasure => '𐑠',
Shavian::LetterJudge => '𐑡',
Shavian::LetterWoe => '𐑢',
Shavian::LetterHaDashHa => '𐑣',
Shavian::LetterLoll => '𐑤',
Shavian::LetterMime => '𐑥',
Shavian::LetterIf => '𐑦',
Shavian::LetterEgg => '𐑧',
Shavian::LetterAsh => '𐑨',
Shavian::LetterAdo => '𐑩',
Shavian::LetterOn => '𐑪',
Shavian::LetterWool => '𐑫',
Shavian::LetterOut => '𐑬',
Shavian::LetterAh => '𐑭',
Shavian::LetterRoar => '𐑮',
Shavian::LetterNun => '𐑯',
Shavian::LetterEat => '𐑰',
Shavian::LetterAge => '𐑱',
Shavian::LetterIce => '𐑲',
Shavian::LetterUp => '𐑳',
Shavian::LetterOak => '𐑴',
Shavian::LetterOoze => '𐑵',
Shavian::LetterOil => '𐑶',
Shavian::LetterAwe => '𐑷',
Shavian::LetterAre => '𐑸',
Shavian::LetterOr => '𐑹',
Shavian::LetterAir => '𐑺',
Shavian::LetterErr => '𐑻',
Shavian::LetterArray => '𐑼',
Shavian::LetterEar => '𐑽',
Shavian::LetterIan => '𐑾',
}
}
}
impl std::convert::TryFrom<char> for Shavian {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'𐑐' => Ok(Shavian::LetterPeep),
'𐑑' => Ok(Shavian::LetterTot),
'𐑒' => Ok(Shavian::LetterKick),
'𐑓' => Ok(Shavian::LetterFee),
'𐑔' => Ok(Shavian::LetterThigh),
'𐑕' => Ok(Shavian::LetterSo),
'𐑖' => Ok(Shavian::LetterSure),
'𐑗' => Ok(Shavian::LetterChurch),
'𐑘' => Ok(Shavian::LetterYea),
'𐑙' => Ok(Shavian::LetterHung),
'𐑚' => Ok(Shavian::LetterBib),
'𐑛' => Ok(Shavian::LetterDead),
'𐑜' => Ok(Shavian::LetterGag),
'𐑝' => Ok(Shavian::LetterVow),
'𐑞' => Ok(Shavian::LetterThey),
'𐑟' => Ok(Shavian::LetterZoo),
'𐑠' => Ok(Shavian::LetterMeasure),
'𐑡' => Ok(Shavian::LetterJudge),
'𐑢' => Ok(Shavian::LetterWoe),
'𐑣' => Ok(Shavian::LetterHaDashHa),
'𐑤' => Ok(Shavian::LetterLoll),
'𐑥' => Ok(Shavian::LetterMime),
'𐑦' => Ok(Shavian::LetterIf),
'𐑧' => Ok(Shavian::LetterEgg),
'𐑨' => Ok(Shavian::LetterAsh),
'𐑩' => Ok(Shavian::LetterAdo),
'𐑪' => Ok(Shavian::LetterOn),
'𐑫' => Ok(Shavian::LetterWool),
'𐑬' => Ok(Shavian::LetterOut),
'𐑭' => Ok(Shavian::LetterAh),
'𐑮' => Ok(Shavian::LetterRoar),
'𐑯' => Ok(Shavian::LetterNun),
'𐑰' => Ok(Shavian::LetterEat),
'𐑱' => Ok(Shavian::LetterAge),
'𐑲' => Ok(Shavian::LetterIce),
'𐑳' => Ok(Shavian::LetterUp),
'𐑴' => Ok(Shavian::LetterOak),
'𐑵' => Ok(Shavian::LetterOoze),
'𐑶' => Ok(Shavian::LetterOil),
'𐑷' => Ok(Shavian::LetterAwe),
'𐑸' => Ok(Shavian::LetterAre),
'𐑹' => Ok(Shavian::LetterOr),
'𐑺' => Ok(Shavian::LetterAir),
'𐑻' => Ok(Shavian::LetterErr),
'𐑼' => Ok(Shavian::LetterArray),
'𐑽' => Ok(Shavian::LetterEar),
'𐑾' => Ok(Shavian::LetterIan),
_ => Err(()),
}
}
}
impl Into<u32> for Shavian {
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 Shavian {
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 Shavian {
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 Shavian {
pub fn new() -> Self {
Shavian::LetterPeep
}
pub fn name(&self) -> String {
let s = std::format!("Shavian{:#?}", self);
string_morph::to_sentence_case(&s)
}
}