open_pql/functions/cast/
to_five_cards.rs1use 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}