use std::error::Error;
use strum_macros::EnumIter;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, EnumIter)]
pub enum Suit {
Club,
Diamond,
Heart,
Spade,
}
impl Suit {
pub fn new_from_str(s: &str) -> Result<Self, Box<dyn Error>> {
match s {
"h" => Ok(Suit::Heart),
"d" => Ok(Suit::Diamond),
"c" => Ok(Suit::Club),
"s" => Ok(Suit::Spade),
_ => Err("Invalid suit identifier".into()),
}
}
pub fn new_from_num(num: usize) -> Result<Self, Box<dyn Error>> {
match num {
0 => Ok(Suit::Club),
1 => Ok(Suit::Diamond),
2 => Ok(Suit::Heart),
3 => Ok(Suit::Spade),
_ => Err(format!("Invalid numerical value for Suit: {}", num).into()),
}
}
pub fn as_str(&self) -> &'static str {
match self {
Suit::Heart => "h",
Suit::Diamond => "d",
Suit::Club => "c",
Suit::Spade => "s",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn valid_suit_from_string() {
assert_eq!(Suit::new_from_str("h").unwrap(), Suit::Heart);
assert_eq!(Suit::new_from_str("d").unwrap(), Suit::Diamond);
assert_eq!(Suit::new_from_str("c").unwrap(), Suit::Club);
assert_eq!(Suit::new_from_str("s").unwrap(), Suit::Spade);
}
#[test]
fn invalid_suit_from_str() {
assert!(Suit::new_from_str("x").is_err());
}
}