use std::future::Future;
use std::process::Output;
use rogue_logging::Failure;
use tokio::process::Command;
use super::{ProcessAction, ProcessOutput};
pub trait ProcessExt {
fn run(&mut self) -> impl Future<Output = Result<Output, Failure<ProcessAction>>> + Send;
}
impl ProcessExt for Command {
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),
)
}
}