56 lines
1.8 KiB
Go
56 lines
1.8 KiB
Go
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
|
|
}
|