use std::fmt;
use serde::{Serialize, Deserialize};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Suit {
Clubs,
Diamonds,
Hearts,
Spades,
}
impl fmt::Display for Suit {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Suit::Clubs => write!(f, "♣"),
Suit::Diamonds => write!(f, "♦"),
Suit::Hearts => write!(f, "♥"),
Suit::Spades => write!(f, "♠"),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum Rank {
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
Ace,
}
impl Rank {
pub fn value(&self) -> u8 {
match self {
Rank::Two => 2,
Rank::Three => 3,
Rank::Four => 4,
Rank::Five => 5,
Rank::Six => 6,
Rank::Seven => 7,
Rank::Eight => 8,
Rank::Nine => 9,
Rank::Ten => 10,
Rank::Jack => 11,
Rank::Queen => 12,
Rank::King => 13,
Rank::Ace => 14,
}
}
}
impl fmt::Display for Rank {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Rank::Two => write!(f, "2"),
Rank::Three => write!(f, "3"),
Rank::Four => write!(f, "4"),
Rank::Five => write!(f, "5"),
Rank::Six => write!(f, "6"),
Rank::Seven => write!(f, "7"),
Rank::Eight => write!(f, "8"),
Rank::Nine => write!(f, "9"),
Rank::Ten => write!(f, "T"),
Rank::Jack => write!(f, "J"),
Rank::Queen => write!(f, "Q"),
Rank::King => write!(f, "K"),
Rank::Ace => write!(f, "A"),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Card {
pub rank: Rank,
pub suit: Suit,
}
impl Card {
pub fn new(rank: Rank, suit: Suit) -> Self {
Self { rank, suit }
}
pub fn from_string(s: &str) -> Option<Self> {
if s.len() < 2 {
return None;
}
let rank = match s.chars().next().unwrap() {
'2' => Rank::Two,
'3' => Rank::Three,
'4' => Rank::Four,
'5' => Rank::Five,
'6' => Rank::Six,
'7' => Rank::Seven,
'8' => Rank::Eight,
'9' => Rank::Nine,
'T' | 't' => Rank::Ten,
'J' | 'j' => Rank::Jack,
'Q' | 'q' => Rank::Queen,
'K' | 'k' => Rank::King,
'A' | 'a' => Rank::Ace,
_ => return None,
};
let suit = match s.chars().nth(1).unwrap() {
'c' | 'C' => Suit::Clubs,
'd' | 'D' => Suit::Diamonds,
'h' | 'H' => Suit::Hearts,
's' | 'S' => Suit::Spades,
_ => return None,
};
Some(Card::new(rank, suit))
}
}
impl fmt::Display for Card {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}{}", self.rank, self.suit)
}
}