2020-06-04 18:55:08 +02:00
|
|
|
use crate::output;
|
|
|
|
use ansi_term::Colour::Cyan;
|
2020-06-04 19:43:43 +02:00
|
|
|
use kalk::parser;
|
2020-06-04 18:55:08 +02:00
|
|
|
use rustyline::error::ReadlineError;
|
|
|
|
use rustyline::Editor;
|
|
|
|
use std::process;
|
|
|
|
|
|
|
|
pub fn start(mut parser: &mut parser::Context) {
|
2020-06-04 19:43:43 +02:00
|
|
|
let mut editor = Editor::<()>::new();
|
2020-06-04 18:55:08 +02:00
|
|
|
|
|
|
|
loop {
|
2020-06-04 19:43:43 +02:00
|
|
|
let readline = editor.readline(&Cyan.paint(">> ").to_string());
|
2020-06-04 18:55:08 +02:00
|
|
|
|
|
|
|
match readline {
|
|
|
|
Ok(input) => {
|
2020-06-04 19:43:43 +02:00
|
|
|
editor.add_history_entry(input.as_str());
|
2020-06-04 18:55:08 +02:00
|
|
|
eval_repl(&mut parser, &input);
|
|
|
|
}
|
|
|
|
Err(ReadlineError::Interrupted) => break,
|
|
|
|
_ => break,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn eval_repl(parser: &mut parser::Context, input: &str) {
|
|
|
|
match input {
|
|
|
|
"" => eprint!(""),
|
|
|
|
"clear" => print!("\x1B[2J"),
|
|
|
|
"exit" => process::exit(0),
|
|
|
|
_ => output::eval(parser, input),
|
|
|
|
}
|
|
|
|
}
|