Interpret command flag aliases in the parser
This commit is contained in:
122
internal/cobra/flags.go
Normal file
122
internal/cobra/flags.go
Normal file
@@ -0,0 +1,122 @@
|
||||
package cobra
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
|
||||
)
|
||||
|
||||
func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []commandmeta.FlagAlias) ([]string, map[string][]string) {
|
||||
canonical := make(map[string]commandmeta.Flag, len(flags)*2+2)
|
||||
help := commandmeta.Flag{Name: "help", Short: "h", Boolean: true}
|
||||
canonical["--help"] = help
|
||||
canonical["-h"] = help
|
||||
for _, flag := range flags {
|
||||
canonical["--"+flag.Name] = flag
|
||||
if flag.Short != "" {
|
||||
canonical["-"+flag.Short] = flag
|
||||
}
|
||||
}
|
||||
|
||||
byAlias := make(map[string]commandmeta.Flag, len(aliases))
|
||||
for _, alias := range aliases {
|
||||
if target, ok := canonical[alias.Target]; ok {
|
||||
byAlias[alias.Source] = target
|
||||
}
|
||||
}
|
||||
|
||||
spellings := make(map[string][]string)
|
||||
interpreted := make([]string, 0, len(argv))
|
||||
for index := 0; index < len(argv); {
|
||||
token := argv[index]
|
||||
if token == "--" {
|
||||
interpreted = append(interpreted, argv[index:]...)
|
||||
break
|
||||
}
|
||||
if strings.HasPrefix(token, "--") && len(token) > 2 {
|
||||
body := token[2:]
|
||||
equal := strings.IndexByte(body, '=')
|
||||
inputName := body
|
||||
if equal >= 0 {
|
||||
inputName = body[:equal]
|
||||
}
|
||||
original := "--" + inputName
|
||||
flag, ok := canonical[original]
|
||||
if !ok {
|
||||
flag, ok = byAlias[original]
|
||||
}
|
||||
if !ok {
|
||||
interpreted = append(interpreted, token)
|
||||
index++
|
||||
continue
|
||||
}
|
||||
spellings[flag.Name] = append(spellings[flag.Name], original)
|
||||
if equal >= 0 {
|
||||
interpreted = append(interpreted, "--"+flag.Name+"="+body[equal+1:])
|
||||
index++
|
||||
continue
|
||||
}
|
||||
if !flag.Boolean && index+1 < len(argv) && argv[index+1] != "--" {
|
||||
interpreted = append(interpreted, "--"+flag.Name+"="+argv[index+1])
|
||||
index += 2
|
||||
continue
|
||||
}
|
||||
interpreted = append(interpreted, "--"+flag.Name)
|
||||
index++
|
||||
continue
|
||||
}
|
||||
if len(token) > 1 && token[0] == '-' {
|
||||
if token == "-" {
|
||||
interpreted = append(interpreted, token)
|
||||
index++
|
||||
continue
|
||||
}
|
||||
consumedNext := false
|
||||
for offset := 1; offset < len(token); {
|
||||
original := "-" + token[offset:offset+1]
|
||||
flag, ok := canonical[original]
|
||||
if !ok {
|
||||
flag, ok = byAlias[original]
|
||||
}
|
||||
if !ok {
|
||||
interpreted = append(interpreted, "-"+token[offset:])
|
||||
break
|
||||
}
|
||||
spellings[flag.Name] = append(spellings[flag.Name], original)
|
||||
suffix := token[offset+1:]
|
||||
if flag.Boolean {
|
||||
if strings.HasPrefix(suffix, "=") {
|
||||
interpreted = append(interpreted, "--"+flag.Name+"="+suffix[1:])
|
||||
break
|
||||
}
|
||||
interpreted = append(interpreted, "--"+flag.Name)
|
||||
offset++
|
||||
continue
|
||||
}
|
||||
if suffix != "" {
|
||||
value := suffix
|
||||
if strings.HasPrefix(value, "=") {
|
||||
value = value[1:]
|
||||
}
|
||||
interpreted = append(interpreted, "--"+flag.Name+"="+value)
|
||||
break
|
||||
}
|
||||
if index+1 < len(argv) && argv[index+1] != "--" {
|
||||
interpreted = append(interpreted, "--"+flag.Name+"="+argv[index+1])
|
||||
index += 2
|
||||
consumedNext = true
|
||||
break
|
||||
}
|
||||
interpreted = append(interpreted, "--"+flag.Name)
|
||||
break
|
||||
}
|
||||
if !consumedNext {
|
||||
index++
|
||||
}
|
||||
continue
|
||||
}
|
||||
interpreted = append(interpreted, token)
|
||||
index++
|
||||
}
|
||||
return interpreted, spellings
|
||||
}
|
||||
Reference in New Issue
Block a user