use std::io;
use std::io::{Read, Write};
pub struct PrintReader<R: Read, W: Write> {
underlying_reader: R,
side_effect_writer: W,
label: String,
}
impl<R: Read, W: Write> PrintReader<R, W> {
pub fn new(underlying_reader: R, side_effect_writer: W) -> Self {
Self {
underlying_reader,
side_effect_writer,
label: "".parse().unwrap(),
}
}
pub fn new_with_label(
underlying_reader: R,
side_effect_writer: W,
label: String,
) -> Self {
Self {
underlying_reader,
side_effect_writer,
label,
}
}
}
impl<R: Read> PrintReader<R, io::Stdout> {
pub fn new_to_stdout(underlying_reader: R) -> Self {
Self {
underlying_reader,
side_effect_writer: io::stdout(),
label: "".parse().unwrap(),
}
}
pub fn new_to_stdout_with_label(underlying_reader: R, label: String) -> Self {
Self {
underlying_reader,
side_effect_writer: io::stdout(),
label,
}
}
}
impl<R: Read, W: Write> Read for PrintReader<R, W> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let bytes_read = self.underlying_reader.read(buf)?;
self.side_effect_writer.write_all(self.label.as_ref())?;
self.side_effect_writer.write_all(&buf[..bytes_read])?;
Ok(bytes_read)
}
}