pact_broker_cli/
main.rs

1pub mod cli;
2
3use clap::ArgMatches;
4use clap::error::ErrorKind;
5use clap_complete::{Shell, generate_to};
6
7use std::process::ExitCode;
8use std::str::FromStr;
9
10pub fn handle_matches(
11    matches: &Result<ArgMatches, clap::Error>,
12    raw_args: Option<Vec<String>>,
13) -> Result<(), ExitCode> {
14    let raw_args = if let Some(args) = raw_args {
15        args
16    } else {
17        std::env::args().skip(1).collect()
18    };
19    match matches {
20        Ok(results) => match results.subcommand() {
21            _ => {
22                let log_level = results
23                    .get_one::<String>("log-level")
24                    .map(|s| s.to_string())
25                    .unwrap_or_else(|| "off".to_string());
26                cli::utils::setup_loggers(&log_level);
27
28                match results.subcommand() {
29                    Some(("pactflow", args)) => match cli::pactflow_client::run(args, raw_args) {
30                        Ok(_) => Ok(()),
31                        Err(error) => Err(ExitCode::from(error as u8)),
32                    },
33                    Some(("completions", args)) => Ok(generate_completions(args)),
34                    _ => match cli::pact_broker_client::run(results, raw_args) {
35                        Ok(_) => Ok(()),
36                        Err(error) => Err(ExitCode::from(error as u8)),
37                    },
38                }
39            }
40        },
41        Err(err) => match err.kind() {
42            ErrorKind::DisplayHelp => {
43                let _ = err.print();
44                Ok(())
45            }
46            ErrorKind::DisplayVersion => {
47                let _ = err.print();
48                Ok(())
49            }
50            ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand => {
51                let _ = err.print();
52                Ok(())
53            }
54            _ => err.exit(),
55        },
56    }
57}
58
59fn generate_completions(args: &ArgMatches) {
60    let shell = args
61        .get_one::<String>("shell")
62        .expect("a shell is required");
63    let out_dir = args
64        .get_one::<String>("dir")
65        .expect("a directory is expected")
66        .to_string();
67    let mut cmd = cli::build_cli();
68    let shell_enum = Shell::from_str(&shell).unwrap();
69    let _ = generate_to(
70        shell_enum,
71        &mut cmd,
72        "pact-broker-cli".to_string(),
73        &out_dir,
74    );
75    println!(
76        "ℹ️  {} shell completions for pact-broker-cli written to {}",
77        &shell_enum, &out_dir
78    );
79}