Files
commandkit/completion.go

56 lines
1.8 KiB
Go
Raw Normal View History

package commandkit
import commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
// CompletionChoice is a literal suggested value and its optional description.
type CompletionChoice struct {
Value string
Description string
}
// CompletionHint selects suggestions for a flag or positional value. Its zero
// value requests no value suggestions; hints do not constrain accepted input.
type CompletionHint struct {
kind completionHintKind
choices []CompletionChoice
}
type completionHintKind uint8
const (
completionNone completionHintKind = iota
completionChoices
completionFiles
completionDirectories
)
// CompleteChoices suggests literal values. The supplied slice is copied.
func CompleteChoices(choices ...CompletionChoice) CompletionHint {
return CompletionHint{kind: completionChoices, choices: append([]CompletionChoice(nil), choices...)}
}
// CompleteFiles requests shell filename completion.
func CompleteFiles() CompletionHint { return CompletionHint{kind: completionFiles} }
// CompleteDirectories requests shell directory completion.
func CompleteDirectories() CompletionHint { return CompletionHint{kind: completionDirectories} }
// NoCompletion requests no value suggestions.
func NoCompletion() CompletionHint { return CompletionHint{} }
func bridgeCompletion(hint CompletionHint) commandmeta.CompletionHint {
result := commandmeta.CompletionHint{}
switch hint.kind {
case completionChoices:
result.Kind = commandmeta.CompletionChoices
for _, choice := range hint.choices {
result.Choices = append(result.Choices, commandmeta.CompletionChoice{Value: choice.Value, Description: choice.Description})
}
case completionFiles:
result.Kind = commandmeta.CompletionFiles
case completionDirectories:
result.Kind = commandmeta.CompletionDirectories
}
return result
}