corge/
std_command_ext.rs

1use anyhow::Result;
2use std::process::Command;
3
4pub trait ExecuteCommand {
5    fn execute(&mut self, log: bool) -> Result<String>;
6}
7
8impl ExecuteCommand for Command {
9    fn execute(&mut self, log: bool) -> Result<String> {
10        if log {
11            log::trace!("{}", self.cli_str());
12        }
13
14        match self.output() {
15            Ok(output) => {
16                if output.status.success() {
17                    let std_out: String = String::from_utf8_lossy(&output.stdout).to_string();
18
19                    log::trace!("{std_out}");
20
21                    Ok(std_out)
22                } else {
23                    anyhow::bail!(String::from_utf8_lossy(&output.stderr).to_string());
24                }
25            },
26            Err(error) => Err(anyhow::anyhow!(error))
27        }
28    }
29}
30
31pub trait CliStr {
32    fn cli_str(&self) -> String;
33}
34
35impl CliStr for Command {
36    fn cli_str(&self) -> String {
37        let mut parts: Vec<&str> = vec![
38            self.get_program().to_str().unwrap_or("[Non-UTF8 Program]")
39        ];
40
41        let args: Vec<&str> = self.get_args()
42            .map(|arg| arg.to_str().unwrap_or("[Non-UTF8 Argument]"))
43            .collect();
44
45        parts.extend(args);
46
47        parts.join(" ")
48    }
49}