From b339283901acf09623f3cb2df918c3fdcc134605 Mon Sep 17 00:00:00 2001 From: Jaroslaw Konik Date: Mon, 26 May 2025 07:00:00 +0200 Subject: [PATCH] error handling --- ...ll_script_function_that_causes_runtime_error.rb | 2 +- .../tests/ruby/eval_that_causes_runtime_error.rb | 2 +- assets/tests/ruby/promise_runtime_error.rb | 2 +- src/runtimes/ruby.rs | 14 ++++++++------ src/systems.rs | 4 ++-- tests/tests.rs | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/assets/tests/ruby/call_script_function_that_causes_runtime_error.rb b/assets/tests/ruby/call_script_function_that_causes_runtime_error.rb index ae0afac..e6200c0 100644 --- a/assets/tests/ruby/call_script_function_that_causes_runtime_error.rb +++ b/assets/tests/ruby/call_script_function_that_causes_runtime_error.rb @@ -1,3 +1,3 @@ def test_func - print('abc' + 5) + raise end diff --git a/assets/tests/ruby/eval_that_causes_runtime_error.rb b/assets/tests/ruby/eval_that_causes_runtime_error.rb index a8a033e..7b460ab 100644 --- a/assets/tests/ruby/eval_that_causes_runtime_error.rb +++ b/assets/tests/ruby/eval_that_causes_runtime_error.rb @@ -1,2 +1,2 @@ mark_called -# puts("foo" + 1) +raise diff --git a/assets/tests/ruby/promise_runtime_error.rb b/assets/tests/ruby/promise_runtime_error.rb index 52715ce..8c3e31a 100644 --- a/assets/tests/ruby/promise_runtime_error.rb +++ b/assets/tests/ruby/promise_runtime_error.rb @@ -1,5 +1,5 @@ def test_func rust_func.and_then do |x| - print('abc' + 5) + raise end end diff --git a/src/runtimes/ruby.rs b/src/runtimes/ruby.rs index 93cb8a3..0aa1be1 100644 --- a/src/runtimes/ruby.rs +++ b/src/runtimes/ruby.rs @@ -6,12 +6,12 @@ use std::{ }; use ::magnus::value::Opaque; +use anyhow::anyhow; use bevy::{ asset::Asset, ecs::{component::Component, entity::Entity, resource::Resource, schedule::ScheduleLabel}, math::Vec3, reflect::TypePath, - tasks::futures_lite::io, }; use magnus::{ DataType, DataTypeFunctions, IntoValue, Object, RClass, RModule, Ruby, TryConvert, TypedData, @@ -223,7 +223,7 @@ impl TryConvert for BevyVec3 { impl From for ScriptingError { fn from(value: magnus::Error) -> Self { - ScriptingError::RuntimeError(Box::new(io::Error::other(value.to_string()))) + ScriptingError::RuntimeError(anyhow!(value.to_string()).into()) } } @@ -373,13 +373,15 @@ impl Runtime for RubyRuntime { var.ivar_set("_current", BevyEntity(entity)) .expect("Failed to set current entity handle"); - let value = ruby.eval::(&script).unwrap(); + + ruby.eval::(&script) + .map_err(|e| ScriptingError::RuntimeError(anyhow!(e.to_string()).into()))?; + var.ivar_set("_current", ruby.qnil().as_value()) .expect("Failed to unset current entity handle"); - RubyValue::new(value) - })); - Ok(RubyScriptData) + Ok::(RubyScriptData) + })) } fn register_fn( diff --git a/src/systems.rs b/src/systems.rs index a259fe9..a891720 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -1,13 +1,13 @@ -use bevy::{prelude::*, log::tracing}; +use bevy::{log::tracing, prelude::*}; use std::{ fmt::Display, sync::{Arc, Mutex}, }; use crate::{ + Callback, Callbacks, Runtime, ScriptingError, callback::FunctionCallEvent, promise::{Promise, PromiseInner}, - Callback, Callbacks, Runtime, ScriptingError, }; use super::components::Script; diff --git a/tests/tests.rs b/tests/tests.rs index fde6066..cad660b 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -266,7 +266,7 @@ macro_rules! scripting_tests { || {}, ); - assert_n_times_called!(app, 1); + assert_n_times_called!(app, 2); } #[test]