From 838174bd63f635a7c96b44fb3babaef1d61fb1a1 Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Wed, 23 Oct 2019 22:48:04 -0400 Subject: refactor validateOpts Signed-off-by: Dave Henderson --- cmd/gomplate/main.go | 35 ------------------------ cmd/gomplate/main_test.go | 63 ------------------------------------------- cmd/gomplate/validate.go | 59 ++++++++++++++++++++++++++++++++++++++++ cmd/gomplate/validate_test.go | 60 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 98 deletions(-) create mode 100644 cmd/gomplate/validate.go create mode 100644 cmd/gomplate/validate_test.go (limited to 'cmd') diff --git a/cmd/gomplate/main.go b/cmd/gomplate/main.go index c962214b..a11ea931 100644 --- a/cmd/gomplate/main.go +++ b/cmd/gomplate/main.go @@ -5,7 +5,6 @@ The gomplate command package main import ( - "errors" "fmt" "os" "os/exec" @@ -24,40 +23,6 @@ var ( includes []string ) -// nolint: gocyclo -func validateOpts(cmd *cobra.Command, args []string) error { - if cmd.Flag("in").Changed && cmd.Flag("file").Changed { - return errors.New("--in and --file may not be used together") - } - - if len(opts.InputFiles) != len(opts.OutputFiles) { - return fmt.Errorf("must provide same number of --out (%d) as --file (%d) options", len(opts.OutputFiles), len(opts.InputFiles)) - } - - if cmd.Flag("input-dir").Changed && (cmd.Flag("in").Changed || cmd.Flag("file").Changed) { - return errors.New("--input-dir can not be used together with --in or --file") - } - - if cmd.Flag("output-dir").Changed { - if cmd.Flag("out").Changed { - return errors.New("--output-dir can not be used together with --out") - } - if !cmd.Flag("input-dir").Changed { - return errors.New("--input-dir must be set when --output-dir is set") - } - } - - if cmd.Flag("output-map").Changed { - if cmd.Flag("out").Changed || cmd.Flag("output-dir").Changed { - return errors.New("--output-map can not be used together with --out or --output-dir") - } - if !cmd.Flag("input-dir").Changed { - return errors.New("--input-dir must be set when --output-map is set") - } - } - return nil -} - func printVersion(name string) { fmt.Printf("%s version %s\n", name, version.Version) } diff --git a/cmd/gomplate/main_test.go b/cmd/gomplate/main_test.go index f29e4978..e0d74e9d 100644 --- a/cmd/gomplate/main_test.go +++ b/cmd/gomplate/main_test.go @@ -3,72 +3,9 @@ package main import ( "testing" - "github.com/spf13/cobra" "github.com/stretchr/testify/assert" ) -func TestValidateOpts(t *testing.T) { - err := validateOpts(parseFlags(), nil) - assert.NoError(t, err) - - cmd := parseFlags("-i=foo", "-f", "bar") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("-i=foo", "-o=bar", "-o=baz") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("-i=foo", "--input-dir=baz") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("--input-dir=foo", "-f=bar") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("--output-dir=foo", "-o=bar") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("--output-dir=foo") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("--output-map", "bar") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags("-o", "foo", "--output-map", "bar") - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags( - "--input-dir", "in", - "--output-dir", "foo", - "--output-map", "bar", - ) - err = validateOpts(cmd, nil) - assert.Error(t, err) - - cmd = parseFlags( - "--input-dir", "in", - "--output-map", "bar", - ) - err = validateOpts(cmd, nil) - assert.NoError(t, err) -} - -func parseFlags(flags ...string) *cobra.Command { - cmd := &cobra.Command{} - initFlags(cmd) - err := cmd.ParseFlags(flags) - if err != nil { - panic(err) - } - return cmd -} - func TestProcessIncludes(t *testing.T) { data := []struct { inc, exc, expected []string diff --git a/cmd/gomplate/validate.go b/cmd/gomplate/validate.go new file mode 100644 index 00000000..68c132b8 --- /dev/null +++ b/cmd/gomplate/validate.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" +) + +func notTogether(cmd *cobra.Command, flags ...string) error { + found := "" + for _, flag := range flags { + f := cmd.Flag(flag) + if f != nil && f.Changed { + if found != "" { + a := make([]string, len(flags)) + for i := range a { + a[i] = "--" + flags[i] + } + return fmt.Errorf("only one of these flags is supported at a time: %s", strings.Join(a, ", ")) + } + found = flag + } + } + return nil +} + +func mustTogether(cmd *cobra.Command, left, right string) error { + l := cmd.Flag(left) + if l != nil && l.Changed { + r := cmd.Flag(right) + if r != nil && !r.Changed { + return fmt.Errorf("--%s must be set when --%s is set", right, left) + } + } + + return nil +} + +func validateOpts(cmd *cobra.Command, args []string) (err error) { + err = notTogether(cmd, "in", "file", "input-dir") + if err == nil { + err = notTogether(cmd, "out", "output-dir", "output-map", "exec-pipe") + } + + if err == nil && len(opts.InputFiles) != len(opts.OutputFiles) { + err = fmt.Errorf("must provide same number of --out (%d) as --file (%d) options", len(opts.OutputFiles), len(opts.InputFiles)) + } + + if err == nil { + err = mustTogether(cmd, "output-dir", "input-dir") + } + + if err == nil { + err = mustTogether(cmd, "output-map", "input-dir") + } + + return err +} diff --git a/cmd/gomplate/validate_test.go b/cmd/gomplate/validate_test.go new file mode 100644 index 00000000..91f16767 --- /dev/null +++ b/cmd/gomplate/validate_test.go @@ -0,0 +1,60 @@ +package main + +import ( + "testing" + + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +func TestValidateOpts(t *testing.T) { + err := validateOpts(parseFlags()) + assert.NoError(t, err) + + err = validateOpts(parseFlags("-i=foo", "-f", "bar")) + assert.Error(t, err) + + err = validateOpts(parseFlags("-i=foo", "-o=bar", "-o=baz")) + assert.Error(t, err) + + err = validateOpts(parseFlags("-i=foo", "--input-dir=baz")) + assert.Error(t, err) + + err = validateOpts(parseFlags("--input-dir=foo", "-f=bar")) + assert.Error(t, err) + + err = validateOpts(parseFlags("--output-dir=foo", "-o=bar")) + assert.Error(t, err) + + err = validateOpts(parseFlags("--output-dir=foo")) + assert.Error(t, err) + + err = validateOpts(parseFlags("--output-map", "bar")) + assert.Error(t, err) + + err = validateOpts(parseFlags("-o", "foo", "--output-map", "bar")) + assert.Error(t, err) + + err = validateOpts(parseFlags( + "--input-dir", "in", + "--output-dir", "foo", + "--output-map", "bar", + )) + assert.Error(t, err) + + err = validateOpts(parseFlags( + "--input-dir", "in", + "--output-map", "bar", + )) + assert.NoError(t, err) +} + +func parseFlags(flags ...string) (cmd *cobra.Command, args []string) { + cmd = &cobra.Command{} + initFlags(cmd) + err := cmd.ParseFlags(flags) + if err != nil { + panic(err) + } + return cmd, cmd.Flags().Args() +} -- cgit v1.2.3