64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
package command
|
|
|
|
import (
|
|
"github.com/posener/complete"
|
|
)
|
|
|
|
// This file contains some re-usable predictors for auto-complete. The
|
|
// command-specific autocomplete configurations live within each command's
|
|
// own source file, as AutocompleteArgs and AutocompleteFlags methods on each
|
|
// Command implementation.
|
|
|
|
// For completing the value of boolean flags like -foo false
|
|
var completePredictBoolean = complete.PredictSet("true", "false")
|
|
|
|
// We don't currently have a real predictor for module sources, but
|
|
// we'll probably add one later.
|
|
var completePredictModuleSource = complete.PredictAnything
|
|
|
|
type completePredictSequence []complete.Predictor
|
|
|
|
func (s completePredictSequence) Predict(a complete.Args) []string {
|
|
// Nested subcommands do not require any placeholder entry for their subcommand name.
|
|
idx := len(a.Completed)
|
|
if idx >= len(s) {
|
|
return nil
|
|
}
|
|
|
|
return s[idx].Predict(a)
|
|
}
|
|
|
|
func (m *Meta) completePredictWorkspaceName() complete.Predictor {
|
|
return complete.PredictFunc(func(a complete.Args) []string {
|
|
// There are lot of things that can fail in here, so if we encounter
|
|
// any error then we'll just return nothing and not support autocomplete
|
|
// until whatever error is fixed. (The user can't actually see the error
|
|
// here, but other commands should produce a user-visible error before
|
|
// too long.)
|
|
|
|
// We assume here that we want to autocomplete for the current working
|
|
// directory, since we don't have enough context to know where to
|
|
// find any config path argument, and it might be _after_ the argument
|
|
// we're trying to complete here anyway.
|
|
configPath, err := ModulePath(nil)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
backendConfig, diags := m.loadBackendConfig(configPath)
|
|
if diags.HasErrors() {
|
|
return nil
|
|
}
|
|
|
|
b, diags := m.Backend(&BackendOpts{
|
|
Config: backendConfig,
|
|
})
|
|
if diags.HasErrors() {
|
|
return nil
|
|
}
|
|
|
|
names, _ := b.Workspaces()
|
|
return names
|
|
})
|
|
}
|