diff --git a/CHANGELOG.md b/CHANGELOG.md index a8567f9b..0e5d5538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Enhancements * Expressions involving `this` should now run slightly faster due to a dedicated `AST` node `ThisPtr`. * A `take` function is added to the standard library to take ownership of any data (replacing with `()`) in order to avoid cloning. +* `EvalAltResult::ErrorMismatchOutputType` now gives a better name for the requested generic type (e.g. `&str` is now `&str` and not `string`). Version 1.14.0 diff --git a/src/api/call_fn.rs b/src/api/call_fn.rs index 120c4f4c..db5031aa 100644 --- a/src/api/call_fn.rs +++ b/src/api/call_fn.rs @@ -190,8 +190,11 @@ impl Engine { let typ = self.map_type_name(result.type_name()); result.try_cast().ok_or_else(|| { - let t = self.map_type_name(type_name::()).into(); - ERR::ErrorMismatchOutputType(t, typ.into(), Position::NONE).into() + let typename = match type_name::() { + typ @ _ if typ.contains("::") => self.map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType(typename.into(), typ.into(), Position::NONE).into() }) }) } diff --git a/src/api/eval.rs b/src/api/eval.rs index 741714f7..7ac42d16 100644 --- a/src/api/eval.rs +++ b/src/api/eval.rs @@ -213,8 +213,13 @@ impl Engine { } result.try_cast_raw::().map_err(|v| { + let typename = match type_name::() { + typ @ _ if typ.contains("::") => self.map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType( - self.map_type_name(type_name::()).into(), + typename.into(), self.map_type_name(v.type_name()).into(), Position::NONE, ) diff --git a/src/func/native.rs b/src/func/native.rs index 300daaef..b56cd9d9 100644 --- a/src/func/native.rs +++ b/src/func/native.rs @@ -321,8 +321,11 @@ impl<'a> NativeCallContext<'a> { let typ = self.engine().map_type_name(result.type_name()); result.try_cast().ok_or_else(|| { - let t = self.engine().map_type_name(type_name::()).into(); - ERR::ErrorMismatchOutputType(t, typ.into(), Position::NONE).into() + let typename = match type_name::() { + typ @ _ if typ.contains("::") => self.engine.map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType(typename.into(), typ.into(), Position::NONE).into() }) }) } @@ -352,8 +355,11 @@ impl<'a> NativeCallContext<'a> { let typ = self.engine().map_type_name(result.type_name()); result.try_cast().ok_or_else(|| { - let t = self.engine().map_type_name(type_name::()).into(); - ERR::ErrorMismatchOutputType(t, typ.into(), Position::NONE).into() + let typename = match type_name::() { + typ @ _ if typ.contains("::") => self.engine.map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType(typename.into(), typ.into(), Position::NONE).into() }) }) } diff --git a/src/types/fn_ptr.rs b/src/types/fn_ptr.rs index abe6e713..3090b7a2 100644 --- a/src/types/fn_ptr.rs +++ b/src/types/fn_ptr.rs @@ -226,8 +226,11 @@ impl FnPtr { let typ = engine.map_type_name(result.type_name()); result.try_cast().ok_or_else(|| { - let t = engine.map_type_name(type_name::()).into(); - ERR::ErrorMismatchOutputType(t, typ.into(), Position::NONE).into() + let typename = match type_name::() { + typ @ _ if typ.contains("::") => engine.map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType(typename.into(), typ.into(), Position::NONE).into() }) }) } @@ -255,8 +258,11 @@ impl FnPtr { let typ = context.engine().map_type_name(result.type_name()); result.try_cast().ok_or_else(|| { - let t = context.engine().map_type_name(type_name::()).into(); - ERR::ErrorMismatchOutputType(t, typ.into(), Position::NONE).into() + let typename = match type_name::() { + typ @ _ if typ.contains("::") => context.engine().map_type_name(typ), + typ @ _ => typ, + }; + ERR::ErrorMismatchOutputType(typename.into(), typ.into(), Position::NONE).into() }) }) } diff --git a/tests/mismatched_op.rs b/tests/mismatched_op.rs index dd094a45..ca7b5d93 100644 --- a/tests/mismatched_op.rs +++ b/tests/mismatched_op.rs @@ -10,6 +10,21 @@ fn test_mismatched_op() { )); } +#[test] +fn test_mismatched_op_name() { + let engine = Engine::new(); + + assert!(matches!( + *engine.eval::("true").expect_err("expects error"), + EvalAltResult::ErrorMismatchOutputType(need, actual, ..) if need == "string" && actual == "bool" + )); + + assert!(matches!( + *engine.eval::<&str>("true").expect_err("expects error"), + EvalAltResult::ErrorMismatchOutputType(need, actual, ..) if need == "&str" && actual == "bool" + )); +} + #[test] #[cfg(not(feature = "no_object"))] fn test_mismatched_op_custom_type() -> Result<(), Box> {