mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 01:41:48 -06:00
4991cc4835
Errors encountered when parsing flags for apply, plan, and refresh were being suppressed. This resulted in a generic usage error when using an invalid `-target` flag. This commit makes several changes to address this. First, these commands now output the flag parse error before exiting, leaving at least some hint about the error. You can verify this manually with something like: terraform apply -invalid-flag We also change how target attributes are parsed, moving the responsibility from the flags instance to the command. This allows us to customize the diagnostic output to be more user friendly. The diagnostics now look like: ```shellsession $ terraform apply -no-color -target=foo Error: Invalid target "foo" Resource specification must include a resource type and name. ``` Finally, we add test coverage for both parsing of target flags, and at the command level for successful use of resource targeting. These tests focus on the UI output (via the change summary and refresh logs), as the functionality of targeting is covered by the context tests in the terraform package.
44 lines
910 B
Go
44 lines
910 B
Go
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// FlagStringKV is a flag.Value implementation for parsing user variables
|
|
// from the command-line in the format of '-var key=value', where value is
|
|
// only ever a primitive.
|
|
type FlagStringKV map[string]string
|
|
|
|
func (v *FlagStringKV) String() string {
|
|
return ""
|
|
}
|
|
|
|
func (v *FlagStringKV) Set(raw string) error {
|
|
idx := strings.Index(raw, "=")
|
|
if idx == -1 {
|
|
return fmt.Errorf("No '=' value in arg: %s", raw)
|
|
}
|
|
|
|
if *v == nil {
|
|
*v = make(map[string]string)
|
|
}
|
|
|
|
key, value := raw[0:idx], raw[idx+1:]
|
|
(*v)[key] = value
|
|
return nil
|
|
}
|
|
|
|
// FlagStringSlice is a flag.Value implementation for parsing targets from the
|
|
// command line, e.g. -target=aws_instance.foo -target=aws_vpc.bar
|
|
type FlagStringSlice []string
|
|
|
|
func (v *FlagStringSlice) String() string {
|
|
return ""
|
|
}
|
|
func (v *FlagStringSlice) Set(raw string) error {
|
|
*v = append(*v, raw)
|
|
|
|
return nil
|
|
}
|