Mercurial > lbo > hg > rcombinators
changeset 16:9ad913fdbef1
Implement Maybe parser
author | Lewin Bormann <lewin@lewin-bormann.info> |
---|---|
date | Mon, 03 Jun 2019 23:51:15 +0200 |
parents | 36e01274a263 |
children | 0427da45a728 |
files | src/combinators.rs |
diffstat | 1 files changed, 24 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/combinators.rs Mon Jun 03 23:14:25 2019 +0200 +++ b/src/combinators.rs Mon Jun 03 23:51:15 2019 +0200 @@ -302,6 +302,30 @@ } } +/// Maybe is a combinator returning Option<T> for a parser returning T, meaning it does not stop +/// parsing if an optional input was not encountered. It is very similar to a `Repeat` parser with +/// `RepeatSpec::Max(1)`. +pub struct Maybe<Inner: Parser> { + inner: Inner +} + +impl<Inner: Parser> Maybe<Inner> { + pub fn new(p: Inner) -> Maybe<Inner> { + Maybe { inner: p } + } +} + +impl<R, P: Parser<Result=R>> Parser for Maybe<P> { + type Result = Option<R>; + fn parse(&mut self, st: &mut ParseState<impl Iterator<Item=char>>) -> ParseResult<Self::Result> { + match self.inner.parse(st) { + Ok(r) => Ok(Some(r)), + Err(_) => Ok(None), + } + } +} + + #[cfg(test)] mod tests { use super::*;