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