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}