mirror of
https://github.com/clap-rs/clap
synced 2024-12-12 22:02:35 +00:00
109 lines
3.2 KiB
Rust
109 lines
3.2 KiB
Rust
//! Example to test arguments with different ValueHint values.
|
|
//!
|
|
//! Usage with zsh:
|
|
//! ```console
|
|
//! $ cargo run --example completion -- --generate=zsh > /usr/local/share/zsh/site-functions/_completion$
|
|
//! $ compinit
|
|
//! $ ./target/debug/examples/completion --<TAB>
|
|
//! ```
|
|
//! fish:
|
|
//! ```console
|
|
//! $ cargo run --example completion -- --generate=fish > completion.fish
|
|
//! $ . ./completion.fish
|
|
//! $ ./target/debug/examples/completion --<TAB>
|
|
//! ```
|
|
use clap::{value_parser, Arg, Command, ValueHint};
|
|
use clap_complete::{generate, Generator, Shell};
|
|
use std::io;
|
|
|
|
fn build_cli() -> Command {
|
|
let value_hint_command = Command::new("value-hint")
|
|
.visible_alias("hint")
|
|
.arg(
|
|
Arg::new("unknown")
|
|
.long("unknown")
|
|
.value_hint(ValueHint::Unknown),
|
|
)
|
|
.arg(Arg::new("other").long("other").value_hint(ValueHint::Other))
|
|
.arg(
|
|
Arg::new("path")
|
|
.long("path")
|
|
.short('p')
|
|
.value_hint(ValueHint::AnyPath),
|
|
)
|
|
.arg(
|
|
Arg::new("file")
|
|
.long("file")
|
|
.short('f')
|
|
.value_hint(ValueHint::FilePath),
|
|
)
|
|
.arg(
|
|
Arg::new("dir")
|
|
.long("dir")
|
|
.short('d')
|
|
.value_hint(ValueHint::DirPath),
|
|
)
|
|
.arg(
|
|
Arg::new("exe")
|
|
.long("exe")
|
|
.short('e')
|
|
.value_hint(ValueHint::ExecutablePath),
|
|
)
|
|
.arg(
|
|
Arg::new("cmd_name")
|
|
.long("cmd-name")
|
|
.value_hint(ValueHint::CommandName),
|
|
)
|
|
.arg(
|
|
Arg::new("cmd")
|
|
.long("cmd")
|
|
.short('c')
|
|
.value_hint(ValueHint::CommandString),
|
|
)
|
|
.arg(
|
|
Arg::new("command_with_args")
|
|
.num_args(1..)
|
|
// AppSettings::TrailingVarArg is required to use ValueHint::CommandWithArguments
|
|
.trailing_var_arg(true)
|
|
.value_hint(ValueHint::CommandWithArguments),
|
|
)
|
|
.arg(
|
|
Arg::new("user")
|
|
.short('u')
|
|
.long("user")
|
|
.value_hint(ValueHint::Username),
|
|
)
|
|
.arg(
|
|
Arg::new("host")
|
|
.long("host")
|
|
.value_hint(ValueHint::Hostname),
|
|
)
|
|
.arg(Arg::new("url").long("url").value_hint(ValueHint::Url))
|
|
.arg(
|
|
Arg::new("email")
|
|
.long("email")
|
|
.value_hint(ValueHint::EmailAddress),
|
|
);
|
|
|
|
Command::new("completion")
|
|
.arg(
|
|
Arg::new("generator")
|
|
.long("generate")
|
|
.value_parser(value_parser!(Shell)),
|
|
)
|
|
.subcommand(value_hint_command)
|
|
}
|
|
|
|
fn print_completions<G: Generator>(gen: G, cmd: &mut Command) {
|
|
generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout());
|
|
}
|
|
|
|
fn main() {
|
|
let matches = build_cli().get_matches();
|
|
|
|
if let Some(generator) = matches.get_one::<Shell>("generator") {
|
|
let mut cmd = build_cli();
|
|
eprintln!("Generating completion file for {generator}...");
|
|
print_completions(*generator, &mut cmd);
|
|
}
|
|
}
|