added rustyline

This commit is contained in:
Valerie Wolfe 2024-07-09 14:20:04 -04:00
parent ce65fefcba
commit f1970a657a
2 changed files with 12 additions and 17 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "quickmath" name = "quickmath"
version = "0.2.3" version = "0.3.0"
edition = "2021" edition = "2021"
authors = [ "Valerie Wolfe <sleeplessval@gmail.com>" ] authors = [ "Valerie Wolfe <sleeplessval@gmail.com>" ]
description = "A quick command-line math evaluator." description = "A quick command-line math evaluator."
@ -14,6 +14,7 @@ path = "src/main.rs"
[dependencies] [dependencies]
evalexpr = "11.0.0" evalexpr = "11.0.0"
rustyline = "14.0.0"
termion = "1.5.6" termion = "1.5.6"
[profile.release] [profile.release]

View file

@ -1,7 +1,6 @@
use std::{ use std::{
env, env,
io::{ io::{
stdin,
stdout, stdout,
Write Write
@ -16,6 +15,7 @@ use evalexpr::{
HashMapContext, HashMapContext,
Value Value
}; };
use rustyline::DefaultEditor;
use termion::{ use termion::{
color, color,
style style
@ -62,33 +62,27 @@ fn main() {
for expression in expressions { for expression in expressions {
match expression.as_str() { match expression.as_str() {
"help" => help_text(), "help" => help_text(),
_ => do_eval(expression, &mut context) _ => do_eval(&expression, &mut context)
} }
} }
} else { } else {
let mut rl = DefaultEditor::new().unwrap();
// enter interactive mode if no args are given // enter interactive mode if no args are given
println!("{}quickmaths v{}{}\n{}Interactive Mode{}", style::Bold, VERSION, style::Reset, style::Faint, style::Reset); println!("{}quickmaths v{}{}\n{}Interactive Mode{}", style::Bold, VERSION, style::Reset, style::Faint, style::Reset);
loop { loop {
print!("> "); match rl.readline("> ").as_deref() {
stdout().flush().unwrap(); Ok("") |
let mut i_line = String::new(); Ok("exit") |
let line_result = stdin().read_line(&mut i_line); Err(_) => break,
if line_result.is_err() {
break; Ok(line) => do_eval(line, &mut context),
}
let line = i_line.trim().to_string();
match line.as_str() {
"" |
"exit" => break,
_ => do_eval(line, &mut context)
} }
reset(); reset();
} }
} }
} }
fn do_eval(i_expression: String, context: &mut HashMapContext) { fn do_eval(expression: &str, context: &mut HashMapContext) {
let expression = i_expression.as_str();
let i_result = eval_with_context_mut(expression, context); let i_result = eval_with_context_mut(expression, context);
if i_result.is_err() { if i_result.is_err() {
println!( println!(