#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum CJKStrokes {
CjkStrokeT,
CjkStrokeWg,
CjkStrokeXg,
CjkStrokeBxg,
CjkStrokeSw,
CjkStrokeHzz,
CjkStrokeHzg,
CjkStrokeHp,
CjkStrokeHzwg,
CjkStrokeSzwg,
CjkStrokeHzt,
CjkStrokeHzzp,
CjkStrokeHpwg,
CjkStrokeHzw,
CjkStrokeHzzz,
CjkStrokeN,
CjkStrokeH,
CjkStrokeS,
CjkStrokeP,
CjkStrokeSp,
CjkStrokeD,
CjkStrokeHz,
CjkStrokeHg,
CjkStrokeSz,
CjkStrokeSwz,
CjkStrokeSt,
CjkStrokeSg,
CjkStrokePd,
CjkStrokePz,
CjkStrokeTn,
CjkStrokeSzz,
CjkStrokeSwg,
CjkStrokeHxwg,
CjkStrokeHzzzg,
CjkStrokePg,
CjkStrokeQ,
}
impl Into<char> for CJKStrokes {
fn into(self) -> char {
match self {
CJKStrokes::CjkStrokeT => '㇀',
CJKStrokes::CjkStrokeWg => '㇁',
CJKStrokes::CjkStrokeXg => '㇂',
CJKStrokes::CjkStrokeBxg => '㇃',
CJKStrokes::CjkStrokeSw => '㇄',
CJKStrokes::CjkStrokeHzz => '㇅',
CJKStrokes::CjkStrokeHzg => '㇆',
CJKStrokes::CjkStrokeHp => '㇇',
CJKStrokes::CjkStrokeHzwg => '㇈',
CJKStrokes::CjkStrokeSzwg => '㇉',
CJKStrokes::CjkStrokeHzt => '㇊',
CJKStrokes::CjkStrokeHzzp => '㇋',
CJKStrokes::CjkStrokeHpwg => '㇌',
CJKStrokes::CjkStrokeHzw => '㇍',
CJKStrokes::CjkStrokeHzzz => '㇎',
CJKStrokes::CjkStrokeN => '㇏',
CJKStrokes::CjkStrokeH => '㇐',
CJKStrokes::CjkStrokeS => '㇑',
CJKStrokes::CjkStrokeP => '㇒',
CJKStrokes::CjkStrokeSp => '㇓',
CJKStrokes::CjkStrokeD => '㇔',
CJKStrokes::CjkStrokeHz => '㇕',
CJKStrokes::CjkStrokeHg => '㇖',
CJKStrokes::CjkStrokeSz => '㇗',
CJKStrokes::CjkStrokeSwz => '㇘',
CJKStrokes::CjkStrokeSt => '㇙',
CJKStrokes::CjkStrokeSg => '㇚',
CJKStrokes::CjkStrokePd => '㇛',
CJKStrokes::CjkStrokePz => '㇜',
CJKStrokes::CjkStrokeTn => '㇝',
CJKStrokes::CjkStrokeSzz => '㇞',
CJKStrokes::CjkStrokeSwg => '㇟',
CJKStrokes::CjkStrokeHxwg => '㇠',
CJKStrokes::CjkStrokeHzzzg => '㇡',
CJKStrokes::CjkStrokePg => '㇢',
CJKStrokes::CjkStrokeQ => '㇣',
}
}
}
impl std::convert::TryFrom<char> for CJKStrokes {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'㇀' => Ok(CJKStrokes::CjkStrokeT),
'㇁' => Ok(CJKStrokes::CjkStrokeWg),
'㇂' => Ok(CJKStrokes::CjkStrokeXg),
'㇃' => Ok(CJKStrokes::CjkStrokeBxg),
'㇄' => Ok(CJKStrokes::CjkStrokeSw),
'㇅' => Ok(CJKStrokes::CjkStrokeHzz),
'㇆' => Ok(CJKStrokes::CjkStrokeHzg),
'㇇' => Ok(CJKStrokes::CjkStrokeHp),
'㇈' => Ok(CJKStrokes::CjkStrokeHzwg),
'㇉' => Ok(CJKStrokes::CjkStrokeSzwg),
'㇊' => Ok(CJKStrokes::CjkStrokeHzt),
'㇋' => Ok(CJKStrokes::CjkStrokeHzzp),
'㇌' => Ok(CJKStrokes::CjkStrokeHpwg),
'㇍' => Ok(CJKStrokes::CjkStrokeHzw),
'㇎' => Ok(CJKStrokes::CjkStrokeHzzz),
'㇏' => Ok(CJKStrokes::CjkStrokeN),
'㇐' => Ok(CJKStrokes::CjkStrokeH),
'㇑' => Ok(CJKStrokes::CjkStrokeS),
'㇒' => Ok(CJKStrokes::CjkStrokeP),
'㇓' => Ok(CJKStrokes::CjkStrokeSp),
'㇔' => Ok(CJKStrokes::CjkStrokeD),
'㇕' => Ok(CJKStrokes::CjkStrokeHz),
'㇖' => Ok(CJKStrokes::CjkStrokeHg),
'㇗' => Ok(CJKStrokes::CjkStrokeSz),
'㇘' => Ok(CJKStrokes::CjkStrokeSwz),
'㇙' => Ok(CJKStrokes::CjkStrokeSt),
'㇚' => Ok(CJKStrokes::CjkStrokeSg),
'㇛' => Ok(CJKStrokes::CjkStrokePd),
'㇜' => Ok(CJKStrokes::CjkStrokePz),
'㇝' => Ok(CJKStrokes::CjkStrokeTn),
'㇞' => Ok(CJKStrokes::CjkStrokeSzz),
'㇟' => Ok(CJKStrokes::CjkStrokeSwg),
'㇠' => Ok(CJKStrokes::CjkStrokeHxwg),
'㇡' => Ok(CJKStrokes::CjkStrokeHzzzg),
'㇢' => Ok(CJKStrokes::CjkStrokePg),
'㇣' => Ok(CJKStrokes::CjkStrokeQ),
_ => Err(()),
}
}
}
impl Into<u32> for CJKStrokes {
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 CJKStrokes {
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 CJKStrokes {
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 CJKStrokes {
pub fn new() -> Self {
CJKStrokes::CjkStrokeT
}
pub fn name(&self) -> String {
let s = std::format!("CJKStrokes{:#?}", self);
string_morph::to_sentence_case(&s)
}
}