about summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2021-11-21 19:44:47 +0100
committerMel <einebeere@gmail.com>2021-11-21 19:44:47 +0100
commit4e9d846fbd51cec9e8d931c4aa3f399668ac316e (patch)
treecda2e8645662b6c083add5ac87a279381eec054f /src/main.rs
parentabaa72af8a1be00f3f84d7771a7994bfbbccf719 (diff)
downloadrabbithole-4e9d846fbd51cec9e8d931c4aa3f399668ac316e.tar.zst
rabbithole-4e9d846fbd51cec9e8d931c4aa3f399668ac316e.zip
Basic errors for parsing.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs
index 0df0483..63f2347 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,10 +1,12 @@
-use std::{env, fs, path::Path};
+use std::{env, fs, path::Path, process::exit};
 
+mod error;
 mod interpret;
 mod lex;
 mod parse;
 mod types;
 
+use error::RHError;
 use lex::lexer::Lexer;
 
 use interpret::walker::Walker;
@@ -27,7 +29,7 @@ fn file(filename: impl AsRef<Path>) {
     let lexer = Lexer::new(&contents);
     let mut parser = Parser::new(lexer);
 
-    let node = parser.parse().expect("Failed parsing.");
+    let node = handle_error(parser.parse(), &contents);
     let mut walker = Walker::root();
 
     walker.walk(&node);
@@ -52,9 +54,19 @@ fn repl() {
         let lexer = Lexer::new(input_buffer.trim());
         let mut parser = Parser::new(lexer);
 
-        let node = parser.expression().expect("Failed parsing.");
+        let node = handle_error(parser.expression(), &input_buffer);
         let result = walker.walk_expression(&node).expect("Failed interpreting.");
 
         println!("🥕: {:?}\n", result);
     }
 }
+
+fn handle_error<T>(result: Result<T, RHError>, source: &str) -> T {
+    match result {
+        Ok(x) => x,
+        Err(error) => {
+            print!("{}", error.hydrate_source(&source));
+            exit(1);
+        }
+    }
+}