#![cfg_attr(feature = "dev", feature(plugin))]
#![cfg_attr(feature = "dev", plugin(clippy))]
#![deny(missing_docs)]
extern crate ansi_term;
extern crate difference;
use std::process::{Command, Output};
use std::error::Error;
use std::ffi::OsStr;
mod cli_error;
mod diff;
use cli_error::CliError;
pub fn assert_cli_output<S>(cmd: &str, args: &[S], expected_output: &str) -> Result<(), Box<Error>>
where S: AsRef<OsStr>
{
let call: Result<Output, Box<Error>> = Command::new(cmd)
.args(args)
.output()
.map_err(From::from);
call.and_then(|output| {
if !output.status.success() {
return Err(From::from(CliError::NoSuccess(output)));
}
let stdout = String::from_utf8_lossy(&output.stdout);
let (distance, changes) = difference::diff(expected_output.trim(),
&stdout.trim(),
"\n");
if distance > 0 {
return Err(From::from(CliError::OutputMissmatch(changes)));
}
Ok(())
})
.map_err(From::from)
}