1use core::{convert::TryFrom, str::FromStr};
2
3use super::card::ParseError;
4
5#[derive(PartialEq, Eq, Debug)]
7pub enum Suit {
8 Clubs = 0,
9 Diamonds,
10 Hearts,
11 Spades,
12}
13
14impl TryFrom<u8> for Suit {
15 type Error = ParseError;
16
17 fn try_from(value: u8) -> Result<Self, Self::Error> {
18 match value {
19 0 => Ok(Suit::Clubs),
20 1 => Ok(Suit::Diamonds),
21 2 => Ok(Suit::Hearts),
22 3 => Ok(Suit::Spades),
23 _ => Err(ParseError),
24 }
25 }
26}
27
28impl FromStr for Suit {
29 type Err = ParseError;
30
31 fn from_str(s: &str) -> Result<Self, ParseError> {
32 match s {
33 "c" | "♣" => Ok(Suit::Clubs),
34 "d" | "♦" => Ok(Suit::Diamonds),
35 "h" | "♥" => Ok(Suit::Hearts),
36 "s" | "♠" => Ok(Suit::Spades),
37 _ => Err(ParseError),
38 }
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45 use rstest::*;
46
47 #[rstest]
48 #[case("c", Ok(Suit::Clubs))]
49 #[case("h", Ok(Suit::Hearts))]
50 #[case("♦", Ok(Suit::Diamonds))]
51 #[case("♠", Ok(Suit::Spades))]
52 #[case("a", Err(ParseError))]
53 #[case("H", Err(ParseError))]
54 fn parse(#[case] s: &str, #[case] expected: Result<Suit, ParseError>) {
55 let result = s.parse::<Suit>();
56 assert_eq!(result, expected);
57 }
58}