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}