Macro abortable_parser::do_each
source · macro_rules! do_each {
($i:expr, $val:ident => $f:ident) => { ... };
($i:expr, $val:ident => $f:ident!($( $args:tt )* ), $($rest:tt)* ) => { ... };
($i:expr, _ => $f:ident!($( $args:tt )* ), $($rest:tt)* ) => { ... };
($i:expr, $val:ident => $f:ident, $($rest:tt)* ) => { ... };
($i:expr, _ => $f:ident, $($rest:tt)* ) => { ... };
($i:expr, ( $($rest:tt)* ) ) => { ... };
}
Expand description
Captures a sequence of sub parsers output.
use abortable_parser::iter;
let input_str = "(foobar)";
let iter = iter::SliceIter::new(input_str.as_bytes());
let result = do_each!(iter,
_ => text_token!("("),
foo => text_token!("foo"),
bar => text_token!("bar"),
_ => text_token!(")"),
(foo, bar) // This expression will be the result of the parse
);
if let Result::Complete(_, o) = result {
assert_eq!("foo", o.0);
assert_eq!("bar", o.1);
}
Or alternatively rather than a tuple as the output you can return a single expression.
let result = do_each!(iter,
_ => text_token!("("),
foo => text_token!("foo"),
bar => text_token!("bar"),
_ => text_token!(")"),
(vec![foo, bar]) // Non tuple expression as a result.
);
if let Result::Complete(_, o) = result {
assert_eq!(vec!["foo", "bar"], o);
}
The output from this combinator must be indicated by parentheses.