1pub mod cli;
2pub mod debug;
3pub mod diag;
4pub mod provider;
5pub mod workflow;
6
7use clap::error::ErrorKind;
8use clap::{CommandFactory, Parser};
9
10pub fn run() -> i32 {
11 run_from(std::env::args())
12}
13
14pub fn run_from<I, T>(argv: I) -> i32
15where
16 I: IntoIterator<Item = T>,
17 T: Into<std::ffi::OsString> + Clone,
18{
19 let cli = match cli::Cli::try_parse_from(argv) {
20 Ok(cli) => cli,
21 Err(err) => {
22 let code = match err.kind() {
23 ErrorKind::DisplayHelp | ErrorKind::DisplayVersion => 0,
24 _ => 64,
25 };
26 let _ = err.print();
27 return code;
28 }
29 };
30
31 match cli.command {
32 Some(cli::Command::Provider(args)) => match args.command {
33 Some(command) => provider::commands::run(command),
34 None => print_group_help("provider"),
35 },
36 Some(cli::Command::Diag(args)) => match args.command {
37 Some(command) => diag::run(command),
38 None => print_group_help("diag"),
39 },
40 Some(cli::Command::Debug(args)) => match args.command {
41 Some(command) => debug::run(command),
42 None => print_group_help("debug"),
43 },
44 Some(cli::Command::Workflow(args)) => match args.command {
45 Some(command) => workflow::run(command),
46 None => print_group_help("workflow"),
47 },
48 Some(cli::Command::Automation) => print_group_help("automation"),
49 None => print_root_help(),
50 }
51}
52
53fn print_root_help() -> i32 {
54 let mut cmd = cli::Cli::command();
55 if cmd.print_help().is_ok() {
56 println!();
57 return 0;
58 }
59 1
60}
61
62fn print_group_help(name: &str) -> i32 {
63 let mut cmd = cli::Cli::command();
64 if let Some(subcommand) = cmd.find_subcommand_mut(name)
65 && subcommand.print_help().is_ok()
66 {
67 println!();
68 return 0;
69 }
70 1
71}