Preserve reporting flag occurrence order

This commit is contained in:
2026-10-26 02:55:08 +00:00
parent f3bd6dc2ae
commit df21b75f9c
7 changed files with 320 additions and 19 deletions

View File

@@ -80,7 +80,7 @@ func (session *Session) Parse(argv []string) commandmeta.Result {
localFlags := make([]commandmeta.Flag, 0, len(selectedNode.Flags)+len(selectedNode.CoreFlags))
localFlags = append(localFlags, selectedNode.Flags...)
localFlags = append(localFlags, selectedNode.CoreFlags...)
interpreted, spellings, interpretationFailure := interpretFlagTokens(remaining, localFlags, session.flagAliases)
interpreted, spellings, occurrences, interpretationFailure := interpretFlagTokens(remaining, localFlags, session.flagAliases)
for _, flag := range localFlags {
if value := selected.Flags().Lookup(flag.Name); value != nil {
value.Value.(*rawValue).queueSpellings(spellings[flag.Name])
@@ -90,14 +90,17 @@ func (session *Session) Parse(argv []string) commandmeta.Result {
helpFlag.Value.(*rawValue).queueSpellings(spellings["help"])
}
if err := selected.ParseFlags(interpreted); err != nil {
result.FlagOccurrences = occurrences
return failure(result, err.Error())
}
// Parse the completed prefix first so an earlier backend failure keeps its
// precedence over a missing value discovered while interpreting aliases.
if interpretationFailure != nil {
result.FlagOccurrences = occurrences
result.Failure = interpretationFailure
return result
}
result.FlagOccurrences = occurrences
operands := selected.Flags().Args()
result.Operands = append([]string(nil), operands...)
@@ -113,6 +116,15 @@ func (session *Session) Parse(argv []string) commandmeta.Result {
if helpFlag := selected.Flags().Lookup("help"); helpFlag != nil {
helpRequested, err := helpFlag.Value.(*rawValue).lastBool()
if err != nil {
for index, occurrence := range result.FlagOccurrences {
if occurrence.Name != "help" {
continue
}
if _, parseErr := strconv.ParseBool(occurrence.RawValue); parseErr != nil {
result.FlagOccurrences = result.FlagOccurrences[:index+1]
break
}
}
return failure(result, err.Error())
}
result.HelpRequested = helpRequested