Reduces boilerplate for adding a completion command to Clap
```rust use clap::{IntoApp, Parser, Subcommand};
struct Cli { #[clap(subcommand)] command: Commands, }
enum Commands { /// Generate shell completions Completions { /// The shell to generate the completions for #[clap(argenum)] shell: clapcomplete_command::Shell, }, }
fn main() { let cli = Cli::parse();
match cli.command {
// e.g. `$ cli completion bash`
Commands::Completions { shell } => {
shell.generate(&mut Cli::command(), &mut std::io::stdout());
}
}
} ```
```rust use clap::{Arg, Command};
fn buildcli() -> Command<'static> { Command::new(env!("CARGOPKGNAME")) .subcommandrequired(true) .subcommand( Command::new("completions") .about("Generate shell completions") .arg( Arg::new("shell") .valuename("SHELL") .help("The shell to generate the completions for") .required(true) .possiblevalues(clapcompletecommand::Shell::possible_values()), ), ) }
fn main() { let matches = buildcli().getmatches();
match matches.subcommand() {
Some(("completions", sub_matches)) => {
// e.g. `$ cli completion bash`
if let Ok(shell) = sub_matches.value_of_t::<clap_complete_command::Shell>("shell") {
let mut command = build_cli();
shell.generate(&mut command, &mut std::io::stdout());
}
}
_ => {
unreachable!("Exhausted list of subcommands and `subcommand_required` prevents `None`")
}
}
} ```
The supported shells can be seen in clap_complete_command::Shell
.