oni_comb_parser/combinator/
optional.rs1use crate::fail::{Fail, PResult};
2use crate::input::Input;
3use crate::parser::Parser;
4
5pub struct Optional<P> {
6 pub(crate) parser: P,
7}
8
9impl<I, P> Parser<I> for Optional<P>
10where
11 I: Input,
12 P: Parser<I>,
13{
14 type Error = P::Error;
15 type Output = Option<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(Some(v)),
22 Err(Fail::Backtrack(_)) => {
23 input.reset(cp);
24 Ok(None)
25 }
26 Err(Fail::Cut(e)) => Err(Fail::Cut(e)),
27 Err(Fail::Incomplete) => Err(Fail::Incomplete),
28 Err(Fail::ZeroProgress) => Err(Fail::ZeroProgress),
29 }
30 }
31}