summaryrefslogtreecommitdiff
path: root/matrix-bin/src/repl.rs
diff options
context:
space:
mode:
Diffstat (limited to 'matrix-bin/src/repl.rs')
-rw-r--r--matrix-bin/src/repl.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/matrix-bin/src/repl.rs b/matrix-bin/src/repl.rs
index 81fd289..1b5addc 100644
--- a/matrix-bin/src/repl.rs
+++ b/matrix-bin/src/repl.rs
@@ -1,3 +1,8 @@
+use std::{io::Write, sync::atomic::Ordering};
+
+use matrix::{value::Value, vm::Interupt};
+use rustyline::Config;
+
use crate::State;
pub struct Repl<'a> {
@@ -11,14 +16,29 @@ impl<'a> Repl<'a> {
}
pub fn run(&mut self) {
- let mut rl = rustyline::DefaultEditor::new().unwrap();
+
+ let interupt = self.state.vm.interupt();
+ ctrlc::set_handler(move || {
+ interupt.store(Interupt::KeyboardInterupt as usize, Ordering::SeqCst);
+ }).unwrap();
+
+ let config = Config::builder()
+ .check_cursor_position(true)
+ .build();
+ let mut rl = rustyline::DefaultEditor::with_config(config).unwrap();
loop {
let Ok(line) = rl.readline(">> ") else {
break;
};
- if let Err(err) = self.state.execute(line) {
- crate::error(err);
+ match self.state.execute(line) {
+ Err(err) => crate::error(err),
+ Ok(val) => {
+ if val != Value::Nil {
+ println!("{val}");
+ }
+ }
}
+ let _ = std::io::stdout().flush();
}
}