]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | use super::internal_buffer::Buffer; |
6a06907d XL |
2 | use std::{ |
3 | fmt, | |
4 | io::{Error, Read}, | |
5 | }; | |
b7449926 XL |
6 | |
7 | pub struct InternalReader<R> { | |
8 | read: R, | |
9 | buffer_size: usize, | |
10 | buffer: Buffer, | |
11 | } | |
12 | ||
13 | impl<R: Read> InternalReader<R> { | |
14 | pub fn new(mut read: R, buffer_size: usize) -> Result<Self, Error> { | |
15 | let mut buffer = Buffer::new(buffer_size); | |
16 | InternalReader::read_data(&mut read, &mut buffer)?; | |
17 | Ok(InternalReader { | |
18 | read, | |
19 | buffer_size, | |
20 | buffer, | |
21 | }) | |
22 | } | |
23 | ||
24 | fn read_data(read: &mut R, buffer: &mut Buffer) -> Result<(), Error> { | |
25 | let size = read.read(buffer.as_mut())?; | |
26 | buffer.update_metadata(size); | |
27 | Ok(()) | |
28 | } | |
29 | } | |
30 | ||
31 | impl<R: Read + fmt::Debug> fmt::Debug for InternalReader<R> { | |
32 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | |
33 | f.debug_struct("JsonReader") | |
34 | .field("read", &self.read) | |
35 | .field("buffer_size", &self.buffer_size) | |
36 | .field("buffer", &self.buffer) | |
37 | .finish() | |
38 | } | |
39 | } | |
40 | ||
41 | impl<R: Read> Iterator for InternalReader<R> { | |
42 | type Item = Result<u8, Error>; | |
43 | ||
44 | #[inline] | |
45 | fn next(&mut self) -> Option<Result<u8, Error>> { | |
46 | if self.buffer_size == 0 { | |
47 | return None; | |
48 | } | |
49 | loop { | |
50 | if let Some(item) = self.buffer.next() { | |
51 | return Some(Ok(item)); | |
52 | } else if self.buffer.cont() { | |
53 | if let Err(err) = InternalReader::read_data(&mut self.read, &mut self.buffer) { | |
54 | return Some(Err(err)); | |
55 | }; | |
56 | } else { | |
57 | return None; | |
58 | } | |
59 | } | |
60 | } | |
61 | } |