oni_comb_parser/text/
satisfy.rs1use crate::error::ParseError;
2use crate::fail::{Fail, PResult};
3use crate::input::Input;
4use crate::parser::Parser;
5use crate::str_input::StrInput;
6
7pub struct Satisfy<F>(F);
8
9pub fn satisfy<F: FnMut(char) -> bool>(f: F) -> Satisfy<F> {
10 Satisfy(f)
11}
12
13impl<'a, F> Parser<StrInput<'a>> for Satisfy<F>
14where
15 F: FnMut(char) -> bool,
16{
17 type Error = ParseError;
18 type Output = char;
19
20 #[inline]
21 fn parse_next(&mut self, input: &mut StrInput<'a>) -> PResult<char, ParseError> {
22 let pos = input.offset();
23 let remaining = input.as_str();
24 match remaining.chars().next() {
25 Some(c) if (self.0)(c) => {
26 input.advance(c.len_utf8());
27 Ok(c)
28 }
29 _ => Err(Fail::Backtrack(ParseError::expected_description(pos, "satisfy"))),
30 }
31 }
32}