Skip to main content

oni_comb_parser/combinator/
attempt.rs

1use crate::fail::{Fail, PResult};
2use crate::input::Input;
3use crate::parser::Parser;
4
5pub struct Attempt<P> {
6  pub(crate) parser: P,
7}
8
9impl<I, P> Parser<I> for Attempt<P>
10where
11  I: Input,
12  P: Parser<I>,
13{
14  type Error = P::Error;
15  type Output = P::Output;
16
17  #[inline]
18  fn parse_next(&mut self, input: &mut I) -> PResult<Self::Output, Self::Error> {
19    let cp = input.checkpoint();
20    match self.parser.parse_next(input) {
21      Ok(v) => Ok(v),
22      Err(Fail::Cut(e)) => {
23        input.reset(cp);
24        Err(Fail::Backtrack(e))
25      }
26      Err(Fail::Backtrack(e)) => {
27        input.reset(cp);
28        Err(Fail::Backtrack(e))
29      }
30      Err(Fail::Incomplete) => Err(Fail::Incomplete),
31      Err(Fail::ZeroProgress) => Err(Fail::ZeroProgress),
32    }
33  }
34}