runcc 2.0.3

run commands concurrently with rust and cargo
Documentation
use clap::Parser;
use std::io;

use super::{options::Opts, CommandSystemLogPlugin};
use crate::run::CommandSystemSimpleReport;

pub async fn run() -> io::Result<CommandSystemSimpleReport> {
    let args = std::env::args_os();
    let mut args: Vec<_> = args.collect();

    if let Some(arg) = args.get(1) {
        if arg == "runcc" {
            args.remove(1);
        }
    }

    let opts: Opts = Opts::parse_from(args);

    let config = opts.try_into_config().or_else(|err| {
        Err(io::Error::new(
            io::ErrorKind::InvalidData,
            format!("{}", err),
        ))
    })?;

    let mut system =
        crate::run::spawn_from_run_config_with_plugin(config, CommandSystemLogPlugin::new());

    let killer = system.share_killer();

    tokio::spawn(async move {
        if let Err(err) = tokio::signal::ctrl_c().await {
            eprintln!(
                "[runcc][warning] failed to setup Ctrl-C signal handler: {}",
                err
            );
        } else {
            killer.kill_all().await;
        }
    });

    Ok(system.wait().await)
}