open_pql/functions/cast/
to_five_cards.rs

1use super::*;
2
3pub fn to_five_cards(s: &str) -> Result<Card64, RuntimeError> {
4    #[inline]
5    fn parse<S: FnMut(&char) -> bool, T: TryFrom<char>>(
6        s: &str,
7        cs: &mut Filter<Chars<'_>, S>,
8    ) -> Result<T, RuntimeError> {
9        cs.next().map_or_else(
10            || Err(RuntimeError::RateHiHandExpectedFiveCards(s.into())),
11            |c| {
12                c.try_into().map_or_else(
13                    |_| Err(RuntimeError::RateHiHandParseFailed(s.into())),
14                    Ok,
15                )
16            },
17        )
18    }
19
20    #[inline]
21    fn next_card<T: FnMut(&char) -> bool>(
22        s: &str,
23        cs: &mut Filter<Chars<'_>, T>,
24    ) -> Result<Card, RuntimeError> {
25        Ok(Card::new(parse(s, cs)?, parse(s, cs)?))
26    }
27
28    let mut chars = s.chars().filter(|c| !c.is_whitespace());
29
30    let mut c64 = Card64::default();
31
32    c64.set(next_card(s, &mut chars)?);
33    c64.set(next_card(s, &mut chars)?);
34    c64.set(next_card(s, &mut chars)?);
35    c64.set(next_card(s, &mut chars)?);
36    c64.set(next_card(s, &mut chars)?);
37
38    if chars.next().is_some() || c64.count() != 5 {
39        return Err(RuntimeError::RateHiHandExpectedFiveCards(s.into()));
40    }
41
42    Ok(c64)
43}