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

@@ -7,7 +7,7 @@ import (
commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
)
func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []commandmeta.FlagAlias) ([]string, map[string][]string, *commandmeta.Failure) {
func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []commandmeta.FlagAlias) ([]string, map[string][]string, []commandmeta.FlagOccurrence, *commandmeta.Failure) {
canonical := make(map[string]commandmeta.Flag, len(flags)*2+2)
help := commandmeta.Flag{Name: "help", Short: "h", Boolean: true}
canonical["--help"] = help
@@ -27,7 +27,9 @@ func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []comm
}
spellings := make(map[string][]string)
occurrences := make([]commandmeta.FlagOccurrence, 0, len(argv))
interpreted := make([]string, 0, len(argv))
recordingOccurrences := true
for index := 0; index < len(argv); {
token := argv[index]
if token == "--" {
@@ -48,22 +50,34 @@ func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []comm
}
if !ok {
interpreted = append(interpreted, token)
recordingOccurrences = false
index++
continue
}
spellings[flag.Name] = append(spellings[flag.Name], original)
if equal >= 0 {
interpreted = append(interpreted, "--"+flag.Name+"="+body[equal+1:])
value := body[equal+1:]
interpreted = append(interpreted, "--"+flag.Name+"="+value)
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
}
index++
continue
}
if !flag.Boolean && index+1 < len(argv) {
interpreted = append(interpreted, "--"+flag.Name+"="+argv[index+1])
value := argv[index+1]
interpreted = append(interpreted, "--"+flag.Name+"="+value)
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
}
index += 2
continue
}
if !flag.Boolean {
return interpreted, spellings, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)}
return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)}
}
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: "true"})
}
interpreted = append(interpreted, "--"+flag.Name)
index++
@@ -84,15 +98,23 @@ func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []comm
}
if !ok {
interpreted = append(interpreted, "-"+token[offset:])
recordingOccurrences = false
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:])
value := suffix[1:]
interpreted = append(interpreted, "--"+flag.Name+"="+value)
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
}
break
}
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: "true"})
}
interpreted = append(interpreted, "--"+flag.Name)
offset++
continue
@@ -103,15 +125,22 @@ func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []comm
value = value[1:]
}
interpreted = append(interpreted, "--"+flag.Name+"="+value)
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
}
break
}
if index+1 < len(argv) {
interpreted = append(interpreted, "--"+flag.Name+"="+argv[index+1])
value := argv[index+1]
interpreted = append(interpreted, "--"+flag.Name+"="+value)
if recordingOccurrences {
occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value})
}
index += 2
consumedNext = true
break
}
return interpreted, spellings, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)}
return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)}
}
if !consumedNext {
index++
@@ -121,5 +150,5 @@ func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []comm
interpreted = append(interpreted, token)
index++
}
return interpreted, spellings, nil
return interpreted, spellings, occurrences, nil
}