use std::convert::TryFrom;
use std::fmt;
use std::fmt::{Debug, Display, Formatter};
use super::{Color, Colour};
#[derive(Clone, Copy, Eq, PartialEq, Hash)]
pub enum Suit {
Club = 0,
Spade = 1,
Heart = 2,
Diamond = 3,
}
impl Suit {
pub fn colour(self) -> Colour {
match self {
Suit::Club => Colour::Black,
Suit::Spade => Colour::Black,
Suit::Heart => Colour::Red,
Suit::Diamond => Colour::Red,
}
}
pub fn color(self) -> Color {
self.colour()
}
}
impl Display for Suit {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let name = match self {
Suit::Club => "Club",
Suit::Spade => "Spade",
Suit::Heart => "Heart",
Suit::Diamond => "Diamond",
};
write!(f, "{}", name)
}
}
impl Debug for Suit {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let name = match self {
Suit::Club => "C",
Suit::Spade => "S",
Suit::Heart => "H",
Suit::Diamond => "D",
};
write!(f, "{}", name)
}
}
impl TryFrom<String> for Suit {
type Error = String;
fn try_from(string: String) -> Result<Suit, Self::Error> {
match string.to_lowercase().trim() {
"club" => Ok(Suit::Club),
"clubs" => Ok(Suit::Club),
"c" => Ok(Suit::Club),
"spade" => Ok(Suit::Spade),
"spades" => Ok(Suit::Spade),
"s" => Ok(Suit::Spade),
"heart" => Ok(Suit::Heart),
"hearts" => Ok(Suit::Heart),
"h" => Ok(Suit::Heart),
"diamond" => Ok(Suit::Diamond),
"diamonds" => Ok(Suit::Diamond),
"d" => Ok(Suit::Diamond),
_ => Err(format!("Suit \"{}\" does not match any of \"C[lub[s]]\", \"S[pade[s]]\", \"H[eart[s]]\", \"D[iamond[s]]\" (case-insensitive)", string)),
}
}
}
impl TryFrom<&str> for Suit {
type Error = String;
fn try_from(string: &str) -> Result<Suit, Self::Error> {
Suit::try_from(string.to_string())
}
}