use std::{
convert::TryFrom,
fmt::{self, Write},
};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum Suit {
Clubs,
Hearts,
Spades,
Diamonds,
}
impl Suit {
pub(crate) const ALL_VARIANTS: &[Self] =
&[Self::Clubs, Self::Hearts, Self::Spades, Self::Diamonds];
pub const fn as_pretty_char(self) -> char {
use Suit::*;
match self {
Spades => '\u{2660}', Hearts => '\u{2665}', Clubs => '\u{2663}', Diamonds => '\u{2666}', }
}
pub const fn as_char(self) -> char {
use Suit::*;
match self {
Clubs => 'c',
Hearts => 'h',
Spades => 's',
Diamonds => 'd',
}
}
pub(super) const fn as_i32(self) -> i32 {
use Suit::*;
match self {
Clubs => 8,
Hearts => 2,
Spades => 1,
Diamonds => 4,
}
}
pub(super) const fn from_i32(val: i32) -> Self {
use Suit::*;
match val {
0b1000 => Clubs,
0b0100 => Diamonds,
0b0010 => Hearts,
0b0001 => Spades,
_ => unreachable!(),
}
}
}
impl TryFrom<char> for Suit {
type Error = char;
fn try_from(value: char) -> Result<Self, Self::Error> {
use Suit::*;
match value {
's' => Ok(Spades),
'c' => Ok(Clubs),
'h' => Ok(Hearts),
'd' => Ok(Diamonds),
x => Err(x),
}
}
}
impl fmt::Display for Suit {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_char(self.as_pretty_char()) }
}