nom::pusher!
[−]
[src]
macro_rules! pusher ( ($name:ident, $f:expr) => ( #[allow(unused_variables)] fn $name(producer: &mut $crate::Producer) { let mut acc: Vec<u8> = Vec::new(); loop { let state = producer.produce(); match state { $crate::ProducerState::Data(v) => { //println!("got data"); acc.extend(v.iter().cloned()) }, $crate::ProducerState::Eof(v) => { if v.is_empty() { //println!("eof empty, acc contains {} bytes: {:?}", acc.len(), acc); break; } else { //println!("eof with {} bytes", v.len()); acc.extend(v.iter().cloned()) } } _ => {break;} } let mut v2: Vec<u8> = Vec::new(); v2.extend(acc[..].iter().cloned()); //let p = IResult::Done(b"", v2.as_slice()); match $f(&v2[..]) { $crate::IResult::Error(e) => { //println!("error, stopping: {}", e); break; }, $crate::IResult::Incomplete(_) => { //println!("incomplete"); }, $crate::IResult::Done(i, _) => { //println!("data, done"); acc.clear(); acc.extend(i.iter().cloned()); } } } } ); );
Prepares a parser function for a push pipeline
It creates a function that accepts a producer and immediately starts parsing the data sent
Example
fn local_print<'a, T: Debug>(input: T) -> IResult<'a, T, ()> { println!("{:?}", input); Done(input, ()) } let mut p = MemProducer::new(b"abcdefgh", 8); pusher!(ps, local_print); ps(&mut p);