use crate::prelude::*;
use std::future::Future;
use std::process::Output;
pub trait ProcessExt {
fn run(&mut self) -> impl Future<Output = Result<Output, Failure<ProcessAction>>> + Send;
}
impl ProcessExt for TokioCommand {
async fn run(&mut self) -> Result<Output, Failure<ProcessAction>> {
let program = self.as_std().get_program().to_string_lossy().to_string();
let output = self
.output()
.await
.map_err(|e| Failure::new(ProcessAction::Start, e).with("program", &program))?;
require_success(output, &program)
}
}
pub fn require_success(output: Output, program: &str) -> Result<Output, Failure<ProcessAction>> {
if output.status.success() {
Ok(output)
} else {
Err(
Failure::new(ProcessAction::Execute, ProcessOutput::from(output))
.with("program", program),
)
}
}