cmd/cue/cmd: move tag flags handling to central location

This refactoring will help implement variable injection (os, user, etc.)

Change-Id: I7fb234f015ab54807c578052752e2d6ddc96b5ea
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9577
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Paul Jolly <paul@myitcv.org.uk>
diff --git a/cmd/cue/cmd/cmd.go b/cmd/cue/cmd/cmd.go
index 8850811..b0daf5a 100644
--- a/cmd/cue/cmd/cmd.go
+++ b/cmd/cue/cmd/cmd.go
@@ -149,8 +149,8 @@
 	}
 
 	cmd.Flags().SetInterspersed(false)
-	cmd.Flags().StringArrayP(string(flagInject), "t", nil,
-		"set the value of a tagged field")
+
+	addInjectionFlags(cmd.Flags(), true)
 
 	return cmd
 }
diff --git a/cmd/cue/cmd/common.go b/cmd/cue/cmd/common.go
index eddf609..9f6fbbf 100644
--- a/cmd/cue/cmd/common.go
+++ b/cmd/cue/cmd/common.go
@@ -22,6 +22,7 @@
 	"regexp"
 	"strings"
 
+	"github.com/spf13/pflag"
 	"golang.org/x/text/language"
 	"golang.org/x/text/message"
 
@@ -392,7 +393,9 @@
 	}
 	cfg.reFile = re
 
-	cfg.loadCfg.Tags = flagInject.StringArray(cmd)
+	if err := setTags(cmd.Flags(), cfg.loadCfg); err != nil {
+		return nil, err
+	}
 
 	return p, nil
 }
@@ -401,6 +404,12 @@
 	return p.cfg.reFile.MatchString(file)
 }
 
+func setTags(f *pflag.FlagSet, cfg *load.Config) error {
+	tags, _ := f.GetStringArray(string(flagInject))
+	cfg.Tags = tags
+	return nil
+}
+
 type decoderInfo struct {
 	file *build.File
 	d    *encoding.Decoder // may be nil if delayed
@@ -728,12 +737,16 @@
 	return instances, nil
 }
 
-func buildTools(cmd *Command, tags, args []string) (*cue.Instance, error) {
+func buildTools(cmd *Command, args []string) (*cue.Instance, error) {
 
 	cfg := &load.Config{
-		Tags:  tags,
 		Tools: true,
 	}
+	f := cmd.cmd.Flags()
+	if err := setTags(f, cfg); err != nil {
+		return nil, err
+	}
+
 	binst := loadFromArgs(cmd, args, cfg)
 	if len(binst) == 0 {
 		return nil, nil
diff --git a/cmd/cue/cmd/def.go b/cmd/cue/cmd/def.go
index 9173ceb..32fce52 100644
--- a/cmd/cue/cmd/def.go
+++ b/cmd/cue/cmd/def.go
@@ -37,15 +37,13 @@
 
 	addOutFlags(cmd.Flags(), true)
 	addOrphanFlags(cmd.Flags())
+	addInjectionFlags(cmd.Flags(), false)
 
 	cmd.Flags().StringArrayP(string(flagExpression), "e", nil, "evaluate this expression only")
 
 	cmd.Flags().BoolP(string(flagAttributes), "A", false,
 		"display field attributes")
 
-	cmd.Flags().StringArrayP(string(flagInject), "t", nil,
-		"set the value of a tagged field")
-
 	// TODO: Option to include comments in output.
 	return cmd
 }
diff --git a/cmd/cue/cmd/eval.go b/cmd/cue/cmd/eval.go
index 244f053..fcebb7f 100644
--- a/cmd/cue/cmd/eval.go
+++ b/cmd/cue/cmd/eval.go
@@ -53,6 +53,7 @@
 
 	addOutFlags(cmd.Flags(), true)
 	addOrphanFlags(cmd.Flags())
+	addInjectionFlags(cmd.Flags(), false)
 
 	cmd.Flags().StringArrayP(string(flagExpression), "e", nil, "evaluate this expression only")
 
@@ -71,9 +72,6 @@
 	cmd.Flags().BoolP(string(flagAll), "a", false,
 		"show optional and hidden fields")
 
-	cmd.Flags().StringArrayP(string(flagInject), "t", nil,
-		"set the value of a tagged field")
-
 	// TODO: Option to include comments in output.
 	return cmd
 }
diff --git a/cmd/cue/cmd/export.go b/cmd/cue/cmd/export.go
index a675261..bec6704 100644
--- a/cmd/cue/cmd/export.go
+++ b/cmd/cue/cmd/export.go
@@ -94,11 +94,10 @@
 
 	addOutFlags(cmd.Flags(), true)
 	addOrphanFlags(cmd.Flags())
+	addInjectionFlags(cmd.Flags(), false)
 
 	cmd.Flags().Bool(string(flagEscape), false, "use HTML escaping")
 	cmd.Flags().StringArrayP(string(flagExpression), "e", nil, "export this expression only")
-	cmd.Flags().StringArrayP(string(flagInject), "t", nil,
-		"set the value of a tagged field")
 
 	return cmd
 }
diff --git a/cmd/cue/cmd/flags.go b/cmd/cue/cmd/flags.go
index edfa8dd..a9edfe4 100644
--- a/cmd/cue/cmd/flags.go
+++ b/cmd/cue/cmd/flags.go
@@ -87,6 +87,11 @@
 	f.Bool(string(flagMerge), true, "merge non-CUE files")
 }
 
+func addInjectionFlags(f *pflag.FlagSet, auto bool) {
+	f.StringArrayP(string(flagInject), "t", nil,
+		"set the value of a tagged field")
+}
+
 type flagName string
 
 func (f flagName) Bool(cmd *Command) bool {
diff --git a/cmd/cue/cmd/root.go b/cmd/cue/cmd/root.go
index de4c8f6..c0c3dbd 100644
--- a/cmd/cue/cmd/root.go
+++ b/cmd/cue/cmd/root.go
@@ -257,10 +257,6 @@
 		return nil, err
 	}
 
-	tags, err := cmd.cmd.Flags().GetStringArray(string(flagInject))
-	if err != nil {
-		return nil, err
-	}
 	args = cmd.cmd.Flags().Args()
 	rootCmd.SetArgs(args)
 
@@ -272,7 +268,7 @@
 		return cmd, nil // Forces unknown command message from Cobra.
 	}
 
-	tools, err := buildTools(cmd, tags, args[1:])
+	tools, err := buildTools(cmd, args[1:])
 	if err != nil {
 		return cmd, err
 	}
@@ -295,7 +291,6 @@
 }
 
 func addSubcommands(cmd *Command, sub map[string]*subSpec, args []string, isHelp bool) error {
-	var tags []string
 	if len(args) > 0 {
 		if _, ok := sub[args[0]]; ok {
 			oldargs := []string{args[0]}
@@ -313,10 +308,6 @@
 				if err != nil {
 					return err
 				}
-				tags, err = cmd.cmd.Flags().GetStringArray(string(flagInject))
-				if err != nil {
-					return err
-				}
 				args = cmd.cmd.Flags().Args()
 				cmd.root.SetArgs(append(oldargs, args...))
 			}
@@ -330,7 +321,7 @@
 		args = args[1:]
 	}
 
-	tools, err := buildTools(cmd, tags, args)
+	tools, err := buildTools(cmd, args)
 	if err != nil {
 		return err
 	}
diff --git a/cmd/cue/cmd/vet.go b/cmd/cue/cmd/vet.go
index 61baf28..e2e1280 100644
--- a/cmd/cue/cmd/vet.go
+++ b/cmd/cue/cmd/vet.go
@@ -70,13 +70,11 @@
 	}
 
 	addOrphanFlags(cmd.Flags())
+	addInjectionFlags(cmd.Flags(), false)
 
 	cmd.Flags().BoolP(string(flagConcrete), "c", false,
 		"require the evaluation to be concrete")
 
-	cmd.Flags().StringArrayP(string(flagInject), "t", nil,
-		"set the value of a tagged field")
-
 	return cmd
 }