Skip to main content

semver_common/utils/
run_command.rs

1use r_log::Logger;
2use std::{ffi::OsStr, fmt::Display, process::Command};
3
4use crate::Alert;
5
6pub fn run_command<I, S>(command: &str, args: I, logger: Option<&Logger>) -> Result<String, Alert>
7where
8    I: IntoIterator<Item = S>,
9    S: AsRef<OsStr> + Display,
10{
11    let mut log_message = command.to_string();
12    let cpargs: Vec<S> = args.into_iter().collect();
13    for arg in &cpargs {
14        log_message = format!("{} {}", log_message, arg);
15    }
16    let output = Command::new(command).args(cpargs).output()?;
17    let stdout = String::from_utf8(output.stdout)?;
18    let stderr = String::from_utf8(output.stderr)?;
19    let status = output.status.code().ok_or(&stderr)?;
20
21    if status == 0 {
22        if let Some(l) = logger {
23            l.debug(&format!("{}\n {}", log_message, stdout));
24        }
25        return Ok(stdout);
26    }
27    if let Some(l) = logger {
28        l.debug(&format!("{}\n {}", log_message, stderr));
29    }
30    Err(Alert::from(stderr))
31}