| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package command | |
| import ( | |
| "github.com/hashicorp/terraform/internal/command/arguments" | |
| "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 | |
| } | |
| b, diags := m.backend(configPath, arguments.ViewHuman) | |
| if diags.HasErrors() { | |
| return nil | |
| } | |
| names, _ := b.Workspaces() | |
| if len(names) == 0 { | |
| // Presence of the "default" isn't always guaranteed | |
| // Backends will report it as always existing, pluggable | |
| // state stores will only do so if it _actually_ exists. | |
| return nil | |
| } | |
| return names | |
| }) | |
| } |