cmd/cue/cmd: do not silently ignore unknown filetypes
Fixes #688
Change-Id: Ieb476c75c85ce213ace16a2411e492c524752ad2
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9568
Reviewed-by: Paul Jolly <paul@myitcv.org.uk>
diff --git a/cmd/cue/cmd/testdata/script/cmd_filetypes.txt b/cmd/cue/cmd/testdata/script/cmd_filetypes.txt
new file mode 100644
index 0000000..1fa49bf
--- /dev/null
+++ b/cmd/cue/cmd/testdata/script/cmd_filetypes.txt
@@ -0,0 +1,4 @@
+! cue eval cue+date: x.cue
+stderr 'unknown filetype date'
+-- x.cue --
+a: 5
\ No newline at end of file
diff --git a/internal/filetypes/filetypes.go b/internal/filetypes/filetypes.go
index 451b16f..cc72f62 100644
--- a/internal/filetypes/filetypes.go
+++ b/internal/filetypes/filetypes.go
@@ -178,7 +178,10 @@
hasFiles = true
continue
}
- inst, v = parseType("", Input)
+ inst, v, err = parseType("", Input)
+ if err != nil {
+ return nil, err
+ }
}
f, err := toFile(inst, v, s)
if err != nil {
@@ -202,7 +205,10 @@
case qualifier != "" && !hasFiles:
return nil, errors.Newf(token.NoPos, "scoped qualifier %q without file", qualifier+":")
}
- inst, v = parseType(a[0], Input)
+ inst, v, err = parseType(a[0], Input)
+ if err != nil {
+ return nil, err
+ }
qualifier = a[0]
hasFiles = false
}
@@ -233,7 +239,10 @@
return nil, errors.Newf(token.NoPos, "empty file name in %q", s)
}
- inst, val := parseType(scope, mode)
+ inst, val, err := parseType(scope, mode)
+ if err != nil {
+ return nil, err
+ }
return toFile(inst, val, file)
}
@@ -273,7 +282,7 @@
return f, nil
}
-func parseType(s string, mode Mode) (inst, val cue.Value) {
+func parseType(s string, mode Mode) (inst, val cue.Value, err error) {
i := cuegenInstance.Value()
i = i.Unify(i.Lookup("modes", mode.String()))
v := i.LookupDef("File")
@@ -283,10 +292,15 @@
if p := strings.IndexByte(t, '='); p >= 0 {
v = v.Fill(t[p+1:], "tags", t[:p])
} else {
- v = v.Unify(i.Lookup("tags", t))
+ info := i.Lookup("tags", t)
+ if !info.Exists() {
+ return inst, val, errors.Newf(token.NoPos,
+ "unknown filetype %s", t)
+ }
+ v = v.Unify(info)
}
}
}
- return i, v
+ return i, v, nil
}