summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2019-10-23 22:48:04 -0400
committerDave Henderson <dhenderson@gmail.com>2019-10-23 22:56:35 -0400
commit838174bd63f635a7c96b44fb3babaef1d61fb1a1 (patch)
treee8bb546daaec377579b44ea4bf0b23cc42ed2dd2 /cmd
parent08d705e3607b11a19f814c22b1da67b460205bdc (diff)
refactor validateOpts
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/gomplate/main.go35
-rw-r--r--cmd/gomplate/main_test.go63
-rw-r--r--cmd/gomplate/validate.go59
-rw-r--r--cmd/gomplate/validate_test.go60
4 files changed, 119 insertions, 98 deletions
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()
+}