use indexmap::IndexMap;
use vantage_core::{Result, error};
#[derive(Clone, Debug)]
pub struct CmdOutput {
pub stdout: String,
pub stderr: String,
pub exit_code: i32,
}
pub fn run_command(
command: &str,
args: &[String],
env: &IndexMap<String, String>,
pass_path: bool,
) -> Result<CmdOutput> {
let mut cmd = std::process::Command::new(command);
cmd.args(args);
cmd.env_clear();
if pass_path {
if let Ok(path) = std::env::var("PATH") {
cmd.env("PATH", path);
}
if let Ok(home) = std::env::var("HOME") {
cmd.env("HOME", home);
}
}
for (k, v) in env {
cmd.env(k, v);
}
let output = cmd.output().map_err(|e| {
error!(
"failed to execute command",
command = command.to_string(),
detail = e.to_string()
)
})?;
Ok(CmdOutput {
stdout: String::from_utf8_lossy(&output.stdout).into_owned(),
stderr: String::from_utf8_lossy(&output.stderr).into_owned(),
exit_code: output.status.code().unwrap_or(-1),
})
}