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, 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}