Skip to main content

semver_common/utils/
run_command.rs

1use r_log::Logger;
2use std::{ffi::OsStr, 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>,
10{
11    let output = Command::new(command).args(args).output()?;
12    let stdout = String::from_utf8(output.stdout)?;
13    let stderr = String::from_utf8(output.stderr)?;
14    let status = output.status.code().ok_or(&stderr)?;
15    if status == 0 {
16        if let Some(l) = logger {
17            l.debug(&stdout);
18        }
19        return Ok(stdout);
20    }
21    if let Some(l) = logger {
22        l.debug(&stderr);
23    }
24    Err(Alert::from(stderr))
25}