// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package backend import ( "github.com/mitchellh/cli" "github.com/mitchellh/colorstring" "github.com/opentofu/opentofu/internal/terminal" "github.com/opentofu/opentofu/internal/tofu" ) // CLI is an optional interface that can be implemented to be initialized // with information from the OpenTofu 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 OpenTofu 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 // 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 // OpenTofu context. Many of these will be overridden or merged by // Operation. See Operation for more details. ContextOpts *tofu.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 OpenTofu is running in // some sort of workflow automation tool that abstracts away the // exact commands that are being run. RunningInAutomation bool }