1use incpa::Parser;
2use incpa::state::ParserState;
3
4use crate::BufferManager;
5
6impl<S> ByteParser for S where S: Parser<[u8]> {}
8
9pub trait ByteParser: Parser<[u8]> {
11 fn parse_reader<R, E>(self, r: R) -> Result<Self::Output, E>
13 where
14 R: std::io::Read,
15 E: From<Self::Error> + From<std::io::Error>,
16 {
17 self.parse_reader_with_initial_buffer_size(r, 1 << 12)
18 }
19
20 fn parse_reader_with_initial_buffer_size<R, E>(
22 self,
23 mut r: R,
24 bufsize: usize,
25 ) -> Result<Self::Output, E>
26 where
27 R: std::io::Read,
28 E: From<Self::Error> + From<std::io::Error>,
29 {
30 let mut bufmgr = BufferManager::with_initial_size(bufsize);
31
32 self.into_parser().run_parser(|parser| {
33 let writeslice = bufmgr.get_write_slice();
34 let readcnt = r.read(writeslice)?;
35 bufmgr.process_write(parser, readcnt)
36 })
37 }
38}