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