Files
commandkit/internal/cobra/flags.go

123 lines
3.1 KiB
Go

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) {
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) {
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
}