nom::switch!
[−]
[src]
macro_rules! switch { ($i:expr, $submac:ident!( $($args:tt)*), $($rest:tt)*) => { ... }; ($i:expr, $e:ident, $($rest:tt)*) => { ... }; }
switch!(I -> IResult<I,P>, P => I -> IResult<I,O> | ... | P => I -> IResult<I,O> ) => I -> IResult<I, O>
choose the next parser depending on the result of the first one, if successful,
and returns the result of the second parser
named!(sw, switch!(take!(4), b"abcd" => tag!("XYZ") | b"efgh" => tag!("123") ) ); let a = b"abcdXYZ123"; let b = b"abcdef"; let c = b"efgh123"; let d = b"blah"; assert_eq!(sw(&a[..]), Done(&b"123"[..], &b"XYZ"[..])); assert_eq!(sw(&b[..]), Error(NodePosition(ErrorKind::Switch, &b"abcdef"[..], Box::new(Position(ErrorKind::Tag, &b"ef"[..]))))); assert_eq!(sw(&c[..]), Done(&b""[..], &b"123"[..])); assert_eq!(sw(&d[..]), Error(Position(ErrorKind::Switch, &b"blah"[..])));
Due to limitations in Rust macros, it is not possible to have simple functions on the right hand side of pattern, like this:
named!(sw, switch!(take!(4), b"abcd" => tag!("XYZ") | b"efgh" => tag!("123") ) );
If you want to pass your own functions instead, you can use the call!
combinator as follows:
named!(xyz, tag!("XYZ")); named!(num, tag!("123")); named!(sw, switch!(take!(4), b"abcd" => call!(xyz) | b"efgh" => call!(num) ) );