1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Colour {
    Red,
    Black,
}

#[wasm_bindgen]
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Suit {
    Clubs,
    Hearts,
    Diamonds,
    Spades,
}

impl Suit {
    pub fn colour(self) -> Colour {
        match self {
            Suit::Clubs | Suit::Spades => Colour::Black,
            Suit::Hearts | Suit::Diamonds => Colour::Red,
        }
    }
}

#[wasm_bindgen]
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Rank {
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King,
    Ace,
    Two,
}

pub fn get_suit_array() -> [Suit; 4] {
    [Suit::Clubs, Suit::Hearts, Suit::Diamonds, Suit::Spades]
}

pub fn get_rank_array() -> [Rank; 13] {
    [
        Rank::Three,
        Rank::Four,
        Rank::Five,
        Rank::Six,
        Rank::Seven,
        Rank::Eight,
        Rank::Nine,
        Rank::Ten,
        Rank::Jack,
        Rank::Queen,
        Rank::King,
        Rank::Ace,
        Rank::Two,
    ]
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn colour_can_be_derived_from_suit() {
        assert_eq!(Suit::Clubs.colour(), Colour::Black);
        assert_eq!(Suit::Hearts.colour(), Colour::Red);
        assert_eq!(Suit::Diamonds.colour(), Colour::Red);
        assert_eq!(Suit::Spades.colour(), Colour::Black);
    }
}