use std::io;
use std::io::Read;
struct LimitReader<T: Read> {
reader: T,
limit: usize,
reader_count: usize,
}
impl<T: Read> LimitReader<T> {
fn new(reader: T, limit: usize) -> Self {
LimitReader {
reader,
limit,
reader_count: 0,
}
}
}
impl<T: Read> Read for LimitReader<T> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let max_read = self.limit.min(buf.len()); let bytes_read = self.reader.read(&mut buf[..max_read])?;
self.reader_count += 1;
Ok(bytes_read)
}
}
#[cfg(test)]
mod tests {
use std::fs;
use std::io::Read;
use crate::LimitReader;
#[test]
fn test_read() {
let hello_txt = fs::File::open("testdata/hello.txt").unwrap();
let mut reader = LimitReader::new(hello_txt, 5);
let mut r1 = vec![0u8];
reader.read_to_end(&mut r1).unwrap();
let mut hello_txt = fs::File::open("testdata/hello.txt").unwrap();
let mut r2 = vec![0u8];
hello_txt.read_to_end(&mut r2).unwrap();
assert_eq!(r1, r2);
}
}