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
 }