use crate::cmd::cmd_error::CmdError;
use log::debug;
use std::process::{Child, Command};
pub fn exec(cmd: &str, args: &[&str]) -> Result<Vec<u8>, CmdError> {
debug!("Executing command: {} {:?}", cmd, args);
let output = Command::new(cmd)
.args(args)
.output()
.map_err(|e| CmdError::ExecuteFail(e))?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
return Err(CmdError::RunFail(stderr));
}
Ok(output.stdout)
}
pub fn is_process_alive(child: &mut Child) -> bool {
debug!("Checking if process is alive: {}", child.id());
match child.try_wait() {
Ok(Some(_)) => false, Ok(None) => true, Err(_) => false, }
}
pub fn kill_process(mut child: Child) -> Result<(), Box<dyn std::error::Error>> {
debug!("Killing process: {}", child.id());
child.kill()?;
child.wait()?;
Ok(())
}