]> git.proxmox.com Git - rustc.git/blame - vendor/minifier/src/json/read/internal_reader.rs
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / vendor / minifier / src / json / read / internal_reader.rs
CommitLineData
b7449926 1use super::internal_buffer::Buffer;
6a06907d
XL
2use std::{
3 fmt,
4 io::{Error, Read},
5};
b7449926
XL
6
7pub struct InternalReader<R> {
8 read: R,
9 buffer_size: usize,
10 buffer: Buffer,
11}
12
13impl<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
31impl<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
41impl<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}