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}