cmd/cue/cmd: fail earlier on faulty flags

Change-Id: I2019c18969a22c12dc6e295f67776fc47019bf61
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/5646
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/common.go b/cmd/cue/cmd/common.go
index 15ea9dd..67ed7a9 100644
--- a/cmd/cue/cmd/common.go
+++ b/cmd/cue/cmd/common.go
@@ -139,6 +139,9 @@
 	expressions []ast.Expr // only evaluate these expressions within results
 	schema      ast.Expr   // selects schema in instance for orphaned values
 
+	// outFile defines the file to output to. Default is CUE stdout.
+	outFile *build.File
+
 	encConfig *encoding.Config
 	merge     []*build.Instance
 }
@@ -364,18 +367,18 @@
 	}
 	cfg.loadCfg.Stdin = cmd.InOrStdin()
 
-	builds := loadFromArgs(cmd, args, cfg.loadCfg)
-	if builds == nil {
-		return nil, errors.Newf(token.NoPos, "invalid args")
-	}
-	decorateInstances(cmd, flagInject.StringArray(cmd), builds)
-
 	p = &buildPlan{cfg: cfg, cmd: cmd, importing: cfg.loadCfg.DataFiles}
 
 	if err := p.parseFlags(); err != nil {
 		return nil, err
 	}
 
+	builds := loadFromArgs(cmd, args, cfg.loadCfg)
+	if builds == nil {
+		return nil, errors.Newf(token.NoPos, "invalid args")
+	}
+	decorateInstances(cmd, flagInject.StringArray(cmd), builds)
+
 	for _, b := range builds {
 		if b.Err != nil {
 			return nil, b.Err
@@ -446,24 +449,25 @@
 	return p, nil
 }
 
-func (b *buildPlan) out(def string) (*build.File, error) {
+func (b *buildPlan) parseFlags() (err error) {
 	out := flagOut.String(b.cmd)
 	outFile := flagOutFile.String(b.cmd)
 
 	if strings.Contains(out, ":") && strings.Contains(outFile, ":") {
-		return nil, errors.Newf(token.NoPos,
+		return errors.Newf(token.NoPos,
 			"cannot specify qualifier in both --out and --outfile")
 	}
 	if outFile == "" {
-		outFile = def
+		outFile = "-"
 	}
 	if out != "" {
 		outFile = out + ":" + outFile
 	}
-	return filetypes.ParseFile(outFile, b.cfg.outMode)
-}
+	b.outFile, err = filetypes.ParseFile(outFile, b.cfg.outMode)
+	if err != nil {
+		return err
+	}
 
-func (b *buildPlan) parseFlags() (err error) {
 	for _, e := range flagExpression.StringArray(b.cmd) {
 		expr, err := parser.ParseExpr("--expression", e)
 		if err != nil {
diff --git a/cmd/cue/cmd/custom.go b/cmd/cue/cmd/custom.go
index b1d5158..9a6976c 100644
--- a/cmd/cue/cmd/custom.go
+++ b/cmd/cue/cmd/custom.go
@@ -281,7 +281,7 @@
 				return true
 			}
 
-			// Prevent inifinite walks
+			// Prevent infinite walks
 			_, vPath := v.Reference()
 			if vPath != nil {
 				vPath := string(keyForReference(vPath...))
diff --git a/cmd/cue/cmd/def.go b/cmd/cue/cmd/def.go
index 11927c2..bb21e4a 100644
--- a/cmd/cue/cmd/def.go
+++ b/cmd/cue/cmd/def.go
@@ -54,10 +54,7 @@
 	b, err := parseArgs(cmd, args, &config{outMode: filetypes.Def})
 	exitOnErr(cmd, err, true)
 
-	f, err := b.out("-")
-	exitOnErr(cmd, err, true)
-
-	e, err := encoding.NewEncoder(f, b.encConfig)
+	e, err := encoding.NewEncoder(b.outFile, b.encConfig)
 	exitOnErr(cmd, err, true)
 
 	iter := b.instances()
diff --git a/cmd/cue/cmd/eval.go b/cmd/cue/cmd/eval.go
index 361bff0..8d94aa8 100644
--- a/cmd/cue/cmd/eval.go
+++ b/cmd/cue/cmd/eval.go
@@ -108,10 +108,7 @@
 	}
 	b.encConfig.Format = opts
 
-	f, err := b.out("-")
-	exitOnErr(cmd, err, true)
-
-	e, err := encoding.NewEncoder(f, b.encConfig)
+	e, err := encoding.NewEncoder(b.outFile, b.encConfig)
 	exitOnErr(cmd, err, true)
 
 	iter := b.instances()
diff --git a/cmd/cue/cmd/export.go b/cmd/cue/cmd/export.go
index b53ab3c..0f7669b 100644
--- a/cmd/cue/cmd/export.go
+++ b/cmd/cue/cmd/export.go
@@ -107,10 +107,7 @@
 	b, err := parseArgs(cmd, args, &config{outMode: filetypes.Export})
 	exitOnErr(cmd, err, true)
 
-	f, err := b.out("-")
-	exitOnErr(cmd, err, true)
-
-	enc, err := encoding.NewEncoder(f, b.encConfig)
+	enc, err := encoding.NewEncoder(b.outFile, b.encConfig)
 	exitOnErr(cmd, err, true)
 	defer enc.Close()
 
diff --git a/cmd/cue/cmd/testdata/script/issue312.txt b/cmd/cue/cmd/testdata/script/issue312.txt
index 3e060a4..f7cfd8b 100644
--- a/cmd/cue/cmd/testdata/script/issue312.txt
+++ b/cmd/cue/cmd/testdata/script/issue312.txt
@@ -1,3 +1,9 @@
+! cue export x.cue -out cue
+cmp stderr expect-stderr
+
+! cue export -out cue
+cmp stderr expect-stderr
+
 ! cue export -out x.cue
 cmp stderr expect-stderr