use std::fs::File;
use std::io::{self, Write};
use crate::cli::Args;
#[allow(dead_code)]
pub enum OutputTarget {
Memory(Vec<u8>),
Stdout,
File(File),
}
pub fn open_writer(args: &Args) -> OutputTarget {
if let Some(_) = &args.out {
OutputTarget::Memory(Vec::new())
} else {
OutputTarget::Stdout
}
}
impl Write for OutputTarget {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
match self {
OutputTarget::Memory(inner) => {
inner.extend_from_slice(buf);
Ok(buf.len())
}
OutputTarget::Stdout => {
io::stdout().write(buf)
}
OutputTarget::File(file) => {
file.write(buf)
}
}
}
fn flush(&mut self) -> std::io::Result<()> {
match self {
OutputTarget::Memory(_) => Ok(()),
OutputTarget::Stdout => io::stdout().flush(),
OutputTarget::File(file) => file.flush(),
}
}
}