use anyhow::{anyhow, Result};
use std::process::{Command as StdCommand, Stdio};
pub async fn run_capture_async(
cmd: &str,
args: &[&str],
) -> Result<String> {
let output = tokio::process::Command::new(cmd)
.args(args)
.output()
.await?;
if !output.status.success() {
let err = String::from_utf8_lossy(&output.stderr);
return Err(anyhow!(
"{} {:?} failed: {}",
cmd,
args,
err.trim()
));
}
Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}
pub async fn run_quiet_async(
cmd: &str,
args: &[&str],
_label: &str,
) -> Result<()> {
let status = tokio::process::Command::new(cmd)
.args(args)
.stdout(Stdio::null())
.stderr(Stdio::inherit())
.status()
.await?;
if !status.success() {
return Err(anyhow!("{} {:?} failed", cmd, args));
}
Ok(())
}
pub async fn run_status_async(cmd: &str, args: &[&str]) -> bool {
tokio::process::Command::new(cmd)
.args(args)
.status()
.await
.map(|s| s.success())
.unwrap_or(false)
}
pub fn run_capture(cmd: &str, args: &[&str]) -> Result<String> {
let output = StdCommand::new(cmd).args(args).output()?;
if !output.status.success() {
let err = String::from_utf8_lossy(&output.stderr);
return Err(anyhow!(
"{} {:?} failed: {}",
cmd,
args,
err.trim()
));
}
Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}
pub fn run_quiet(
cmd: &str,
args: &[&str],
_label: &str,
) -> Result<()> {
let status = StdCommand::new(cmd)
.args(args)
.stdout(Stdio::null())
.stderr(Stdio::inherit())
.status()?;
if !status.success() {
return Err(anyhow!("{} {:?} failed", cmd, args));
}
Ok(())
}
pub fn run_status(cmd: &str, args: &[&str]) -> bool {
StdCommand::new(cmd)
.args(args)
.status()
.map(|s| s.success())
.unwrap_or(false)
}