Enums in rust
xxxxxxxxxx
// Using ruby as interpreter because highlighting
use rand::Rng;
#[derive(Debug, PartialEq, Eq)]
pub enum Suit {
Heart,
Diamond,
Spade,
Club,
}
#[derive(Debug, PartialEq, Eq)]
pub enum Rank {
Ace,
King,
Queen,
Jack,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
}
impl Suit {
pub fn random() -> Suit {
match rand::thread_rng().gen_range(0, 3) {
0 => Suit::Heart,
1 => Suit::Diamond,
2 => Suit::Spade,
3 => Suit::Club,
_ => unreachable!(),
}
}
// Correct local version. (version on github is incorrect)
pub fn translate(value: u8) -> Suit {
match value {
1 => Suit::Heart,
2 => Suit::Diamond,
3 => Suit::Spade,
4 => Suit::Club,
_ => unreachable!(),
}
}
}
impl Rank {
pub fn random() -> Rank {
match rand::thread_rng().gen_range(0, 13) {
0 => Rank::Ace,
1 => Rank::King,
2 => Rank::Queen,
3 => Rank::Jack,
4 => Rank::Ten,
5 => Rank::Nine,
6 => Rank::Eight,
7 => Rank::Seven,
8 => Rank::Six,
9 => Rank::Five,
10 => Rank::Four,
11 => Rank::Three,
12 => Rank::Two,
_ => unreachable!(),
}
}
// Unused in tests.
pub fn translate(value: u8) -> Rank {
// Correct local version. (version on github is incorrect)
match value {
1 => Rank::Ace,
2 => Rank::Two,
3 => Rank::Three,
4 => Rank::Four,
5 => Rank::Five,
6 => Rank::Six,
7 => Rank::Seven,
8 => Rank::Eight,
9 => Rank::Nine,
10 => Rank::Ten,
11 => Rank::Jack,
12 => Rank::Queen,
13 => Rank::King,
_ => unreachable!(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Card {
pub suit: Suit,
pub rank: Rank,
}
// Correct local version.
pub fn winner_card(card: &Card) -> bool {
match (&card.rank, &card.suit) {
(Rank::Ace, Suit::Spade) => true,
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_winner() {
let winner = Card {
rank: Rank::Ace,
suit: Suit::Spade,
};
for rank in 1..14 {
for suit in 1..5 {
let card = Card {
rank: Rank::translate(rank),
suit: Suit::translate(suit),
};
if card != winner {
assert!(!winner_card(&card), "\n\t{:?} is not the winner", card);
} else {
assert!(winner_card(&card), "\n\t{:?} is the winner", card);
}
}
}
}
Rust code