[][src]Macro nom::try_parse

macro_rules! try_parse {
    ($i:expr, $submac:ident!( $($args:tt)* )) => { ... };
    ($i:expr, $f:expr) => { ... };
}

A bit like std::try!, this macro will return the remaining input and parsed value if the child parser returned Ok, and will do an early return for the Err side.

this can provide more flexibility than do_parse! if needed


 fn take_add(input:&[u8], size: u8) -> IResult<&[u8], &[u8]> {
   let (i1, sz)     = try_parse!(input, nom::number::streaming::be_u8);
   let (i2, length) = try_parse!(i1, expr_opt!(size.checked_add(sz)));
   let (i3, data)   = try_parse!(i2, take!(length));
   return Ok((i3, data));
 }
let arr1 = [1, 2, 3, 4, 5];
let r1 = take_add(&arr1[..], 1);
assert_eq!(r1, Ok((&[4,5][..], &[2,3][..])));

let arr2 = [0xFE, 2, 3, 4, 5];
// size is overflowing
let r1 = take_add(&arr2[..], 42);
assert_eq!(r1, Err(Err::Error(error_position!(&[2,3,4,5][..], ErrorKind::ExprOpt))));