dirmux 0.1.1

Directory and git repository command running program
Documentation
use crate::CommandMessage;
use crate::CommandOutput;
use crate::DirRunner;
use anyhow::{bail, Result};
use async_trait::async_trait;
use std::path::PathBuf;
use tokio::process::Command;
use tokio::sync::mpsc::UnboundedSender;

#[derive(Clone)]
pub struct CommandRunner {
    pub cmd: Vec<String>,
}

#[async_trait]
impl DirRunner for CommandRunner {
    async fn process(
        &self,
        dir: PathBuf,
        _sender: UnboundedSender<CommandMessage>,
    ) -> Result<CommandOutput> {
        if let Some((progname, cmd)) = self.cmd.split_first() {
            let output = Command::new(progname).args(cmd).current_dir(&dir).output();
            let output = output.await?;

            Ok(CommandOutput {
                dir,
                output: String::from_utf8(output.stdout)?,
                error: String::from_utf8(output.stderr)?,
            })
        } else {
            bail!("No command provided for dir: {}", dir.display())
        }
    }
}