use std::io;
pub trait MakeWriter: Send + Sync + 'static {
type Writer: io::Write;
fn make_writer(&self) -> Self::Writer;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct Stdout;
impl MakeWriter for Stdout {
type Writer = io::StdoutLock<'static>;
fn make_writer(&self) -> Self::Writer {
io::stdout().lock()
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct Stderr;
impl MakeWriter for Stderr {
type Writer = io::StderrLock<'static>;
fn make_writer(&self) -> Self::Writer {
io::stderr().lock()
}
}
impl MakeWriter for std::sync::Arc<std::sync::Mutex<Vec<u8>>> {
type Writer = SharedBuffer;
fn make_writer(&self) -> Self::Writer {
SharedBuffer(self.clone())
}
}
#[derive(Debug)]
pub struct SharedBuffer(std::sync::Arc<std::sync::Mutex<Vec<u8>>>);
impl io::Write for SharedBuffer {
fn write(&mut self, buffer: &[u8]) -> io::Result<usize> {
let mut out = self.0.lock().unwrap_or_else(|poison| poison.into_inner());
out.extend_from_slice(buffer);
Ok(buffer.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}