nom::expr_opt!
[−]
[src]
macro_rules! expr_opt ( ($i:expr, $e:expr) => ( { match $e { Some(output) => $crate::IResult::Done($i, output), None => $crate::IResult::Error($crate::Err::Position($crate::ErrorCode::ExprOpt as u32, $i)) } } ); );
expr_opt!(Option<O>) => I -> IResult<I, O>
evaluate an expression that returns a Option
Useful when doing computations in a chain
fn take_add(input:&[u8], size: u8) -> IResult<&[u8],&[u8]> { chain!(input, sz: be_u8 ~ length: expr_opt!(size.checked_add(sz)) ~ // checking for integer overflow (returns an Option) data: take!(length) , ||{ data } ) } let arr1 = [1, 2, 3, 4, 5]; let r1 = take_add(&arr1[..], 1); assert_eq!(r1, Done(&[4,5][..], &[2,3][..])); let arr2 = [0xFE, 2, 3, 4, 5]; // size is overflowing let r1 = take_add(&arr2[..], 42); assert_eq!(r1, Error(Position(ErrorCode::ExprOpt as u32,&[2,3,4,5][..])));