mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 23:02:31 +00:00
7e899cd340
This reverts commits 24cb8b1..d0abb37 from clap-rs/clap#1840 This is part of #16. clap-rs/clap#1840 wasn't the right call but we don't have time to make the decision now, so instead of having one option and changing it in 4.0, this reverts back to clap2 behavior.
568 lines
15 KiB
Rust
568 lines
15 KiB
Rust
use super::*;
|
|
|
|
fn build_app() -> App<'static> {
|
|
build_app_with_name("myapp")
|
|
}
|
|
|
|
fn build_app_with_name(s: &'static str) -> App<'static> {
|
|
App::new(s)
|
|
.version("3.0")
|
|
.setting(AppSettings::PropagateVersion)
|
|
.about("Tests completions")
|
|
.arg(
|
|
Arg::new("file")
|
|
.value_hint(ValueHint::FilePath)
|
|
.help("some input file"),
|
|
)
|
|
.subcommand(
|
|
App::new("test").about("tests things").arg(
|
|
Arg::new("case")
|
|
.long("case")
|
|
.takes_value(true)
|
|
.help("the case to test"),
|
|
),
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn zsh() {
|
|
let mut app = build_app();
|
|
common(Zsh, &mut app, "myapp", ZSH);
|
|
}
|
|
|
|
static ZSH: &str = r#"#compdef myapp
|
|
|
|
autoload -U is-at-least
|
|
|
|
_myapp() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
'::file -- some input file:_files' \
|
|
":: :_myapp_commands" \
|
|
"*::: :->myapp" \
|
|
&& ret=0
|
|
case $state in
|
|
(myapp)
|
|
words=($line[2] "${words[@]}")
|
|
(( CURRENT += 1 ))
|
|
curcontext="${curcontext%:*:*}:myapp-command-$line[2]:"
|
|
case $line[2] in
|
|
(test)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--case=[the case to test]: : ' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
;;
|
|
(help)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
&& ret=0
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
(( $+functions[_myapp_commands] )) ||
|
|
_myapp_commands() {
|
|
local commands; commands=(
|
|
'test:tests things' \
|
|
'help:Print this message or the help of the given subcommand(s)' \
|
|
)
|
|
_describe -t commands 'myapp commands' commands "$@"
|
|
}
|
|
(( $+functions[_myapp__help_commands] )) ||
|
|
_myapp__help_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'myapp help commands' commands "$@"
|
|
}
|
|
(( $+functions[_myapp__test_commands] )) ||
|
|
_myapp__test_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'myapp test commands' commands "$@"
|
|
}
|
|
|
|
_myapp "$@""#;
|
|
|
|
#[test]
|
|
fn zsh_with_special_commands() {
|
|
let mut app = build_app_special_commands();
|
|
common(Zsh, &mut app, "my_app", ZSH_SPECIAL_CMDS);
|
|
}
|
|
|
|
fn build_app_special_commands() -> App<'static> {
|
|
build_app_with_name("my_app")
|
|
.subcommand(
|
|
App::new("some_cmd").about("tests other things").arg(
|
|
Arg::new("config")
|
|
.long("--config")
|
|
.takes_value(true)
|
|
.help("the other case to test"),
|
|
),
|
|
)
|
|
.subcommand(App::new("some-cmd-with-hypens").alias("hyphen"))
|
|
.subcommand(
|
|
App::new("some_cmd_with_special_characters")
|
|
.about("This 'is' a \"special\" [character] string \\"),
|
|
)
|
|
}
|
|
|
|
static ZSH_SPECIAL_CMDS: &str = r#"#compdef my_app
|
|
|
|
autoload -U is-at-least
|
|
|
|
_my_app() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
'::file -- some input file:_files' \
|
|
":: :_my_app_commands" \
|
|
"*::: :->my_app" \
|
|
&& ret=0
|
|
case $state in
|
|
(my_app)
|
|
words=($line[2] "${words[@]}")
|
|
(( CURRENT += 1 ))
|
|
curcontext="${curcontext%:*:*}:my_app-command-$line[2]:"
|
|
case $line[2] in
|
|
(test)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--case=[the case to test]: : ' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
;;
|
|
(some_cmd)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--config=[the other case to test]: : ' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
;;
|
|
(some-cmd-with-hypens)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
;;
|
|
(some_cmd_with_special_characters)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
;;
|
|
(help)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
&& ret=0
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
(( $+functions[_my_app_commands] )) ||
|
|
_my_app_commands() {
|
|
local commands; commands=(
|
|
'test:tests things' \
|
|
'some_cmd:tests other things' \
|
|
'some-cmd-with-hypens:' \
|
|
'some_cmd_with_special_characters:This '\''is'\'' a "special" \[character\] string \\' \
|
|
'help:Print this message or the help of the given subcommand(s)' \
|
|
)
|
|
_describe -t commands 'my_app commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__help_commands] )) ||
|
|
_my_app__help_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app help commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__some-cmd-with-hypens_commands] )) ||
|
|
_my_app__some-cmd-with-hypens_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app some-cmd-with-hypens commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__some_cmd_commands] )) ||
|
|
_my_app__some_cmd_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app some_cmd commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__some_cmd_with_special_characters_commands] )) ||
|
|
_my_app__some_cmd_with_special_characters_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app some_cmd_with_special_characters commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__test_commands] )) ||
|
|
_my_app__test_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app test commands' commands "$@"
|
|
}
|
|
|
|
_my_app "$@""#;
|
|
|
|
#[test]
|
|
fn zsh_with_special_help() {
|
|
let mut app = build_app_special_help();
|
|
common(Zsh, &mut app, "my_app", ZSH_SPECIAL_HELP);
|
|
}
|
|
|
|
fn build_app_special_help() -> App<'static> {
|
|
App::new("my_app")
|
|
.version("3.0")
|
|
.arg(
|
|
Arg::new("single-quotes")
|
|
.long("single-quotes")
|
|
.help("Can be 'always', 'auto', or 'never'"),
|
|
)
|
|
.arg(
|
|
Arg::new("double-quotes")
|
|
.long("double-quotes")
|
|
.help("Can be \"always\", \"auto\", or \"never\""),
|
|
)
|
|
.arg(
|
|
Arg::new("backticks")
|
|
.long("backticks")
|
|
.help("For more information see `echo test`"),
|
|
)
|
|
.arg(Arg::new("backslash").long("backslash").help("Avoid '\\n'"))
|
|
.arg(
|
|
Arg::new("brackets")
|
|
.long("brackets")
|
|
.help("List packages [filter]"),
|
|
)
|
|
.arg(
|
|
Arg::new("expansions")
|
|
.long("expansions")
|
|
.help("Execute the shell command with $SHELL"),
|
|
)
|
|
}
|
|
|
|
static ZSH_SPECIAL_HELP: &str = r#"#compdef my_app
|
|
|
|
autoload -U is-at-least
|
|
|
|
_my_app() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
'--single-quotes[Can be '\''always'\'', '\''auto'\'', or '\''never'\'']' \
|
|
'--double-quotes[Can be "always", "auto", or "never"]' \
|
|
'--backticks[For more information see `echo test`]' \
|
|
'--backslash[Avoid '\''\\n'\'']' \
|
|
'--brackets[List packages \[filter\]]' \
|
|
'--expansions[Execute the shell command with $SHELL]' \
|
|
&& ret=0
|
|
}
|
|
|
|
(( $+functions[_my_app_commands] )) ||
|
|
_my_app_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app commands' commands "$@"
|
|
}
|
|
|
|
_my_app "$@""#;
|
|
|
|
#[test]
|
|
fn zsh_with_nested_subcommands() {
|
|
let mut app = build_app_nested_subcommands();
|
|
common(Zsh, &mut app, "my_app", ZSH_NESTED_SUBCOMMANDS);
|
|
}
|
|
|
|
fn build_app_nested_subcommands() -> App<'static> {
|
|
App::new("first")
|
|
.version("3.0")
|
|
.subcommand(App::new("second").subcommand(App::new("third")))
|
|
}
|
|
|
|
static ZSH_NESTED_SUBCOMMANDS: &str = r#"#compdef my_app
|
|
|
|
autoload -U is-at-least
|
|
|
|
_my_app() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
":: :_my_app_commands" \
|
|
"*::: :->first" \
|
|
&& ret=0
|
|
case $state in
|
|
(first)
|
|
words=($line[1] "${words[@]}")
|
|
(( CURRENT += 1 ))
|
|
curcontext="${curcontext%:*:*}:my_app-command-$line[1]:"
|
|
case $line[1] in
|
|
(second)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
":: :_my_app__second_commands" \
|
|
"*::: :->second" \
|
|
&& ret=0
|
|
|
|
case $state in
|
|
(second)
|
|
words=($line[1] "${words[@]}")
|
|
(( CURRENT += 1 ))
|
|
curcontext="${curcontext%:*:*}:my_app-second-command-$line[1]:"
|
|
case $line[1] in
|
|
(third)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--version[Print version information]' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
&& ret=0
|
|
;;
|
|
(help)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--version[Print version information]' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
&& ret=0
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
(help)
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
&& ret=0
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
(( $+functions[_my_app_commands] )) ||
|
|
_my_app_commands() {
|
|
local commands; commands=(
|
|
'second:' \
|
|
'help:Print this message or the help of the given subcommand(s)' \
|
|
)
|
|
_describe -t commands 'my_app commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__help_commands] )) ||
|
|
_my_app__help_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app help commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__second__help_commands] )) ||
|
|
_my_app__second__help_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app second help commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__second_commands] )) ||
|
|
_my_app__second_commands() {
|
|
local commands; commands=(
|
|
'third:' \
|
|
'help:Print this message or the help of the given subcommand(s)' \
|
|
)
|
|
_describe -t commands 'my_app second commands' commands "$@"
|
|
}
|
|
(( $+functions[_my_app__second__third_commands] )) ||
|
|
_my_app__second__third_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app second third commands' commands "$@"
|
|
}
|
|
|
|
_my_app "$@""#;
|
|
|
|
#[test]
|
|
fn zsh_with_aliases() {
|
|
let mut app = build_app_with_aliases();
|
|
common(Zsh, &mut app, "cmd", ZSH_ALIASES);
|
|
}
|
|
|
|
fn build_app_with_aliases() -> App<'static> {
|
|
App::new("cmd")
|
|
.version("3.0")
|
|
.about("testing bash completions")
|
|
.arg(
|
|
Arg::new("flag")
|
|
.short('f')
|
|
.visible_short_alias('F')
|
|
.long("flag")
|
|
.visible_alias("flg")
|
|
.help("cmd flag"),
|
|
)
|
|
.arg(
|
|
Arg::new("option")
|
|
.short('o')
|
|
.visible_short_alias('O')
|
|
.long("option")
|
|
.visible_alias("opt")
|
|
.help("cmd option")
|
|
.takes_value(true),
|
|
)
|
|
.arg(Arg::new("positional"))
|
|
}
|
|
|
|
static ZSH_ALIASES: &str = r#"#compdef cmd
|
|
|
|
autoload -U is-at-least
|
|
|
|
_cmd() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'-o+[cmd option]: : ' \
|
|
'-O+[cmd option]: : ' \
|
|
'--option=[cmd option]: : ' \
|
|
'--opt=[cmd option]: : ' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
'-f[cmd flag]' \
|
|
'-F[cmd flag]' \
|
|
'--flag[cmd flag]' \
|
|
'--flg[cmd flag]' \
|
|
'::positional:' \
|
|
&& ret=0
|
|
}
|
|
|
|
(( $+functions[_cmd_commands] )) ||
|
|
_cmd_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'cmd commands' commands "$@"
|
|
}
|
|
|
|
_cmd "$@""#;
|
|
|
|
#[test]
|
|
fn zsh_with_files_and_dirs() {
|
|
let mut app = build_app_with_files_and_dirs();
|
|
common(Zsh, &mut app, "my_app", ZSH_PATHS);
|
|
}
|
|
|
|
fn build_app_with_files_and_dirs() -> App<'static> {
|
|
App::new("my_app")
|
|
.version("3.0")
|
|
.about("testing zsh completions")
|
|
.arg(
|
|
Arg::new("directory")
|
|
.long("dir")
|
|
.help("specify a directory")
|
|
.value_name("DIR")
|
|
.number_of_values(3)
|
|
.value_hint(ValueHint::DirPath),
|
|
)
|
|
.arg(
|
|
Arg::new("file")
|
|
.long("inputfiles")
|
|
.value_name("FILE")
|
|
.multiple_occurrences(true)
|
|
.help("specify a file")
|
|
.value_hint(ValueHint::FilePath),
|
|
)
|
|
}
|
|
|
|
static ZSH_PATHS: &str = r#"#compdef my_app
|
|
|
|
autoload -U is-at-least
|
|
|
|
_my_app() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
_arguments "${_arguments_options[@]}" \
|
|
'--dir=[specify a directory]:DIR:_files -/:DIR:_files -/:DIR:_files -/' \
|
|
'*--inputfiles=[specify a file]:FILE:_files' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
&& ret=0
|
|
}
|
|
|
|
(( $+functions[_my_app_commands] )) ||
|
|
_my_app_commands() {
|
|
local commands; commands=()
|
|
_describe -t commands 'my_app commands' commands "$@"
|
|
}
|
|
|
|
_my_app "$@""#;
|