Add the ability to tell which of the aliases was the Command actually called with

Introduces a CalledName() method on Command (plus a private member in Command)
which stores the alias that the command was originally called as (or Name() if
it was the "Use" name)
This commit is contained in:
Jose Luis Tallon 2016-08-15 20:16:03 +02:00
parent f62e98d28a
commit b83ace34b5

View file

@ -96,6 +96,8 @@ type Command struct {
PersistentPostRunE func(cmd *Command, args []string) error
// DisableAutoGenTag remove
DisableAutoGenTag bool
// Contains the 'calledName' rather than the alias that matched
calledName string
// Commands is the list of commands supported by this program.
commands []*Command
// Parent Command for this command
@ -431,7 +433,11 @@ func (c *Command) Find(args []string) (*Command, []string, error) {
nextSubCmd := argsWOflags[0]
matches := make([]*Command, 0)
for _, cmd := range c.commands {
if cmd.Name() == nextSubCmd || cmd.HasAlias(nextSubCmd) { // exact name or alias match
if cmd.Name() == nextSubCmd { // exact name
return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd))
}
if cmd.HasAlias(nextSubCmd) { // alias match
cmd.calledName = nextSubCmd
return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd))
}
if EnablePrefixMatching {
@ -926,6 +932,14 @@ func (c *Command) Name() string {
return name
}
// CalledName returns how this command was called as (rather than its name)
func (c *Command) CalledName() string {
if "" == c.calledName {
return c.Name()
}
return c.calledName
}
// HasAlias determines if a given string is an alias of the command.
func (c *Command) HasAlias(s string) bool {
for _, a := range c.Aliases {