use std::io::Write;
pub struct CliOutput<'a> {
pub stdout: &'a mut dyn Write,
pub stderr: &'a mut dyn Write,
}
impl<'a> CliOutput<'a> {
pub fn from_std(stdout: &'a mut dyn Write, stderr: &'a mut dyn Write) -> Self {
Self { stdout, stderr }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_capture_roundtrip() {
let mut stdout = Vec::<u8>::new();
let mut stderr = Vec::<u8>::new();
let out = CliOutput {
stdout: &mut stdout,
stderr: &mut stderr,
};
writeln!(out.stdout, "hello").unwrap();
writeln!(out.stderr, "warn").unwrap();
assert_eq!(String::from_utf8(stdout).unwrap(), "hello\n");
assert_eq!(String::from_utf8(stderr).unwrap(), "warn\n");
}
#[test]
fn test_from_std_constructor() {
let mut stdout = Vec::<u8>::new();
let mut stderr = Vec::<u8>::new();
{
let out = CliOutput::from_std(&mut stdout, &mut stderr);
writeln!(out.stdout, "ok").unwrap();
writeln!(out.stderr, "err").unwrap();
}
assert_eq!(String::from_utf8(stdout).unwrap(), "ok\n");
assert_eq!(String::from_utf8(stderr).unwrap(), "err\n");
}
#[test]
fn test_independent_streams() {
let mut stdout = Vec::<u8>::new();
let mut stderr = Vec::<u8>::new();
{
let out = CliOutput::from_std(&mut stdout, &mut stderr);
writeln!(out.stdout, "one").unwrap();
writeln!(out.stdout, "two").unwrap();
writeln!(out.stderr, "warn-1").unwrap();
}
assert_eq!(String::from_utf8(stdout).unwrap(), "one\ntwo\n");
assert_eq!(String::from_utf8(stderr).unwrap(), "warn-1\n");
}
}