| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package backendrun | |
| import ( | |
| "github.com/hashicorp/cli" | |
| "github.com/mitchellh/colorstring" | |
| "github.com/hashicorp/terraform/internal/backend" | |
| "github.com/hashicorp/terraform/internal/terminal" | |
| "github.com/hashicorp/terraform/internal/terraform" | |
| ) | |
| // CLI is an optional interface that can be implemented to be initialized | |
| // with information from the Terraform CLI. If this is implemented, this | |
| // initialization function will be called with data to help interact better | |
| // with a CLI. | |
| // | |
| // This interface was created to improve backend interaction with the | |
| // official Terraform CLI while making it optional for API users to have | |
| // to provide full CLI interaction to every backend. | |
| // | |
| // If you're implementing a Backend, it is acceptable to require CLI | |
| // initialization. In this case, your backend should be coded to error | |
| // on other methods (such as State, Operation) if CLI initialization was not | |
| // done with all required fields. | |
| type CLI interface { | |
| backend.Backend | |
| // CLIInit is called once with options. The options passed to this | |
| // function may not be modified after calling this since they can be | |
| // read/written at any time by the Backend implementation. | |
| // | |
| // This may be called before or after Configure is called, so if settings | |
| // here affect configurable settings, care should be taken to handle | |
| // whether they should be overwritten or not. | |
| CLIInit(*CLIOpts) error | |
| } | |
| // CLIOpts are the options passed into CLIInit for the CLI interface. | |
| // | |
| // These options represent the functionality the CLI exposes and often | |
| // maps to meta-flags available on every CLI (such as -input). | |
| // | |
| // When implementing a backend, it isn't expected that every option applies. | |
| // Your backend should be documented clearly to explain to end users what | |
| // options have an affect and what won't. In some cases, it may even make sense | |
| // to error in your backend when an option is set so that users don't make | |
| // a critically incorrect assumption about behavior. | |
| type CLIOpts struct { | |
| // CLI and Colorize control the CLI output. If CLI is nil then no CLI | |
| // output will be done. If CLIColor is nil then no coloring will be done. | |
| CLI cli.Ui | |
| CLIColor *colorstring.Colorize | |
| // Streams describes the low-level streams for Stdout, Stderr and Stdin, | |
| // including some metadata about whether they are terminals. Most output | |
| // should go via the object in field CLI above, but Streams can be useful | |
| // for tailoring the output to fit the attached terminal, for example. | |
| Streams *terminal.Streams | |
| // StatePath is the local path where state is read from. | |
| // | |
| // StateOutPath is the local path where the state will be written. | |
| // If this is empty, it will default to StatePath. | |
| // | |
| // StateBackupPath is the local path where a backup file will be written. | |
| // If this is empty, no backup will be taken. | |
| StatePath string | |
| StateOutPath string | |
| StateBackupPath string | |
| // ContextOpts are the base context options to set when initializing a | |
| // Terraform context. Many of these will be overridden or merged by | |
| // Operation. See Operation for more details. | |
| ContextOpts *terraform.ContextOpts | |
| // Input will ask for necessary input prior to performing any operations. | |
| // | |
| // Validation will perform validation prior to running an operation. The | |
| // variable naming doesn't match the style of others since we have a func | |
| // Validate. | |
| Input bool | |
| Validation bool | |
| // RunningInAutomation indicates that commands are being run by an | |
| // automated system rather than directly at a command prompt. | |
| // | |
| // This is a hint not to produce messages that expect that a user can | |
| // run a follow-up command, perhaps because Terraform is running in | |
| // some sort of workflow automation tool that abstracts away the | |
| // exact commands that are being run. | |
| RunningInAutomation bool | |
| } |