Macro abortable_parser::do_each[][src]

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)* ) ) => { ... };
}

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.