Handle non-utf8 input file with better error
diff --git a/gen/src/mod.rs b/gen/src/mod.rs
index c52d273..f4d643d 100644
--- a/gen/src/mod.rs
+++ b/gen/src/mod.rs
@@ -69,9 +69,9 @@
 }
 
 pub(super) fn generate_from_path(path: &Path, opt: &Opt) -> GeneratedCode {
-    let source = match fs::read_to_string(path) {
+    let source = match read_to_string(path) {
         Ok(source) => source,
-        Err(err) => format_err(path, "", Error::Fs(err)),
+        Err(err) => format_err(path, "", err),
     };
     match generate_from_string(&source, opt) {
         Ok(out) => out,
@@ -79,6 +79,14 @@
     }
 }
 
+fn read_to_string(path: &Path) -> Result<String> {
+    let bytes = fs::read(path)?;
+    match String::from_utf8(bytes) {
+        Ok(string) => Ok(string),
+        Err(err) => Err(Error::Utf8(path.to_owned(), err.utf8_error())),
+    }
+}
+
 fn generate_from_string(source: &str, opt: &Opt) -> Result<GeneratedCode> {
     let mut source = source;
     if source.starts_with("#!") && !source.starts_with("#![") {