incpa_byte/
parser.rs

1use incpa::Parser;
2use incpa::state::ParserState;
3
4use crate::BufferManager;
5
6/// Every `Parser<[u8]>` is a [ByteParser]
7impl<S> ByteParser for S where S: Parser<[u8]> {}
8
9/// Any [Parser] over `[u8]` input
10pub trait ByteParser: Parser<[u8]> {
11    /// Consume and parse all of input from `r`
12    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    /// Consume and parse all of input from `r` using an initial buffer size
21    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}