diff --git a/internal/command/apply.go b/internal/command/apply.go index 08071d6b87..be40c7fed4 100644 --- a/internal/command/apply.go +++ b/internal/command/apply.go @@ -12,6 +12,7 @@ import ( "github.com/opentofu/opentofu/internal/backend" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/encryption" "github.com/opentofu/opentofu/internal/plans/planfile" @@ -301,12 +302,12 @@ func (c *ApplyCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } func (c *ApplyCommand) Help() string { diff --git a/internal/command/arguments/apply_test.go b/internal/command/arguments/apply_test.go index 3df8e76979..bf0b209b58 100644 --- a/internal/command/arguments/apply_test.go +++ b/internal/command/arguments/apply_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/hashicorp/hcl/v2" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/tfdiags" "github.com/google/go-cmp/cmp" @@ -712,7 +713,7 @@ func TestParseApply_replace(t *testing.T) { func TestParseApply_vars(t *testing.T) { testCases := map[string]struct { args []string - want []FlagNameValue + want []flags.RawFlag }{ "no var flags by default": { args: nil, @@ -720,13 +721,13 @@ func TestParseApply_vars(t *testing.T) { }, "one var": { args: []string{"-var", "foo=bar"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, }, }, "one var-file": { args: []string{"-var-file", "cool.tfvars"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var-file", Value: "cool.tfvars"}, }, }, @@ -736,7 +737,7 @@ func TestParseApply_vars(t *testing.T) { "-var-file", "cool.tfvars", "-var", "boop=beep", }, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, {Name: "-var-file", Value: "cool.tfvars"}, {Name: "-var", Value: "boop=beep"}, diff --git a/internal/command/arguments/extended.go b/internal/command/arguments/extended.go index 74804b6ef4..20336b8a04 100644 --- a/internal/command/arguments/extended.go +++ b/internal/command/arguments/extended.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/addrs" "github.com/opentofu/opentofu/internal/plans" @@ -288,11 +289,11 @@ func (o *Operation) Parse() tfdiags.Diagnostics { // desirable for the arguments package to handle the gathering of variables // directly, returning a map of variable values. type Vars struct { - vars *flagNameValueSlice - varFiles *flagNameValueSlice + vars *flags.RawFlags + varFiles *flags.RawFlags } -func (v *Vars) All() []FlagNameValue { +func (v *Vars) All() []flags.RawFlag { if v.vars == nil { return nil } @@ -329,17 +330,17 @@ func extendedFlagSet(name string, state *State, operation *Operation, vars *Vars f.BoolVar(&operation.Refresh, "refresh", true, "refresh") f.BoolVar(&operation.destroyRaw, "destroy", false, "destroy") f.BoolVar(&operation.refreshOnlyRaw, "refresh-only", false, "refresh-only") - f.Var((*flagStringSlice)(&operation.targetsRaw), "target", "target") - f.Var((*flagStringSlice)(&operation.targetsFilesRaw), "target-file", "target-file") - f.Var((*flagStringSlice)(&operation.excludesRaw), "exclude", "exclude") - f.Var((*flagStringSlice)(&operation.excludesFilesRaw), "exclude-file", "exclude-file") - f.Var((*flagStringSlice)(&operation.forceReplaceRaw), "replace", "replace") + f.Var((*flags.FlagStringSlice)(&operation.targetsRaw), "target", "target") + f.Var((*flags.FlagStringSlice)(&operation.targetsFilesRaw), "target-file", "target-file") + f.Var((*flags.FlagStringSlice)(&operation.excludesRaw), "exclude", "exclude") + f.Var((*flags.FlagStringSlice)(&operation.excludesFilesRaw), "exclude-file", "exclude-file") + f.Var((*flags.FlagStringSlice)(&operation.forceReplaceRaw), "replace", "replace") } // Gather all -var and -var-file arguments into one heterogeneous structure // to preserve the overall order. if vars != nil { - varsFlags := newFlagNameValueSlice("-var") + varsFlags := flags.NewRawFlags("-var") varFilesFlags := varsFlags.Alias("-var-file") vars.vars = &varsFlags vars.varFiles = &varFilesFlags diff --git a/internal/command/arguments/flags.go b/internal/command/arguments/flags.go deleted file mode 100644 index 88395f8f56..0000000000 --- a/internal/command/arguments/flags.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) The OpenTofu Authors -// SPDX-License-Identifier: MPL-2.0 -// Copyright (c) 2023 HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package arguments - -import ( - "flag" - "fmt" -) - -// flagStringSlice is a flag.Value implementation which allows collecting -// multiple instances of a single flag into a slice. This is used for flags -// such as -target=aws_instance.foo and -var x=y. -type flagStringSlice []string - -var _ flag.Value = (*flagStringSlice)(nil) - -func (v *flagStringSlice) String() string { - return "" -} -func (v *flagStringSlice) Set(raw string) error { - *v = append(*v, raw) - - return nil -} - -// flagNameValueSlice is a flag.Value implementation that appends raw flag -// names and values to a slice. This is used to collect a sequence of flags -// with possibly different names, preserving the overall order. -// -// FIXME: this is a copy of rawFlags from command/meta_config.go, with the -// eventual aim of replacing it altogether by gathering variables in the -// arguments package. -type flagNameValueSlice struct { - flagName string - items *[]FlagNameValue -} - -var _ flag.Value = flagNameValueSlice{} - -func newFlagNameValueSlice(flagName string) flagNameValueSlice { - var items []FlagNameValue - return flagNameValueSlice{ - flagName: flagName, - items: &items, - } -} - -func (f flagNameValueSlice) Empty() bool { - if f.items == nil { - return true - } - return len(*f.items) == 0 -} - -func (f flagNameValueSlice) AllItems() []FlagNameValue { - if f.items == nil { - return nil - } - return *f.items -} - -func (f flagNameValueSlice) Alias(flagName string) flagNameValueSlice { - return flagNameValueSlice{ - flagName: flagName, - items: f.items, - } -} - -func (f flagNameValueSlice) String() string { - return "" -} - -func (f flagNameValueSlice) Set(str string) error { - *f.items = append(*f.items, FlagNameValue{ - Name: f.flagName, - Value: str, - }) - return nil -} - -type FlagNameValue struct { - Name string - Value string -} - -func (f FlagNameValue) String() string { - return fmt.Sprintf("%s=%q", f.Name, f.Value) -} - -// FlagIsSet returns whether a flag is explicitly set in a set of flags -func FlagIsSet(flags *flag.FlagSet, name string) bool { - isSet := false - flags.Visit(func(f *flag.Flag) { - if f.Name == name { - isSet = true - } - }) - return isSet -} diff --git a/internal/command/arguments/plan_test.go b/internal/command/arguments/plan_test.go index b821de1a35..51c9f70f23 100644 --- a/internal/command/arguments/plan_test.go +++ b/internal/command/arguments/plan_test.go @@ -9,6 +9,7 @@ import ( "strings" "testing" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/tfdiags" "github.com/google/go-cmp/cmp" @@ -611,7 +612,7 @@ func TestParsePlan_excludeAndTarget(t *testing.T) { func TestParsePlan_vars(t *testing.T) { testCases := map[string]struct { args []string - want []FlagNameValue + want []flags.RawFlag }{ "no var flags by default": { args: nil, @@ -619,13 +620,13 @@ func TestParsePlan_vars(t *testing.T) { }, "one var": { args: []string{"-var", "foo=bar"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, }, }, "one var-file": { args: []string{"-var-file", "cool.tfvars"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var-file", Value: "cool.tfvars"}, }, }, @@ -635,7 +636,7 @@ func TestParsePlan_vars(t *testing.T) { "-var-file", "cool.tfvars", "-var", "boop=beep", }, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, {Name: "-var-file", Value: "cool.tfvars"}, {Name: "-var", Value: "boop=beep"}, diff --git a/internal/command/arguments/refresh_test.go b/internal/command/arguments/refresh_test.go index 4ae4b4d001..673654cc78 100644 --- a/internal/command/arguments/refresh_test.go +++ b/internal/command/arguments/refresh_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/hcl/v2" "github.com/opentofu/opentofu/internal/addrs" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/tfdiags" ) @@ -440,7 +441,7 @@ func TestParseRefresh_excludeAndTarget(t *testing.T) { func TestParseRefresh_vars(t *testing.T) { testCases := map[string]struct { args []string - want []FlagNameValue + want []flags.RawFlag }{ "no var flags by default": { args: nil, @@ -448,13 +449,13 @@ func TestParseRefresh_vars(t *testing.T) { }, "one var": { args: []string{"-var", "foo=bar"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, }, }, "one var-file": { args: []string{"-var-file", "cool.tfvars"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var-file", Value: "cool.tfvars"}, }, }, @@ -464,7 +465,7 @@ func TestParseRefresh_vars(t *testing.T) { "-var-file", "cool.tfvars", "-var", "boop=beep", }, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, {Name: "-var-file", Value: "cool.tfvars"}, {Name: "-var", Value: "boop=beep"}, diff --git a/internal/command/arguments/test.go b/internal/command/arguments/test.go index ce207e8b9d..4547615d98 100644 --- a/internal/command/arguments/test.go +++ b/internal/command/arguments/test.go @@ -6,6 +6,7 @@ package arguments import ( + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/configs" "github.com/opentofu/opentofu/internal/tfdiags" ) @@ -42,7 +43,7 @@ func ParseTest(args []string) (*Test, func(), tfdiags.Diagnostics) { } cmdFlags := extendedFlagSet("test", nil, nil, test.Vars) - cmdFlags.Var((*flagStringSlice)(&test.Filter), "filter", "filter") + cmdFlags.Var((*flags.FlagStringSlice)(&test.Filter), "filter", "filter") cmdFlags.StringVar(&test.TestDirectory, "test-directory", configs.DefaultTestDirectory, "test-directory") cmdFlags.BoolVar(&test.Verbose, "verbose", false, "verbose") diff --git a/internal/command/arguments/test_test.go b/internal/command/arguments/test_test.go index 5643a5b9aa..72aa13b9b7 100644 --- a/internal/command/arguments/test_test.go +++ b/internal/command/arguments/test_test.go @@ -12,6 +12,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/tfdiags" ) @@ -19,7 +20,7 @@ import ( func TestParseTest_Vars(t *testing.T) { tcs := map[string]struct { args []string - want []FlagNameValue + want []flags.RawFlag }{ "no var flags by default": { args: nil, @@ -27,13 +28,13 @@ func TestParseTest_Vars(t *testing.T) { }, "one var": { args: []string{"-var", "foo=bar"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, }, }, "one var-file": { args: []string{"-var-file", "cool.tfvars"}, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var-file", Value: "cool.tfvars"}, }, }, @@ -43,7 +44,7 @@ func TestParseTest_Vars(t *testing.T) { "-var-file", "cool.tfvars", "-var", "boop=beep", }, - want: []FlagNameValue{ + want: []flags.RawFlag{ {Name: "-var", Value: "foo=bar"}, {Name: "-var-file", Value: "cool.tfvars"}, {Name: "-var", Value: "boop=beep"}, diff --git a/internal/command/flag_kv.go b/internal/command/flags/flag_kv.go similarity index 77% rename from internal/command/flag_kv.go rename to internal/command/flags/flag_kv.go index f743cbc9e1..daa92f7eb8 100644 --- a/internal/command/flag_kv.go +++ b/internal/command/flags/flag_kv.go @@ -3,9 +3,10 @@ // Copyright (c) 2023 HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -package command +package flags import ( + "flag" "fmt" "strings" ) @@ -34,10 +35,13 @@ func (v *FlagStringKV) Set(raw string) error { 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 +// FlagStringSlice is a flag.Value implementation which allows collecting +// multiple instances of a single flag into a slice. This is used for flags +// such as -target=aws_instance.foo and -var x=y. type FlagStringSlice []string +var _ flag.Value = (*FlagStringSlice)(nil) + func (v *FlagStringSlice) String() string { return "" } diff --git a/internal/command/flag_kv_test.go b/internal/command/flags/flag_kv_test.go similarity index 98% rename from internal/command/flag_kv_test.go rename to internal/command/flags/flag_kv_test.go index fd038470d5..b1c421e50f 100644 --- a/internal/command/flag_kv_test.go +++ b/internal/command/flags/flag_kv_test.go @@ -3,7 +3,7 @@ // Copyright (c) 2023 HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -package command +package flags import ( "flag" diff --git a/internal/command/flags/flags.go b/internal/command/flags/flags.go new file mode 100644 index 0000000000..389a72b0f6 --- /dev/null +++ b/internal/command/flags/flags.go @@ -0,0 +1,21 @@ +// Copyright (c) The OpenTofu Authors +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2023 HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package flags + +import ( + "flag" +) + +// FlagIsSet returns whether a flag is explicitly set in a set of flags +func FlagIsSet(flags *flag.FlagSet, name string) bool { + isSet := false + flags.Visit(func(f *flag.Flag) { + if f.Name == name { + isSet = true + } + }) + return isSet +} diff --git a/internal/command/flags/raw_flags.go b/internal/command/flags/raw_flags.go new file mode 100644 index 0000000000..a3e5fa104b --- /dev/null +++ b/internal/command/flags/raw_flags.go @@ -0,0 +1,71 @@ +// Copyright (c) The OpenTofu Authors +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2023 HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package flags + +import ( + "flag" + "fmt" +) + +// RawFlags is a flag.Value implementation that appends raw flag +// names and values to a slice. This is used to collect a sequence of flags +// with possibly different names, preserving the overall order. +type RawFlags struct { + Name string + Items *[]RawFlag +} + +var _ flag.Value = RawFlags{} + +func NewRawFlags(name string) RawFlags { + var items []RawFlag + return RawFlags{ + Name: name, + Items: &items, + } +} + +func (f RawFlags) Empty() bool { + if f.Items == nil { + return true + } + return len(*f.Items) == 0 +} + +func (f RawFlags) AllItems() []RawFlag { + if f.Items == nil { + return nil + } + return *f.Items +} + +func (f RawFlags) Alias(flagName string) RawFlags { + return RawFlags{ + Name: flagName, + Items: f.Items, + } +} + +func (f RawFlags) String() string { + return "" +} + +func (f RawFlags) Set(str string) error { + *f.Items = append(*f.Items, RawFlag{ + Name: f.Name, + Value: str, + }) + return nil +} + +type RawFlag struct { + Name string + Value string +} + +func (f RawFlag) String() string { + return fmt.Sprintf("%s=%q", f.Name, f.Value) +} diff --git a/internal/command/init.go b/internal/command/init.go index 91c0263567..4b319b9b51 100644 --- a/internal/command/init.go +++ b/internal/command/init.go @@ -14,6 +14,7 @@ import ( "strings" "github.com/hashicorp/hcl/v2" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/svchost" "github.com/posener/complete" "github.com/zclconf/go-cty/cty" @@ -52,8 +53,8 @@ func (c *InitCommand) Run(args []string) int { var flagFromModule, flagLockfile, testsDirectory string var flagBackend, flagCloud, flagGet, flagUpgrade bool - var flagPluginPath FlagStringSlice - flagConfigExtra := newRawFlags("-backend-config") + var flagPluginPath flags.FlagStringSlice + flagConfigExtra := flags.NewRawFlags("-backend-config") args = c.Meta.process(args) cmdFlags := c.Meta.extendedFlagSet("init") @@ -114,8 +115,8 @@ func (c *InitCommand) Run(args []string) int { } } - backendFlagSet := arguments.FlagIsSet(cmdFlags, "backend") - cloudFlagSet := arguments.FlagIsSet(cmdFlags, "cloud") + backendFlagSet := flags.FlagIsSet(cmdFlags, "backend") + cloudFlagSet := flags.FlagIsSet(cmdFlags, "cloud") switch { case backendFlagSet && cloudFlagSet: @@ -470,7 +471,7 @@ func (c *InitCommand) getModules(ctx context.Context, path, testsDir string, ear return true, installAbort, diags } -func (c *InitCommand) initCloud(ctx context.Context, root *configs.Module, extraConfig rawFlags, enc encryption.Encryption) (be backend.Backend, output bool, diags tfdiags.Diagnostics) { +func (c *InitCommand) initCloud(ctx context.Context, root *configs.Module, extraConfig flags.RawFlags, enc encryption.Encryption) (be backend.Backend, output bool, diags tfdiags.Diagnostics) { ctx, span := tracing.Tracer().Start(ctx, "Cloud backend init") _ = ctx // prevent staticcheck from complaining to avoid a maintenance hazard of having the wrong ctx in scope here defer span.End() @@ -498,7 +499,7 @@ func (c *InitCommand) initCloud(ctx context.Context, root *configs.Module, extra return back, true, diags } -func (c *InitCommand) initBackend(ctx context.Context, root *configs.Module, extraConfig rawFlags, enc encryption.Encryption) (be backend.Backend, output bool, diags tfdiags.Diagnostics) { +func (c *InitCommand) initBackend(ctx context.Context, root *configs.Module, extraConfig flags.RawFlags, enc encryption.Encryption) (be backend.Backend, output bool, diags tfdiags.Diagnostics) { ctx, span := tracing.Tracer().Start(ctx, "Backend init") _ = ctx // prevent staticcheck from complaining to avoid a maintenance hazard of having the wrong ctx in scope here defer span.End() @@ -1132,7 +1133,7 @@ func warnOnFailedImplicitProvReference(provider addrs.Provider, qualifs *getprov // // If the returned diagnostics contains errors then the returned body may be // incomplete or invalid. -func (c *InitCommand) backendConfigOverrideBody(flags rawFlags, schema *configschema.Block) (hcl.Body, tfdiags.Diagnostics) { +func (c *InitCommand) backendConfigOverrideBody(flags flags.RawFlags, schema *configschema.Block) (hcl.Body, tfdiags.Diagnostics) { items := flags.AllItems() if len(items) == 0 { return nil, nil diff --git a/internal/command/init_test.go b/internal/command/init_test.go index 827806aa39..cab1c0eeca 100644 --- a/internal/command/init_test.go +++ b/internal/command/init_test.go @@ -22,6 +22,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/go-version" "github.com/mitchellh/cli" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/workdir" "github.com/zclconf/go-cty/cty" @@ -460,7 +461,7 @@ func TestInit_backendConfigFile(t *testing.T) { }, }, } - flagConfigExtra := newRawFlags("-backend-config") + flagConfigExtra := flags.NewRawFlags("-backend-config") _ = flagConfigExtra.Set("input.config") _, diags := c.backendConfigOverrideBody(flagConfigExtra, schema) if len(diags) != 0 { diff --git a/internal/command/meta.go b/internal/command/meta.go index 12b8625f9c..d1e2741915 100644 --- a/internal/command/meta.go +++ b/internal/command/meta.go @@ -23,6 +23,7 @@ import ( "github.com/hashicorp/go-retryablehttp" "github.com/mitchellh/cli" "github.com/mitchellh/colorstring" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/svchost/disco" "github.com/opentofu/opentofu/internal/addrs" @@ -226,7 +227,7 @@ type Meta struct { backendState *legacy.BackendState // Variables for the context (private) - variableArgs rawFlags + variableArgs flags.RawFlags input bool // Targets for this context (private) @@ -613,8 +614,8 @@ func (m *Meta) ignoreRemoteVersionFlagSet(n string) *flag.FlagSet { } func (m *Meta) varFlagSet(f *flag.FlagSet) { - if m.variableArgs.items == nil { - m.variableArgs = newRawFlags("-var") + if m.variableArgs.Items == nil { + m.variableArgs = flags.NewRawFlags("-var") } varValues := m.variableArgs.Alias("-var") varFiles := m.variableArgs.Alias("-var-file") @@ -628,8 +629,8 @@ func (m *Meta) extendedFlagSet(n string) *flag.FlagSet { f := m.defaultFlagSet(n) f.BoolVar(&m.input, "input", true, "input") - f.Var((*FlagStringSlice)(&m.targetFlags), "target", "resource to target") - f.Var((*FlagStringSlice)(&m.excludeFlags), "exclude", "resource to exclude") + f.Var((*flags.FlagStringSlice)(&m.targetFlags), "target", "resource to target") + f.Var((*flags.FlagStringSlice)(&m.excludeFlags), "exclude", "resource to exclude") f.BoolVar(&m.compactWarnings, "compact-warnings", false, "use compact warnings") f.BoolVar(&m.consolidateWarnings, "consolidate-warnings", true, "consolidate warnings") f.BoolVar(&m.consolidateErrors, "consolidate-errors", false, "consolidate errors") diff --git a/internal/command/meta_config.go b/internal/command/meta_config.go index 9e79a5b0ae..ce3dae4db4 100644 --- a/internal/command/meta_config.go +++ b/internal/command/meta_config.go @@ -505,60 +505,3 @@ func configValueFromCLI(synthFilename, rawValue string, wantType cty.Type) (cty. return val, diags } } - -// rawFlags is a flag.Value implementation that just appends raw flag -// names and values to a slice. -type rawFlags struct { - flagName string - items *[]rawFlag -} - -func newRawFlags(flagName string) rawFlags { - var items []rawFlag - return rawFlags{ - flagName: flagName, - items: &items, - } -} - -func (f rawFlags) Empty() bool { - if f.items == nil { - return true - } - return len(*f.items) == 0 -} - -func (f rawFlags) AllItems() []rawFlag { - if f.items == nil { - return nil - } - return *f.items -} - -func (f rawFlags) Alias(flagName string) rawFlags { - return rawFlags{ - flagName: flagName, - items: f.items, - } -} - -func (f rawFlags) String() string { - return "" -} - -func (f rawFlags) Set(str string) error { - *f.items = append(*f.items, rawFlag{ - Name: f.flagName, - Value: str, - }) - return nil -} - -type rawFlag struct { - Name string - Value string -} - -func (f rawFlag) String() string { - return fmt.Sprintf("%s=%q", f.Name, f.Value) -} diff --git a/internal/command/output.go b/internal/command/output.go index 2e108e069e..33dd5f3005 100644 --- a/internal/command/output.go +++ b/internal/command/output.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/encryption" "github.com/opentofu/opentofu/internal/states" @@ -121,12 +122,12 @@ func (c *OutputCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } func (c *OutputCommand) Help() string { diff --git a/internal/command/plan.go b/internal/command/plan.go index dd586f07fb..060258f509 100644 --- a/internal/command/plan.go +++ b/internal/command/plan.go @@ -12,6 +12,7 @@ import ( "github.com/opentofu/opentofu/internal/backend" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/encryption" "github.com/opentofu/opentofu/internal/tfdiags" @@ -195,12 +196,12 @@ func (c *PlanCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } func (c *PlanCommand) Help() string { diff --git a/internal/command/providers_lock.go b/internal/command/providers_lock.go index 0b8cf61061..30b971f692 100644 --- a/internal/command/providers_lock.go +++ b/internal/command/providers_lock.go @@ -11,6 +11,7 @@ import ( "os" "github.com/opentofu/opentofu/internal/addrs" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/depsfile" "github.com/opentofu/opentofu/internal/getproviders" "github.com/opentofu/opentofu/internal/providercache" @@ -48,7 +49,7 @@ func (c *ProvidersLockCommand) Run(args []string) int { args = c.Meta.process(args) cmdFlags := c.Meta.defaultFlagSet("providers lock") c.Meta.varFlagSet(cmdFlags) - var optPlatforms FlagStringSlice + var optPlatforms flags.FlagStringSlice var fsMirrorDir string var netMirrorURL string cmdFlags.Var(&optPlatforms, "platform", "target platform") diff --git a/internal/command/providers_mirror.go b/internal/command/providers_mirror.go index 167e055829..601eb5087f 100644 --- a/internal/command/providers_mirror.go +++ b/internal/command/providers_mirror.go @@ -14,6 +14,7 @@ import ( "github.com/apparentlymart/go-versions/versions" "github.com/hashicorp/go-getter" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/getproviders" "github.com/opentofu/opentofu/internal/httpclient" @@ -36,7 +37,7 @@ func (c *ProvidersMirrorCommand) Run(args []string) int { args = c.Meta.process(args) cmdFlags := c.Meta.defaultFlagSet("providers mirror") c.Meta.varFlagSet(cmdFlags) - var optPlatforms FlagStringSlice + var optPlatforms flags.FlagStringSlice cmdFlags.Var(&optPlatforms, "platform", "target platform") cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } if err := cmdFlags.Parse(args); err != nil { diff --git a/internal/command/refresh.go b/internal/command/refresh.go index e515f8adb7..38932185f4 100644 --- a/internal/command/refresh.go +++ b/internal/command/refresh.go @@ -12,6 +12,7 @@ import ( "github.com/opentofu/opentofu/internal/backend" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/encryption" "github.com/opentofu/opentofu/internal/tfdiags" @@ -176,12 +177,12 @@ func (c *RefreshCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } func (c *RefreshCommand) Help() string { diff --git a/internal/command/show.go b/internal/command/show.go index 60ee48c9bc..09ec48f476 100644 --- a/internal/command/show.go +++ b/internal/command/show.go @@ -16,6 +16,7 @@ import ( "github.com/opentofu/opentofu/internal/cloud" "github.com/opentofu/opentofu/internal/cloud/cloudplan" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/configs" "github.com/opentofu/opentofu/internal/encryption" @@ -176,12 +177,12 @@ func (c *ShowCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } type showRenderFunc func(view views.Show) int diff --git a/internal/command/test.go b/internal/command/test.go index 8013ebbcdf..b78fed9b2d 100644 --- a/internal/command/test.go +++ b/internal/command/test.go @@ -16,6 +16,7 @@ import ( "strings" "time" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/lang" "github.com/hashicorp/hcl/v2" @@ -141,14 +142,8 @@ func (c *TestCommand) Run(rawArgs []string) int { // Users can also specify variables via the command line, so we'll parse // all that here. - var items []rawFlag - for _, variable := range args.Vars.All() { - items = append(items, rawFlag{ - Name: variable.Name, - Value: variable.Value, - }) - } - c.variableArgs = rawFlags{items: &items} + items := args.Vars.All() + c.variableArgs = flags.RawFlags{Items: &items} variables, variableDiags := c.collectVariableValuesWithTests(args.TestDirectory) diags = diags.Append(variableDiags) diff --git a/internal/command/validate.go b/internal/command/validate.go index 8fa6049a23..169cf64058 100644 --- a/internal/command/validate.go +++ b/internal/command/validate.go @@ -13,6 +13,7 @@ import ( "github.com/opentofu/opentofu/internal/addrs" "github.com/opentofu/opentofu/internal/command/arguments" + "github.com/opentofu/opentofu/internal/command/flags" "github.com/opentofu/opentofu/internal/command/views" "github.com/opentofu/opentofu/internal/configs" "github.com/opentofu/opentofu/internal/tfdiags" @@ -84,12 +85,12 @@ func (c *ValidateCommand) GatherVariables(args *arguments.Vars) { // package directly, removing this shim layer. varArgs := args.All() - items := make([]rawFlag, len(varArgs)) + items := make([]flags.RawFlag, len(varArgs)) for i := range varArgs { items[i].Name = varArgs[i].Name items[i].Value = varArgs[i].Value } - c.Meta.variableArgs = rawFlags{items: &items} + c.Meta.variableArgs = flags.RawFlags{Items: &items} } func (c *ValidateCommand) validate(ctx context.Context, dir, testDir string, noTests bool) tfdiags.Diagnostics {