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(("pact-broker", args)) => Ok(cli::pact_broker_client::run(args, raw_args)),
30 Some(("pactflow", args)) => Ok(cli::pactflow_client::run(args, raw_args)),
31 Some(("completions", args)) => Ok(generate_completions(args)),
32 _ => Ok(cli::build_cli().print_help().unwrap()),
33 }
34 }
35 },
36 Err(err) => match err.kind() {
37 ErrorKind::DisplayHelp => {
38 let _ = err.print();
39 Ok(())
40 }
41 ErrorKind::DisplayVersion => {
42 let _ = err.print();
43 Ok(())
44 }
45 _ => err.exit(),
46 },
47 }
48}
49
50fn generate_completions(args: &ArgMatches) {
51 let shell = args
52 .get_one::<String>("shell")
53 .expect("a shell is required");
54 let out_dir = args
55 .get_one::<String>("dir")
56 .expect("a directory is expected")
57 .to_string();
58 let mut cmd = cli::build_cli();
59 let shell_enum = Shell::from_str(&shell).unwrap();
60 let _ = generate_to(
61 shell_enum,
62 &mut cmd,
63 "pact-broker-cli".to_string(),
64 &out_dir,
65 );
66 println!(
67 "ℹ️ {} shell completions for pact-broker-cli written to {}",
68 &shell_enum, &out_dir
69 );
70}