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::*;