diff options
author | Akshay <[email protected]> | 2021-03-30 12:22:43 +0100 |
---|---|---|
committer | Akshay <[email protected]> | 2021-03-30 12:22:43 +0100 |
commit | 07ae09ee91182e88fe548b71703c445fe9a1e28a (patch) | |
tree | 99203e78eff5cf95165c646b2da2b933ed197956 /src/utils.rs | |
parent | dbcaa0df655bdd11c6d01ce28e018fc1e80ed394 (diff) |
use Display trait instead of Debug to show errors on main
Diffstat (limited to 'src/utils.rs')
-rw-r--r-- | src/utils.rs | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/src/utils.rs b/src/utils.rs index 3e5ff55..fc96615 100644 --- a/src/utils.rs +++ b/src/utils.rs | |||
@@ -1,4 +1,18 @@ | |||
1 | use crate::{consts::FONT_PATH, lisp::error::LispError, message::Message}; | 1 | use crate::{ |
2 | app::AppState, | ||
3 | consts::FONT_PATH, | ||
4 | lisp::{ | ||
5 | error::{EvalError, LispError, ParseError}, | ||
6 | eval::eval, | ||
7 | expr::LispExpr, | ||
8 | lex::Lexer, | ||
9 | parse::Parser, | ||
10 | }, | ||
11 | message::Message, | ||
12 | }; | ||
13 | |||
14 | use std::{fs::OpenOptions, io::Read, path::Path}; | ||
15 | |||
2 | use sdl2::{ | 16 | use sdl2::{ |
3 | keyboard::{Keycode, Mod}, | 17 | keyboard::{Keycode, Mod}, |
4 | pixels::Color, | 18 | pixels::Color, |
@@ -47,11 +61,29 @@ pub fn is_paste_event(keycode: Option<Keycode>, keymod: Mod) -> bool { | |||
47 | keycode == Some(Keycode::V) && (keymod == Mod::LCTRLMOD || keymod == Mod::RCTRLMOD) | 61 | keycode == Some(Keycode::V) && (keymod == Mod::LCTRLMOD || keymod == Mod::RCTRLMOD) |
48 | } | 62 | } |
49 | 63 | ||
50 | pub fn handle_error(err: LispError, src: &str) -> Message { | 64 | pub fn handle_error(err: ParseError, src: &str, file_name: &str) -> Message { |
51 | let mut message = Message::new(); | 65 | let mut message = Message::new(); |
52 | match err { | 66 | message.set_error(err.display(&src, file_name)); |
53 | LispError::Parse(p) => message.set_error(p.display(&src)), | ||
54 | eval_err => message.set_error(eval_err.to_string()), | ||
55 | } | ||
56 | message | 67 | message |
57 | } | 68 | } |
69 | |||
70 | pub fn load_script<P: AsRef<Path>>(path: P, app: &mut AppState) -> Result<(), LispError> { | ||
71 | let mut script = OpenOptions::new() | ||
72 | .read(true) | ||
73 | .write(false) | ||
74 | .create(false) | ||
75 | .open(path.as_ref()) | ||
76 | .map_err(EvalError::ScriptLoadError)?; | ||
77 | let mut buf = String::new(); | ||
78 | script | ||
79 | .read_to_string(&mut buf) | ||
80 | .map_err(EvalError::ScriptLoadError)?; | ||
81 | |||
82 | let mut parser = Parser::new(Lexer::new(&buf, 0)); | ||
83 | for expr in parser.parse_exprs().map_err(|err| { | ||
84 | LispError::Stringified(err.display(&buf, path.as_ref().to_str().unwrap_or("<unknown>"))) | ||
85 | })? { | ||
86 | eval(&expr, app)?; | ||
87 | } | ||
88 | return Ok(()); | ||
89 | } | ||