Restore comparability of completion metadata
This commit is contained in:
@@ -61,7 +61,12 @@ type CompletionChoice struct {
|
|||||||
// value requests no value suggestions; hints do not constrain accepted input.
|
// value requests no value suggestions; hints do not constrain accepted input.
|
||||||
type CompletionHint struct {
|
type CompletionHint struct {
|
||||||
kind completionHintKind
|
kind completionHintKind
|
||||||
choices []CompletionChoice
|
choices *completionChoicesData
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep the public metadata structs comparable without exposing mutable choices.
|
||||||
|
type completionChoicesData struct {
|
||||||
|
values []CompletionChoice
|
||||||
}
|
}
|
||||||
|
|
||||||
type completionHintKind uint8
|
type completionHintKind uint8
|
||||||
@@ -78,7 +83,11 @@ const (
|
|||||||
// values and values containing a newline, tab, or NUL cannot be presented as
|
// values and values containing a newline, tab, or NUL cannot be presented as
|
||||||
// suggestions, but remain valid input if the command's converter accepts them.
|
// suggestions, but remain valid input if the command's converter accepts them.
|
||||||
func CompleteChoices(choices ...CompletionChoice) CompletionHint {
|
func CompleteChoices(choices ...CompletionChoice) CompletionHint {
|
||||||
return CompletionHint{kind: completionChoices, choices: append([]CompletionChoice(nil), choices...)}
|
hint := CompletionHint{kind: completionChoices}
|
||||||
|
if len(choices) != 0 {
|
||||||
|
hint.choices = &completionChoicesData{values: append([]CompletionChoice(nil), choices...)}
|
||||||
|
}
|
||||||
|
return hint
|
||||||
}
|
}
|
||||||
|
|
||||||
// CompleteFiles requests shell filename completion.
|
// CompleteFiles requests shell filename completion.
|
||||||
@@ -95,7 +104,10 @@ func bridgeCompletion(hint CompletionHint) commandmeta.CompletionHint {
|
|||||||
switch hint.kind {
|
switch hint.kind {
|
||||||
case completionChoices:
|
case completionChoices:
|
||||||
result.Kind = commandmeta.CompletionChoices
|
result.Kind = commandmeta.CompletionChoices
|
||||||
for _, choice := range hint.choices {
|
if hint.choices == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for _, choice := range hint.choices.values {
|
||||||
result.Choices = append(result.Choices, commandmeta.CompletionChoice{Value: choice.Value, Description: choice.Description})
|
result.Choices = append(result.Choices, commandmeta.CompletionChoice{Value: choice.Value, Description: choice.Description})
|
||||||
}
|
}
|
||||||
case completionFiles:
|
case completionFiles:
|
||||||
|
|||||||
@@ -8,6 +8,14 @@ import (
|
|||||||
commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
|
commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Existing consumer code can compare these metadata values or use them as keys.
|
||||||
|
var (
|
||||||
|
_ map[FlagMeta]struct{}
|
||||||
|
_ map[ArgumentMeta]struct{}
|
||||||
|
_ = (FlagMeta{}) == (FlagMeta{})
|
||||||
|
_ = (ArgumentMeta{}) == (ArgumentMeta{})
|
||||||
|
)
|
||||||
|
|
||||||
func TestCompletionHintsFollowCapturedBindings(t *testing.T) {
|
func TestCompletionHintsFollowCapturedBindings(t *testing.T) {
|
||||||
type inner struct{ values Supplied[[]string] }
|
type inner struct{ values Supplied[[]string] }
|
||||||
type outer struct{ flags FlagValues[inner] }
|
type outer struct{ flags FlagValues[inner] }
|
||||||
|
|||||||
@@ -88,7 +88,9 @@ control record cannot appear as a candidate.
|
|||||||
|
|
||||||
### 4. Preserve comparability of public metadata
|
### 4. Preserve comparability of public metadata
|
||||||
|
|
||||||
Priority: P2. Status: open.
|
Priority: P2. Status: complete.
|
||||||
|
|
||||||
|
- [x] Completed: Choice hints now point to privately owned copied data. Compile checks cover comparison and map keys for both metadata types; the root suite passes.
|
||||||
|
|
||||||
[CompletionHint](../../completion.go#L62) embeds a slice by value. Adding it
|
[CompletionHint](../../completion.go#L62) embeds a slice by value. Adding it
|
||||||
to [FlagMeta and ArgumentMeta](../../command.go#L93) makes both existing exported
|
to [FlagMeta and ArgumentMeta](../../command.go#L93) makes both existing exported
|
||||||
|
|||||||
Reference in New Issue
Block a user