aboutsummaryrefslogtreecommitdiff
path: root/src/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.rs')
-rw-r--r--src/utils.rs44
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 @@
1use crate::{consts::FONT_PATH, lisp::error::LispError, message::Message}; 1use 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
14use std::{fs::OpenOptions, io::Read, path::Path};
15
2use sdl2::{ 16use 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
50pub fn handle_error(err: LispError, src: &str) -> Message { 64pub 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
70pub 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}