runcc/cli/
app.rs

1use clap::Parser;
2use std::io;
3
4use super::{options::Opts, CommandSystemLogPlugin};
5use crate::run::CommandSystemSimpleReport;
6
7pub async fn run() -> io::Result<CommandSystemSimpleReport> {
8    let args = std::env::args_os();
9    let mut args: Vec<_> = args.collect();
10
11    if let Some(arg) = args.get(1) {
12        if arg == "runcc" {
13            args.remove(1);
14        }
15    }
16
17    let opts: Opts = Opts::parse_from(args);
18
19    let config = opts.try_into_config().or_else(|err| {
20        Err(io::Error::new(
21            io::ErrorKind::InvalidData,
22            format!("{}", err),
23        ))
24    })?;
25
26    let mut system =
27        crate::run::spawn_from_run_config_with_plugin(config, CommandSystemLogPlugin::new());
28
29    let killer = system.share_killer();
30
31    tokio::spawn(async move {
32        if let Err(err) = tokio::signal::ctrl_c().await {
33            eprintln!(
34                "[runcc][warning] failed to setup Ctrl-C signal handler: {}",
35                err
36            );
37        } else {
38            killer.kill_all().await;
39        }
40    });
41
42    Ok(system.wait().await)
43}