From 07ae09ee91182e88fe548b71703c445fe9a1e28a Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 30 Mar 2021 16:52:43 +0530 Subject: use Display trait instead of Debug to show errors on main --- src/utils.rs | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'src/utils.rs') 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 @@ -use crate::{consts::FONT_PATH, lisp::error::LispError, message::Message}; +use crate::{ + app::AppState, + consts::FONT_PATH, + lisp::{ + error::{EvalError, LispError, ParseError}, + eval::eval, + expr::LispExpr, + lex::Lexer, + parse::Parser, + }, + message::Message, +}; + +use std::{fs::OpenOptions, io::Read, path::Path}; + use sdl2::{ keyboard::{Keycode, Mod}, pixels::Color, @@ -47,11 +61,29 @@ pub fn is_paste_event(keycode: Option, keymod: Mod) -> bool { keycode == Some(Keycode::V) && (keymod == Mod::LCTRLMOD || keymod == Mod::RCTRLMOD) } -pub fn handle_error(err: LispError, src: &str) -> Message { +pub fn handle_error(err: ParseError, src: &str, file_name: &str) -> Message { let mut message = Message::new(); - match err { - LispError::Parse(p) => message.set_error(p.display(&src)), - eval_err => message.set_error(eval_err.to_string()), - } + message.set_error(err.display(&src, file_name)); message } + +pub fn load_script>(path: P, app: &mut AppState) -> Result<(), LispError> { + let mut script = OpenOptions::new() + .read(true) + .write(false) + .create(false) + .open(path.as_ref()) + .map_err(EvalError::ScriptLoadError)?; + let mut buf = String::new(); + script + .read_to_string(&mut buf) + .map_err(EvalError::ScriptLoadError)?; + + let mut parser = Parser::new(Lexer::new(&buf, 0)); + for expr in parser.parse_exprs().map_err(|err| { + LispError::Stringified(err.display(&buf, path.as_ref().to_str().unwrap_or(""))) + })? { + eval(&expr, app)?; + } + return Ok(()); +} -- cgit v1.2.3