use std::fmt::Display;
use strum::{EnumIter, FromRepr};
use crate::core::{Card, Suit};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ItalianCard {
rank: ItalianRank,
suit: Suit,
}
impl ItalianCard {
pub fn new(rank: ItalianRank, suit: Suit) -> Self {
Self { rank, suit }
}
pub fn rank(&self) -> ItalianRank {
self.rank
}
pub fn suit(&self) -> Suit {
self.suit
}
}
impl Default for ItalianCard {
fn default() -> Self {
ItalianCard {
rank: ItalianRank::Ace,
suit: Suit::Clubs,
}
}
}
impl Display for ItalianCard {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}{}", self.rank as u8, self.suit)
}
}
impl Card for ItalianCard {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, EnumIter, FromRepr, Hash)]
#[repr(u8)]
pub enum ItalianRank {
Ace = 1,
Two,
Three,
Four,
Five,
Six,
Seven,
Jack,
Knight,
King,
}
#[cfg(test)]
pub mod test_utils {
use super::ItalianRank;
use proptest::prelude::*;
pub fn italian_rank_strategy() -> impl Strategy<Value = ItalianRank> {
prop_oneof![
Just(ItalianRank::Ace),
Just(ItalianRank::Two),
Just(ItalianRank::Three),
Just(ItalianRank::Four),
Just(ItalianRank::Five),
Just(ItalianRank::Six),
Just(ItalianRank::Seven),
Just(ItalianRank::Jack),
Just(ItalianRank::Knight),
Just(ItalianRank::King),
]
}
pub fn italian_card_strategy() -> impl Strategy<Value = super::ItalianCard> {
(
italian_rank_strategy(),
prop_oneof![
Just(super::super::Suit::Hearts),
Just(super::super::Suit::Clubs),
Just(super::super::Suit::Spades),
Just(super::super::Suit::Diamonds),
],
)
.prop_map(|(rank, suit)| super::ItalianCard::new(rank, suit))
}
}