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