ckc_rs/
parse.rs

1use crate::{CKCNumber, CardRank, CardSuit, PokerCard};
2
3#[must_use]
4pub fn five_from_index(index: &str) -> Option<[CKCNumber; 5]> {
5    let mut esses = index.split_whitespace();
6
7    let first = CKCNumber::from_index(esses.next()?);
8    let second = CKCNumber::from_index(esses.next()?);
9    let third = CKCNumber::from_index(esses.next()?);
10    let forth = CKCNumber::from_index(esses.next()?);
11    let fifth = CKCNumber::from_index(esses.next()?);
12    let hand: [CKCNumber; 5] = [first, second, third, forth, fifth];
13    Some(hand)
14}
15
16#[must_use]
17pub fn get_rank_and_suit(index: &str) -> (CardRank, CardSuit) {
18    let mut chars = index.chars();
19    let rank: CardRank = match chars.next() {
20        None => return (CardRank::BLANK, CardSuit::BLANK),
21        Some(r) => CardRank::from_char(r),
22    };
23    let suit: CardSuit = match chars.next() {
24        None => return (CardRank::BLANK, CardSuit::BLANK),
25        Some(s) => CardSuit::from_char(s),
26    };
27    (rank, suit)
28}
29
30#[cfg(test)]
31mod parse_tests {
32    use super::*;
33    use rstest::rstest;
34
35    #[rstest]
36    #[case("A♠", CardRank::ACE, CardSuit::SPADES)]
37    #[case("a♠", CardRank::ACE, CardSuit::SPADES)]
38    #[case("AS", CardRank::ACE, CardSuit::SPADES)]
39    #[case("As", CardRank::ACE, CardSuit::SPADES)]
40    fn get_rank_and_suits(#[case] index: &str, #[case] rank: CardRank, #[case] suit: CardSuit) {
41        let (actual_rank, actual_suit) = get_rank_and_suit(index);
42        assert_eq!(rank, actual_rank);
43        assert_eq!(suit, actual_suit);
44    }
45}