| 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 |
| }) |
| } |