1 //! Example to test arguments with different `ValueHint` values. 2 //! 3 //! Usage with zsh: 4 //! ```console 5 //! $ cargo run --example completion -- --generate=zsh > /usr/local/share/zsh/site-functions/_completion$ 6 //! $ compinit 7 //! $ ./target/debug/examples/completion --<TAB> 8 //! ``` 9 //! fish: 10 //! ```console 11 //! $ cargo run --example completion -- --generate=fish > completion.fish 12 //! $ . ./completion.fish 13 //! $ ./target/debug/examples/completion --<TAB> 14 //! ``` 15 use clap::{value_parser, Arg, Command, ValueHint}; 16 use clap_complete::{generate, Generator, Shell}; 17 use std::io; 18 build_cli() -> Command19 fn build_cli() -> Command { 20 let value_hint_command = Command::new("value-hint") 21 .visible_alias("hint") 22 .arg( 23 Arg::new("unknown") 24 .long("unknown") 25 .value_hint(ValueHint::Unknown), 26 ) 27 .arg(Arg::new("other").long("other").value_hint(ValueHint::Other)) 28 .arg( 29 Arg::new("path") 30 .long("path") 31 .short('p') 32 .value_hint(ValueHint::AnyPath), 33 ) 34 .arg( 35 Arg::new("file") 36 .long("file") 37 .short('f') 38 .value_hint(ValueHint::FilePath), 39 ) 40 .arg( 41 Arg::new("dir") 42 .long("dir") 43 .short('d') 44 .value_hint(ValueHint::DirPath), 45 ) 46 .arg( 47 Arg::new("exe") 48 .long("exe") 49 .short('e') 50 .value_hint(ValueHint::ExecutablePath), 51 ) 52 .arg( 53 Arg::new("cmd_name") 54 .long("cmd-name") 55 .value_hint(ValueHint::CommandName), 56 ) 57 .arg( 58 Arg::new("cmd") 59 .long("cmd") 60 .short('c') 61 .value_hint(ValueHint::CommandString), 62 ) 63 .arg( 64 Arg::new("command_with_args") 65 .num_args(1..) 66 // AppSettings::TrailingVarArg is required to use ValueHint::CommandWithArguments 67 .trailing_var_arg(true) 68 .value_hint(ValueHint::CommandWithArguments), 69 ) 70 .arg( 71 Arg::new("user") 72 .short('u') 73 .long("user") 74 .value_hint(ValueHint::Username), 75 ) 76 .arg( 77 Arg::new("host") 78 .long("host") 79 .value_hint(ValueHint::Hostname), 80 ) 81 .arg(Arg::new("url").long("url").value_hint(ValueHint::Url)) 82 .arg( 83 Arg::new("email") 84 .long("email") 85 .value_hint(ValueHint::EmailAddress), 86 ); 87 88 Command::new("completion") 89 .arg( 90 Arg::new("generator") 91 .long("generate") 92 .value_parser(value_parser!(Shell)), 93 ) 94 .subcommand(value_hint_command) 95 } 96 print_completions<G: Generator>(gen: G, cmd: &mut Command)97 fn print_completions<G: Generator>(gen: G, cmd: &mut Command) { 98 generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout()); 99 } 100 main()101 fn main() { 102 let matches = build_cli().get_matches(); 103 104 if let Some(generator) = matches.get_one::<Shell>("generator") { 105 let mut cmd = build_cli(); 106 eprintln!("Generating completion file for {generator}..."); 107 print_completions(*generator, &mut cmd); 108 } 109 } 110