aya_base/
suit.rs

1use core::{convert::TryFrom, str::FromStr};
2
3use super::card::ParseError;
4
5/// One of the four French playing card suits.
6#[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}