From 0ace370fc29da0de333b9e6f127ed000e5d445cc Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 13 Jan 2017 18:59:34 -0800 Subject: [PATCH] Tightened up REPL loop --- src/main.rs | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8cf7255..9576747 100644 --- a/src/main.rs +++ b/src/main.rs @@ -133,30 +133,28 @@ impl<'a> Repl<'a> { fn input_handler(&mut self, input: &str) -> String { let mut result = String::new(); - - let tokens = match tokenize(input) { - Err(e) => return format!("Tokenization error: {}", e.msg), - Ok(t) => t, + let intermediate: Result = + tokenize(input) + .map_err(|e| format!("Tokenization error: {}", e.msg)) + .and_then( + |tokens| { + if self.show_tokens { + result.push_str(&format!("Tokens: {:?}\n", tokens)); + } + parse(&tokens, &[]).map_err(|e| format!("Parse error: {}", e.msg)) + }) + .and_then( + |ast| { + if self.show_parse { + result.push_str(&format!("AST: {:?}\n", ast)); + } + // for now only handle last output + let mut full_output: Vec = self.evaluator.run(ast); + Ok(full_output.pop().unwrap_or("".to_string())) + }); + match intermediate { + Ok(s) | Err(s) => result.push_str(&s), }; - - if self.show_tokens { - result.push_str(&format!("Tokens: {:?}\n", tokens)); - } - - let ast = match parse(&tokens, &[]) { - Ok(ast) => ast, - Err(err) => return format!("Parse error: {}", err.msg), - }; - - if self.show_parse { - result.push_str(&format!("AST: {:?}\n", ast)); - } - - let mut output: Vec = self.evaluator.run(ast); - - // for now only handle last output - let interpreter_result = output.pop().unwrap_or("".to_string()); - result.push_str(&interpreter_result); result } @@ -205,7 +203,7 @@ impl<'a> Repl<'a> { } } }, - _ => (), + e => println!("Unknown command: {}", e) } return true; }