#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum MahjongTiles {
MahjongTileEastWind,
MahjongTileSouthWind,
MahjongTileWestWind,
MahjongTileNorthWind,
MahjongTileRedDragon,
MahjongTileGreenDragon,
MahjongTileWhiteDragon,
MahjongTileOneOfCharacters,
MahjongTileTwoOfCharacters,
MahjongTileThreeOfCharacters,
MahjongTileFourOfCharacters,
MahjongTileFiveOfCharacters,
MahjongTileSixOfCharacters,
MahjongTileSevenOfCharacters,
MahjongTileEightOfCharacters,
MahjongTileNineOfCharacters,
MahjongTileOneOfBamboos,
MahjongTileTwoOfBamboos,
MahjongTileThreeOfBamboos,
MahjongTileFourOfBamboos,
MahjongTileFiveOfBamboos,
MahjongTileSixOfBamboos,
MahjongTileSevenOfBamboos,
MahjongTileEightOfBamboos,
MahjongTileNineOfBamboos,
MahjongTileOneOfCircles,
MahjongTileTwoOfCircles,
MahjongTileThreeOfCircles,
MahjongTileFourOfCircles,
MahjongTileFiveOfCircles,
MahjongTileSixOfCircles,
MahjongTileSevenOfCircles,
MahjongTileEightOfCircles,
MahjongTileNineOfCircles,
MahjongTilePlum,
MahjongTileOrchid,
MahjongTileBamboo,
MahjongTileChrysanthemum,
MahjongTileSpring,
MahjongTileSummer,
MahjongTileAutumn,
MahjongTileWinter,
MahjongTileJoker,
MahjongTileBack,
}
impl Into<char> for MahjongTiles {
fn into(self) -> char {
match self {
MahjongTiles::MahjongTileEastWind => '🀀',
MahjongTiles::MahjongTileSouthWind => '🀁',
MahjongTiles::MahjongTileWestWind => '🀂',
MahjongTiles::MahjongTileNorthWind => '🀃',
MahjongTiles::MahjongTileRedDragon => '🀄',
MahjongTiles::MahjongTileGreenDragon => '🀅',
MahjongTiles::MahjongTileWhiteDragon => '🀆',
MahjongTiles::MahjongTileOneOfCharacters => '🀇',
MahjongTiles::MahjongTileTwoOfCharacters => '🀈',
MahjongTiles::MahjongTileThreeOfCharacters => '🀉',
MahjongTiles::MahjongTileFourOfCharacters => '🀊',
MahjongTiles::MahjongTileFiveOfCharacters => '🀋',
MahjongTiles::MahjongTileSixOfCharacters => '🀌',
MahjongTiles::MahjongTileSevenOfCharacters => '🀍',
MahjongTiles::MahjongTileEightOfCharacters => '🀎',
MahjongTiles::MahjongTileNineOfCharacters => '🀏',
MahjongTiles::MahjongTileOneOfBamboos => '🀐',
MahjongTiles::MahjongTileTwoOfBamboos => '🀑',
MahjongTiles::MahjongTileThreeOfBamboos => '🀒',
MahjongTiles::MahjongTileFourOfBamboos => '🀓',
MahjongTiles::MahjongTileFiveOfBamboos => '🀔',
MahjongTiles::MahjongTileSixOfBamboos => '🀕',
MahjongTiles::MahjongTileSevenOfBamboos => '🀖',
MahjongTiles::MahjongTileEightOfBamboos => '🀗',
MahjongTiles::MahjongTileNineOfBamboos => '🀘',
MahjongTiles::MahjongTileOneOfCircles => '🀙',
MahjongTiles::MahjongTileTwoOfCircles => '🀚',
MahjongTiles::MahjongTileThreeOfCircles => '🀛',
MahjongTiles::MahjongTileFourOfCircles => '🀜',
MahjongTiles::MahjongTileFiveOfCircles => '🀝',
MahjongTiles::MahjongTileSixOfCircles => '🀞',
MahjongTiles::MahjongTileSevenOfCircles => '🀟',
MahjongTiles::MahjongTileEightOfCircles => '🀠',
MahjongTiles::MahjongTileNineOfCircles => '🀡',
MahjongTiles::MahjongTilePlum => '🀢',
MahjongTiles::MahjongTileOrchid => '🀣',
MahjongTiles::MahjongTileBamboo => '🀤',
MahjongTiles::MahjongTileChrysanthemum => '🀥',
MahjongTiles::MahjongTileSpring => '🀦',
MahjongTiles::MahjongTileSummer => '🀧',
MahjongTiles::MahjongTileAutumn => '🀨',
MahjongTiles::MahjongTileWinter => '🀩',
MahjongTiles::MahjongTileJoker => '🀪',
MahjongTiles::MahjongTileBack => '🀫',
}
}
}
impl std::convert::TryFrom<char> for MahjongTiles {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'🀀' => Ok(MahjongTiles::MahjongTileEastWind),
'🀁' => Ok(MahjongTiles::MahjongTileSouthWind),
'🀂' => Ok(MahjongTiles::MahjongTileWestWind),
'🀃' => Ok(MahjongTiles::MahjongTileNorthWind),
'🀄' => Ok(MahjongTiles::MahjongTileRedDragon),
'🀅' => Ok(MahjongTiles::MahjongTileGreenDragon),
'🀆' => Ok(MahjongTiles::MahjongTileWhiteDragon),
'🀇' => Ok(MahjongTiles::MahjongTileOneOfCharacters),
'🀈' => Ok(MahjongTiles::MahjongTileTwoOfCharacters),
'🀉' => Ok(MahjongTiles::MahjongTileThreeOfCharacters),
'🀊' => Ok(MahjongTiles::MahjongTileFourOfCharacters),
'🀋' => Ok(MahjongTiles::MahjongTileFiveOfCharacters),
'🀌' => Ok(MahjongTiles::MahjongTileSixOfCharacters),
'🀍' => Ok(MahjongTiles::MahjongTileSevenOfCharacters),
'🀎' => Ok(MahjongTiles::MahjongTileEightOfCharacters),
'🀏' => Ok(MahjongTiles::MahjongTileNineOfCharacters),
'🀐' => Ok(MahjongTiles::MahjongTileOneOfBamboos),
'🀑' => Ok(MahjongTiles::MahjongTileTwoOfBamboos),
'🀒' => Ok(MahjongTiles::MahjongTileThreeOfBamboos),
'🀓' => Ok(MahjongTiles::MahjongTileFourOfBamboos),
'🀔' => Ok(MahjongTiles::MahjongTileFiveOfBamboos),
'🀕' => Ok(MahjongTiles::MahjongTileSixOfBamboos),
'🀖' => Ok(MahjongTiles::MahjongTileSevenOfBamboos),
'🀗' => Ok(MahjongTiles::MahjongTileEightOfBamboos),
'🀘' => Ok(MahjongTiles::MahjongTileNineOfBamboos),
'🀙' => Ok(MahjongTiles::MahjongTileOneOfCircles),
'🀚' => Ok(MahjongTiles::MahjongTileTwoOfCircles),
'🀛' => Ok(MahjongTiles::MahjongTileThreeOfCircles),
'🀜' => Ok(MahjongTiles::MahjongTileFourOfCircles),
'🀝' => Ok(MahjongTiles::MahjongTileFiveOfCircles),
'🀞' => Ok(MahjongTiles::MahjongTileSixOfCircles),
'🀟' => Ok(MahjongTiles::MahjongTileSevenOfCircles),
'🀠' => Ok(MahjongTiles::MahjongTileEightOfCircles),
'🀡' => Ok(MahjongTiles::MahjongTileNineOfCircles),
'🀢' => Ok(MahjongTiles::MahjongTilePlum),
'🀣' => Ok(MahjongTiles::MahjongTileOrchid),
'🀤' => Ok(MahjongTiles::MahjongTileBamboo),
'🀥' => Ok(MahjongTiles::MahjongTileChrysanthemum),
'🀦' => Ok(MahjongTiles::MahjongTileSpring),
'🀧' => Ok(MahjongTiles::MahjongTileSummer),
'🀨' => Ok(MahjongTiles::MahjongTileAutumn),
'🀩' => Ok(MahjongTiles::MahjongTileWinter),
'🀪' => Ok(MahjongTiles::MahjongTileJoker),
'🀫' => Ok(MahjongTiles::MahjongTileBack),
_ => Err(()),
}
}
}
impl Into<u32> for MahjongTiles {
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 MahjongTiles {
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 MahjongTiles {
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 MahjongTiles {
pub fn new() -> Self {
MahjongTiles::MahjongTileEastWind
}
pub fn name(&self) -> String {
let s = std::format!("MahjongTiles{:#?}", self);
string_morph::to_sentence_case(&s)
}
}