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}