diff options
-rw-r--r-- | src/lex/mod.rs | 4 | ||||
-rw-r--r-- | src/main.rs | 49 | ||||
-rw-r--r-- | src/readline/mod.rs | 17 |
3 files changed, 40 insertions, 30 deletions
diff --git a/src/lex/mod.rs b/src/lex/mod.rs index fe9c421..b21bafb 100644 --- a/src/lex/mod.rs +++ b/src/lex/mod.rs | |||
@@ -131,7 +131,7 @@ pub fn lexer(input: &str, prev_ans: Option<f64>) -> Result<Vec<Token>, CalcError | |||
131 | 131 | ||
132 | for letter in input.chars() { | 132 | for letter in input.chars() { |
133 | match letter { | 133 | match letter { |
134 | '0'...'9' | '.' => { | 134 | '0'..='9' | '.' => { |
135 | if !char_vec.is_empty() { | 135 | if !char_vec.is_empty() { |
136 | if FUNCTIONS.get(&char_vec[..]).is_some() { | 136 | if FUNCTIONS.get(&char_vec[..]).is_some() { |
137 | return Err(CalcError::Syntax(format!( | 137 | return Err(CalcError::Syntax(format!( |
@@ -174,7 +174,7 @@ pub fn lexer(input: &str, prev_ans: Option<f64>) -> Result<Vec<Token>, CalcError | |||
174 | last_char_is_op = false; | 174 | last_char_is_op = false; |
175 | result.push(Token::Num(prev_ans.unwrap())); | 175 | result.push(Token::Num(prev_ans.unwrap())); |
176 | } | 176 | } |
177 | 'a'...'z' | 'A'...'Z' => { | 177 | 'a'..='z' | 'A'..='Z' => { |
178 | let parse_num = num_vec.parse::<f64>().ok(); | 178 | let parse_num = num_vec.parse::<f64>().ok(); |
179 | if let Some(x) = parse_num { | 179 | if let Some(x) = parse_num { |
180 | result.push(Token::Num(x)); | 180 | result.push(Token::Num(x)); |
diff --git a/src/main.rs b/src/main.rs index 38f4837..63b07c9 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -66,18 +66,20 @@ fn main() { | |||
66 | let mut history_path = PathBuf::from(eva_data_dir); | 66 | let mut history_path = PathBuf::from(eva_data_dir); |
67 | let mut previous_ans_path = PathBuf::from(eva_cache_dir); | 67 | let mut previous_ans_path = PathBuf::from(eva_cache_dir); |
68 | 68 | ||
69 | match create_dir_all(eva_data_dir) { | 69 | if let Err(_) = create_dir_all(eva_data_dir) { |
70 | Ok(_) => { | 70 | history_path = PathBuf::from(UserDirs::new().unwrap().home_dir()); |
71 | history_path.push("history.txt"); | 71 | } |
72 | previous_ans_path.push("previous_ans.txt"); | 72 | if let Err(_) = create_dir_all(eva_cache_dir) { |
73 | }, | 73 | previous_ans_path = PathBuf::from(UserDirs::new().unwrap().home_dir()); |
74 | Err(_) => { | 74 | } |
75 | history_path = PathBuf::from(UserDirs::new().unwrap().home_dir()); | 75 | history_path.push("history.txt"); |
76 | previous_ans_path = PathBuf::from(UserDirs::new().unwrap().home_dir()); | 76 | previous_ans_path.push("previous_ans.txt"); |
77 | } | ||
78 | }; | ||
79 | 77 | ||
80 | std::fs::write(&previous_ans_path, "0"); | 78 | if let Err(err) = std::fs::write(&previous_ans_path, "0") { |
79 | println!("Could not write to previous_ans_path"); | ||
80 | println!("{:?}", err); | ||
81 | std::process::exit(1); | ||
82 | } | ||
81 | 83 | ||
82 | if rl.load_history(history_path.as_path()).is_err() { | 84 | if rl.load_history(history_path.as_path()).is_err() { |
83 | println!("No previous history.") | 85 | println!("No previous history.") |
@@ -92,18 +94,27 @@ fn main() { | |||
92 | let evaled = eval_math_expression(&line[..], prev_ans); | 94 | let evaled = eval_math_expression(&line[..], prev_ans); |
93 | match evaled { | 95 | match evaled { |
94 | Ok(ans) => { | 96 | Ok(ans) => { |
95 | use std::io::Write; | ||
96 | use std::fs::OpenOptions; | 97 | use std::fs::OpenOptions; |
97 | let mut file = OpenOptions::new() | 98 | use std::io::Write; |
99 | prev_ans = Some(ans); | ||
100 | pprint(ans); | ||
101 | match OpenOptions::new() | ||
98 | .write(true) | 102 | .write(true) |
99 | .create(true) | 103 | .create(true) |
100 | .open(&previous_ans_path) | 104 | .open(&previous_ans_path) |
101 | .unwrap(); | 105 | { |
102 | 106 | Ok(mut file) => { | |
103 | prev_ans = Some(ans); | 107 | if let Err(err) = writeln!(file, "{}", ans) { |
104 | writeln!(file, "{}", ans); | 108 | println!( |
105 | 109 | "Error while writing previous answer to file: {}", | |
106 | pprint(ans); | 110 | err |
111 | ) | ||
112 | } | ||
113 | } | ||
114 | Err(err) => { | ||
115 | println!("Error while writing previous answer to file: {}", err) | ||
116 | } | ||
117 | } | ||
107 | } | 118 | } |
108 | Err(e) => println!("{}", handler(e)), | 119 | Err(e) => println!("{}", handler(e)), |
109 | }; | 120 | }; |
diff --git a/src/readline/mod.rs b/src/readline/mod.rs index 8eedbfa..ea195ee 100644 --- a/src/readline/mod.rs +++ b/src/readline/mod.rs | |||
@@ -20,18 +20,18 @@ pub struct RLHelper { | |||
20 | hinter: HistoryHinter, | 20 | hinter: HistoryHinter, |
21 | } | 21 | } |
22 | 22 | ||
23 | struct LineHighlighter { } | 23 | struct LineHighlighter {} |
24 | impl Highlighter for LineHighlighter { | 24 | impl Highlighter for LineHighlighter { |
25 | fn highlight_hint<'h>(&self, hint: &'h str) -> Cow<'h, str> { | 25 | fn highlight_hint<'h>(&self, hint: &'h str) -> Cow<'h, str> { |
26 | Owned(format!("\x1b[90m{}\x1b[0m", hint)) | 26 | Owned(format!("\x1b[90m{}\x1b[0m", hint)) |
27 | } | 27 | } |
28 | fn highlight<'l>(&self, line: &'l str, _: usize) -> Cow<'l, str> { | 28 | fn highlight<'l>(&self, line: &'l str, _: usize) -> Cow<'l, str> { |
29 | use std::io::{ BufReader, BufRead }; | ||
30 | use std::fs::OpenOptions; | 29 | use std::fs::OpenOptions; |
30 | use std::io::{BufRead, BufReader}; | ||
31 | 31 | ||
32 | let eva_dirs = ProjectDirs::from("com", "NerdyPepper", "eva").unwrap(); | 32 | let eva_dirs = ProjectDirs::from("com", "NerdyPepper", "eva").unwrap(); |
33 | let eva_data_dir = eva_dirs.data_dir(); | 33 | let eva_data_dir = eva_dirs.data_dir(); |
34 | let mut previous_ans_path= PathBuf::from(eva_data_dir); | 34 | let mut previous_ans_path = PathBuf::from(eva_data_dir); |
35 | previous_ans_path.push("previous_ans.txt"); | 35 | previous_ans_path.push("previous_ans.txt"); |
36 | 36 | ||
37 | let file = OpenOptions::new() | 37 | let file = OpenOptions::new() |
@@ -43,11 +43,10 @@ impl Highlighter for LineHighlighter { | |||
43 | 43 | ||
44 | let rdr = BufReader::new(file); | 44 | let rdr = BufReader::new(file); |
45 | let lines = rdr.lines().map(|l| l.unwrap()); | 45 | let lines = rdr.lines().map(|l| l.unwrap()); |
46 | let prev_ans = lines | 46 | let prev_ans = match lines.last() { |
47 | .last() | 47 | Some(val) => val.parse::<f64>().ok(), |
48 | .unwrap() | 48 | None => None, |
49 | .parse::<f64>() | 49 | }; |
50 | .ok(); | ||
51 | let op = eval_math_expression(line, prev_ans); | 50 | let op = eval_math_expression(line, prev_ans); |
52 | match op { | 51 | match op { |
53 | Ok(_) => { | 52 | Ok(_) => { |
@@ -114,7 +113,7 @@ pub fn create_readline() -> Editor<RLHelper> { | |||
114 | let mut rl = Editor::with_config(config); | 113 | let mut rl = Editor::with_config(config); |
115 | let h = RLHelper { | 114 | let h = RLHelper { |
116 | completer: FilenameCompleter::new(), | 115 | completer: FilenameCompleter::new(), |
117 | highlighter: LineHighlighter { }, | 116 | highlighter: LineHighlighter {}, |
118 | hinter: HistoryHinter {}, | 117 | hinter: HistoryHinter {}, |
119 | }; | 118 | }; |
120 | rl.set_helper(Some(h)); | 119 | rl.set_helper(Some(h)); |