macro_rules! dispatch {
    ($match_expr: expr; $( $($pat: pat)|+ $(if $pred:expr)? => $expr: expr ),+ $(,)? ) => { ... };
}
Expand description

dispatch! allows a parser to be constructed depending on earlier input, without forcing each branch to have the same type of parser

use combine::{dispatch, any, token, satisfy, EasyParser, Parser};

let mut parser = any().then(|e| {
    dispatch!(e;
        'a' => token('a'),
        'b' => satisfy(|b| b == 'b'),
        t if t == 'c' => any(),
        _ => token('d')
    )
});
assert_eq!(parser.easy_parse("aa"), Ok(('a', "")));
assert_eq!(parser.easy_parse("cc"), Ok(('c', "")));
assert_eq!(parser.easy_parse("cd"), Ok(('d', "")));
assert!(parser.easy_parse("ab").is_err());