nom_reader/
lib.rs

1extern crate nom;
2
3use std::io::{self, Read};
4
5
6pub fn read<P, O, E, R>(parser: P, mut rdr: R) -> Result<O, E>
7    where R: Read,
8          E: From<nom::ErrorKind> + From<io::Error>,
9          P: Fn(&[u8]) -> nom::IResult<&[u8], O>,
10{
11    let mut input: Vec<u8> = Vec::new();
12    loop {
13        let to_read = match parser(&input) {
14            Ok((_, parsed)) => return Ok(parsed),
15            Err(nom::Err::Incomplete(needed)) => {
16                match needed {
17                    nom::Needed::Unknown => 1,     // read one byte
18                    nom::Needed::Size(len) => len,
19                }
20            },
21            Err(e) => return Err(e.into_error_kind().into()),
22        };
23
24        (&mut rdr).take(to_read as u64).read_to_end(&mut input)?;
25    }
26}