use std::error::Error;
use super::Rank;
use super::Suit;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Card {
pub rank: Rank,
pub suit: Suit,
}
impl Card {
pub fn new(rank: Rank, suit: Suit) -> Self {
Self { rank, suit }
}
pub fn new_from_str(s: &str) -> Result<Self, Box<dyn Error>> {
if s.len() != 2 {
return Err("Card string must be of length 2".into());
}
let rank = Rank::new_from_str(&s[0..1])?;
let suit = Suit::new_from_str(&s[1..2])?;
Ok(Self { rank, suit })
}
pub fn as_str(&self) -> String {
format!("{}{}", self.rank.as_str(), self.suit.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_card_from_string() {
let card = Card::new_from_str("Ac").unwrap();
assert_eq!(
card,
Card {
rank: Rank::Ace,
suit: Suit::Club
}
);
let card = Card::new_from_str("Td").unwrap();
assert_eq!(
card,
Card {
rank: Rank::Ten,
suit: Suit::Diamond
}
);
let card = Card::new_from_str("3s").unwrap();
assert_eq!(
card,
Card {
rank: Rank::Three,
suit: Suit::Spade
}
);
}
#[test]
fn new_card_from_invalid_string() {
assert!(Card::new_from_str("AcA").is_err());
assert!(Card::new_from_str("M").is_err());
assert!(Card::new_from_str("As1").is_err());
assert!(Card::new_from_str("1c").is_err());
assert!(Card::new_from_str("").is_err());
}
}