From 2892e55aa00ef772af44efadb4df32012e162bce Mon Sep 17 00:00:00 2001 From: sigoden Date: Sun, 9 Jun 2024 05:55:29 +0800 Subject: [PATCH] feat: auto alias subcmds with hyphens for underscores (#336) --- src/command/mod.rs | 13 +++++ tests/compgen.rs | 10 ++++ ...ation__compgen__auto_alias_subcommand.snap | 12 +++++ ...egration__spec__auto_alias_subcommand.snap | 52 +++++++++++++++++++ tests/spec.rs | 16 ++++++ 5 files changed, 103 insertions(+) create mode 100644 tests/snapshots/integration__compgen__auto_alias_subcommand.snap create mode 100644 tests/snapshots/integration__spec__auto_alias_subcommand.snap diff --git a/src/command/mod.rs b/src/command/mod.rs index 80230e2..e751417 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -496,6 +496,19 @@ impl Command { fn update_recursively(&mut self, paths: Vec, mut require_tools: IndexSet) { self.paths.clone_from(&paths); + // auto alias if command name contains `_` + if let Some(name) = self.name.clone() { + let compatible_name = name.replace('_', "-"); + if compatible_name != name { + match self.aliases.as_mut() { + Some((aliaes, _)) => aliaes.insert(0, compatible_name), + None => { + self.aliases = Some((vec![compatible_name], Position::default())); + } + } + } + } + // update command_fn if paths.is_empty() { if self.share.borrow().fns.contains_key(MAIN_NAME) { diff --git a/tests/compgen.rs b/tests/compgen.rs index e1f9097..ea1de8e 100644 --- a/tests/compgen.rs +++ b/tests/compgen.rs @@ -819,6 +819,16 @@ _choice_fn() { snapshot_compgen!(script, [vec!["prog", ""], vec!["prog", "abc", ""]]); } +#[test] +fn auto_alias_subcommand() { + let script = r###" +# @cmd +cmd_a() { :; } +"###; + + snapshot_compgen!(script, [vec!["prog", ""], vec!["prog", "cmd"]]); +} + #[test] fn multi_char() { let script = r#" diff --git a/tests/snapshots/integration__compgen__auto_alias_subcommand.snap b/tests/snapshots/integration__compgen__auto_alias_subcommand.snap new file mode 100644 index 0000000..6914f91 --- /dev/null +++ b/tests/snapshots/integration__compgen__auto_alias_subcommand.snap @@ -0,0 +1,12 @@ +--- +source: tests/compgen.rs +expression: data +--- +************ COMPGEN `prog ` ************ +cmd_a /color:magenta +cmd-a /color:magenta +help /color:magenta + +************ COMPGEN `prog cmd` ************ +cmd_a /color:magenta +cmd-a /color:magenta diff --git a/tests/snapshots/integration__spec__auto_alias_subcommand.snap b/tests/snapshots/integration__spec__auto_alias_subcommand.snap new file mode 100644 index 0000000..304f272 --- /dev/null +++ b/tests/snapshots/integration__spec__auto_alias_subcommand.snap @@ -0,0 +1,52 @@ +--- +source: tests/spec.rs +expression: data +--- +************ RUN ************ +prog -h + +# OUTPUT +command cat >&2 <<-'EOF' +USAGE: prog + +COMMANDS: + cmd_a [aliases: cmd-a] + +EOF +exit 0 + +# RUN_OUTPUT +USAGE: prog + +COMMANDS: + cmd_a [aliases: cmd-a] + +************ RUN ************ +prog cmd_a + +# OUTPUT +argc__args=( prog cmd_a ) +argc__fn=cmd_a +argc__positionals=( ) +cmd_a + +# RUN_OUTPUT +argc__args=([0]="prog" [1]="cmd_a") +argc__fn=cmd_a +argc__positionals=() +cmd_a + +************ RUN ************ +prog cmd-a + +# OUTPUT +argc__args=( prog cmd-a ) +argc__fn=cmd_a +argc__positionals=( ) +cmd_a + +# RUN_OUTPUT +argc__args=([0]="prog" [1]="cmd-a") +argc__fn=cmd_a +argc__positionals=() +cmd_a diff --git a/tests/spec.rs b/tests/spec.rs index 488abcc..67ac279 100644 --- a/tests/spec.rs +++ b/tests/spec.rs @@ -390,3 +390,19 @@ cmdb() { :; } ] ); } + +#[test] +fn auto_alias_subcommand() { + let script = r###" +# @cmd +cmd_a() { :; } +"###; + snapshot_multi!( + script, + [ + vec!["prog", "-h"], + vec!["prog", "cmd_a"], + vec!["prog", "cmd-a"], + ] + ); +}