use std::io;
use std::io::Write;
pub struct PrintWriter<W1: Write, W2: Write> {
underlying_writer: W1,
side_effect_writer: W2,
label: String,
}
impl<W1: Write, W2: Write> PrintWriter<W1, W2> {
pub fn new(underlying_writer: W1, side_effect_writer: W2) -> Self {
Self {
underlying_writer,
side_effect_writer,
label: "".parse().unwrap(),
}
}
pub fn new_with_label(
underlying_writer: W1,
side_effect_writer: W2,
label: String,
) -> Self {
Self {
underlying_writer,
side_effect_writer,
label,
}
}
}
impl<W: Write> PrintWriter<W, io::Stdout> {
pub fn new_to_stdout(underlying_writer: W) -> Self {
Self {
underlying_writer,
side_effect_writer: io::stdout(),
label: "".parse().unwrap(),
}
}
pub fn new_to_stdout_with_label(underlying_writer: W, label: String) -> Self {
Self {
underlying_writer,
side_effect_writer: io::stdout(),
label,
}
}
}
impl<W1: Write, W2: Write> Write for PrintWriter<W1, W2> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let bytes_written = self.underlying_writer.write(buf)?;
self.side_effect_writer.write_all(self.label.as_ref())?;
self.side_effect_writer.write_all(&buf[..bytes_written])?;
Ok(bytes_written)
}
fn flush(&mut self) -> io::Result<()> {
self.underlying_writer.flush()?;
self.side_effect_writer.flush()?;
Ok(())
}
}