From d2951bfb6be45d35b898436f1c42bc70a3b4b32c Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Tue, 17 Mar 2020 16:52:06 +0800 Subject: [PATCH] Make sure return is not an error. --- src/api.rs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/api.rs b/src/api.rs index 172e55d4..4f91d96f 100644 --- a/src/api.rs +++ b/src/api.rs @@ -217,23 +217,19 @@ impl<'e> Engine<'e> { Ok(result) } - match eval_ast_internal(self, scope, ast) { - Err(EvalAltResult::Return(out, pos)) => out.downcast::().map(|v| *v).map_err(|a| { - EvalAltResult::ErrorMismatchOutputType( - self.map_type_name((*a).type_name()).to_string(), - pos, - ) - }), - - Ok(out) => out.downcast::().map(|v| *v).map_err(|a| { - EvalAltResult::ErrorMismatchOutputType( - self.map_type_name((*a).type_name()).to_string(), - Position::eof(), - ) - }), - - Err(err) => Err(err), - } + eval_ast_internal(self, scope, ast) + .or_else(|err| match err { + EvalAltResult::Return(out, _) => Ok(out), + _ => Err(err), + }) + .and_then(|out| { + out.downcast::().map(|v| *v).map_err(|a| { + EvalAltResult::ErrorMismatchOutputType( + self.map_type_name((*a).type_name()).to_string(), + Position::eof(), + ) + }) + }) } /// Evaluate a file, but throw away the result and only return error (if any). @@ -333,7 +329,10 @@ impl<'e> Engine<'e> { self.clear_functions(); } - result + result.or_else(|err| match err { + EvalAltResult::Return(_, _) => Ok(()), + _ => Err(err), + }) } /// Load a list of functions into the Engine.