Files
commandkit/internal/cobra/flags.go

68 lines
2.0 KiB
Go
Raw Permalink Normal View History

package cobra
import (
"fmt"
2026-11-04 03:49:38 +00:00
commandmeta "go.maximumdirect.net/commandkit/internal/commandmeta"
)
func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []commandmeta.FlagAlias) ([]string, map[string][]string, []commandmeta.FlagOccurrence, *commandmeta.Failure) {
lookup := commandmeta.NewFlagLookup(flags, aliases)
spellings := make(map[string][]string)
var occurrences []commandmeta.FlagOccurrence
var interpreted []string
for index := 0; index < len(argv); {
token := argv[index]
kind := commandmeta.ClassifyFlagToken(token)
if kind == commandmeta.TerminatorToken {
interpreted = append(interpreted, argv[index:]...)
break
}
if kind == commandmeta.LongFlagToken || kind == commandmeta.ShortFlagToken {
offset := 1
consumedNext := false
for {
fact := commandmeta.ConsumeFlag(lookup, token, offset)
if !fact.Found {
if kind == commandmeta.ShortFlagToken {
interpreted = append(interpreted, "-"+token[offset:])
} else {
interpreted = append(interpreted, token)
}
return interpreted, spellings, occurrences, nil
}
flag, original := fact.Flag, fact.Spelling
spellings[flag.Name] = append(spellings[flag.Name], original)
value := fact.Value
if fact.NeedsNext {
if index+1 >= len(argv) {
return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)}
}
value = argv[index+1]
consumedNext = true
}
if !fact.Attached && !fact.NeedsNext {
value = "true"
interpreted = append(interpreted, "--"+flag.Name)
} else {
interpreted = append(interpreted, "--"+flag.Name+"="+value)
}
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
if fact.NextOffset == 0 {
break
}
offset = fact.NextOffset
}
index++
if consumedNext {
index++
}
continue
}
interpreted = append(interpreted, token)
index++
}
return interpreted, spellings, occurrences, nil
}