Skip to main content

oni_comb_parser/primitive/
satisfy.rs

1use core::marker::PhantomData;
2
3use crate::error::ParseError;
4use crate::fail::{Fail, PResult};
5use crate::input::Input;
6use crate::parser::Parser;
7
8pub struct Satisfy<F, I: Input>(F, PhantomData<fn(&mut I)>);
9
10pub fn satisfy<I: Input, F: FnMut(I::Token) -> bool>(f: F) -> Satisfy<F, I> {
11  Satisfy(f, PhantomData)
12}
13
14impl<I: Input, F> Parser<I> for Satisfy<F, I>
15where
16  F: FnMut(I::Token) -> bool,
17{
18  type Error = ParseError;
19  type Output = I::Token;
20
21  #[inline]
22  fn parse_next(&mut self, input: &mut I) -> PResult<I::Token, ParseError> {
23    let pos = input.offset();
24    match input.peek_token() {
25      Some(t) if (self.0)(t) => {
26        input.next_token();
27        Ok(t)
28      }
29      _ => Err(Fail::Backtrack(ParseError::expected_description(pos, "satisfy"))),
30    }
31  }
32}