nom::length_value!
[−]
[src]
macro_rules! length_value( ($i:expr, $f:expr, $g:expr) => ( { match $f($i) { $crate::IResult::Error(a) => $crate::IResult::Error(a), $crate::IResult::Incomplete(i) => $crate::IResult::Incomplete(i), $crate::IResult::Done(i1,nb) => { let length_token = $i.len() - i1.len(); let mut begin = 0; let mut remaining = i1.len(); let mut res = Vec::new(); let mut err = false; let mut inc = $crate::Needed::Unknown; loop { if res.len() == nb as usize { break; } match $g(&i1[begin..]) { $crate::IResult::Done(i2,o2) => { res.push(o2); let parsed = remaining - i2.len(); begin += parsed; remaining = i2.len(); }, $crate::IResult::Error(_) => { err = true; }, $crate::IResult::Incomplete(a) => { inc = a; break; } } } if err { $crate::IResult::Error($crate::Err::Position($crate::ErrorCode::LengthValue as u32,$i)) } else if res.len() < nb as usize { match inc { $crate::Needed::Unknown => $crate::IResult::Incomplete($crate::Needed::Unknown), $crate::Needed::Size(length) => $crate::IResult::Incomplete($crate::Needed::Size(length_token + nb as usize * length)) } } else { $crate::IResult::Done(&i1[begin..], res) } } } } ); ($i:expr, $f:expr, $g:expr, $length:expr) => ( { match $f($i) { $crate::IResult::Error(a) => $crate::IResult::Error(a), $crate::IResult::Incomplete(i) => $crate::IResult::Incomplete(i), $crate::IResult::Done(i1,nb) => { let length_token = $i.len() - i1.len(); let mut begin = 0; let mut remaining = i1.len(); let mut res = Vec::new(); let mut err = false; let mut inc = $crate::Needed::Unknown; loop { if res.len() == nb as usize { break; } match $g(&i1[begin..]) { $crate::IResult::Done(i2,o2) => { res.push(o2); let parsed = remaining - i2.len(); begin += parsed; remaining = i2.len(); }, $crate::IResult::Error(_) => { err = true; }, $crate::IResult::Incomplete(a) => { inc = a; break; } } } if err { $crate::IResult::Error($crate::Err::Position($crate::ErrorCode::LengthValue as u32,$i)) } else if res.len() < nb as usize { match inc { $crate::Needed::Unknown => $crate::IResult::Incomplete($crate::Needed::Unknown), $crate::Needed::Size(_) => $crate::IResult::Incomplete($crate::Needed::Size(length_token + nb as usize * $length)) } } else { $crate::IResult::Done(&i1[begin..], res) } } } } ); );
length_value!(I -> IResult<I, nb>, I -> IResult<I,O>) => I -> IResult<I, Vec<O>>
gets a number from the first parser, then applies the second parser that many times