summaryrefslogtreecommitdiff
path: root/matrix-bin/src/repl.rs
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-02-26 19:00:42 -0500
committerFreya Murphy <freya@freyacat.org>2024-02-26 19:00:42 -0500
commit158bcae00dbe2af50e51468ad003fb594a858e6d (patch)
treed5639b745b2a24e417e8003694a8994354e2d708 /matrix-bin/src/repl.rs
parentfn call fix (diff)
downloadmatrix-158bcae00dbe2af50e51468ad003fb594a858e6d.tar.gz
matrix-158bcae00dbe2af50e51468ad003fb594a858e6d.tar.bz2
matrix-158bcae00dbe2af50e51468ad003fb594a858e6d.zip
changes
Diffstat (limited to 'matrix-bin/src/repl.rs')
-rw-r--r--matrix-bin/src/repl.rs27
1 files changed, 21 insertions, 6 deletions
diff --git a/matrix-bin/src/repl.rs b/matrix-bin/src/repl.rs
index 1b5addc..f2964d4 100644
--- a/matrix-bin/src/repl.rs
+++ b/matrix-bin/src/repl.rs
@@ -1,9 +1,9 @@
use std::{io::Write, sync::atomic::Ordering};
use matrix::{value::Value, vm::Interupt};
-use rustyline::Config;
+use rustyline::{Config, EditMode, ColorMode, Editor, CompletionType};
-use crate::State;
+use crate::{State, helper::MatrixHelper};
pub struct Repl<'a> {
state: State<'a>
@@ -17,24 +17,39 @@ impl<'a> Repl<'a> {
pub fn run(&mut self) {
- let interupt = self.state.vm.interupt();
+ let interupt = self.state.vm.borrow().interupt();
ctrlc::set_handler(move || {
interupt.store(Interupt::KeyboardInterupt as usize, Ordering::SeqCst);
}).unwrap();
let config = Config::builder()
.check_cursor_position(true)
+ .completion_type(CompletionType::List)
+ .edit_mode(EditMode::Emacs)
+ .color_mode(if self.state.color { ColorMode::Enabled } else { ColorMode::Disabled })
.build();
- let mut rl = rustyline::DefaultEditor::with_config(config).unwrap();
+
+ let helper = MatrixHelper::new(self.state.vm.clone());
+
+ let mut rl = Editor::with_config(config).unwrap();
+ rl.set_helper(Some(helper));
+
loop {
let Ok(line) = rl.readline(">> ") else {
break;
};
+ if let Err(_) = rl.add_history_entry(&line) {
+ break;
+ };
match self.state.execute(line) {
- Err(err) => crate::error(err),
+ Err(err) => crate::error(err, &self.state),
Ok(val) => {
if val != Value::Nil {
- println!("{val}");
+ if self.state.color {
+ println!("{val:#}");
+ } else {
+ println!("{val}");
+ }
}
}
}