axe-cli 0.3.0

axe - Argument execute is xargs alternative that focus on arguments processing and ordering.
Documentation
use std::process::Command;

use crate::cli::Cli;

pub fn execute_cmd(cli: &Cli, cmd_args: Vec<String>) {
    let output = if cli.debug {
        print_command(cli, &cmd_args)
    } else {
        run_command(cli, &cmd_args)
    };
    match output {
        Ok(output) => println!("{}", output.trim()),
        Err(error) => eprintln!("Failed to execute command:\n{}", error),
    }
}

fn print_command(cli: &Cli, cmd_args: &[String]) -> Result<String, String> {
    Ok(format!("{} {}", cli.cmd, cmd_args.join(" ")))
}

fn run_command(cli: &Cli, cmd_args: &[String]) -> Result<String, String> {
    let output = Command::new(&cli.cmd)
        .args(cmd_args)
        .output()
        .expect("Failed to execute command");
    match output.status.success() {
        true => String::from_utf8(output.stdout)
            .map_err(|e| format!("Invalid UTF-8 command output: {}", e)),
        false => Err(String::from_utf8(output.stderr).unwrap()),
    }
}