use std::io;
pub struct BoundedReader<InnerT>
where
InnerT: io::Read,
{
pub inner: InnerT,
pub max_size: usize,
completed: usize,
}
impl<ReadT> BoundedReader<ReadT>
where
ReadT: io::Read,
{
pub fn new(inner: ReadT, max_size: usize) -> Self {
Self { inner, max_size, completed: 0 }
}
}
impl<InnerT> io::Read for BoundedReader<InnerT>
where
InnerT: io::Read,
{
fn read(&mut self, mut buf: &mut [u8]) -> io::Result<usize> {
let mut buf_len = buf.len();
if buf_len == 0 {
return Ok(0);
}
let end = self.completed + buf_len;
if end > self.max_size {
buf_len = self.max_size - self.completed;
if buf_len == 0 {
return Ok(0);
}
buf = &mut buf[..buf_len];
}
let completed = self.inner.read(buf)?;
self.completed += completed;
return Ok(completed);
}
}