From 21828eea8da1b53383db98d9477ddf96c900afb3 Mon Sep 17 00:00:00 2001 From: Jaroslaw Konik Date: Sat, 24 May 2025 12:12:43 +0200 Subject: [PATCH] add example --- Cargo.toml | 6 +++ assets/examples/ruby/function_return_value.rb | 3 ++ examples/ruby/function_return_value.rs | 42 +++++++++++++++++++ src/runtimes/ruby.rs | 6 +-- 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 assets/examples/ruby/function_return_value.rb create mode 100644 examples/ruby/function_return_value.rs diff --git a/Cargo.toml b/Cargo.toml index dbea7df..18a91a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -185,6 +185,12 @@ name = "function_params_ruby" path = "examples/ruby/function_params.rs" required-features = ["ruby"] +[[example]] +name = "function_return_value_ruby" +path = "examples/ruby/function_return_value.rs" +required-features = ["ruby"] + + [dev-dependencies] tracing-subscriber = "0.3.18" mlua = { version = "0.9.8", features = ["luajit", "vendored", "send"] } diff --git a/assets/examples/ruby/function_return_value.rb b/assets/examples/ruby/function_return_value.rb new file mode 100644 index 0000000..522e7f3 --- /dev/null +++ b/assets/examples/ruby/function_return_value.rb @@ -0,0 +1,3 @@ +def get_value + 42 +end diff --git a/examples/ruby/function_return_value.rs b/examples/ruby/function_return_value.rs new file mode 100644 index 0000000..2dbfc46 --- /dev/null +++ b/examples/ruby/function_return_value.rs @@ -0,0 +1,42 @@ +use bevy::{app::AppExit, prelude::*}; +use bevy_scriptum::prelude::*; +use bevy_scriptum::runtimes::ruby::prelude::*; +use magnus::value::InnerValue; +use magnus::TryConvert; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, startup) + .add_systems(Update, call_lua_on_update_from_rust) + .add_scripting::(|runtime| { + runtime.add_function(String::from("quit"), |mut exit: EventWriter| { + exit.write(AppExit::Success); + }); + }) + .run(); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn(Script::::new( + assets_server.load("examples/ruby/function_return_value.rb"), + )); +} + +fn call_lua_on_update_from_rust( + mut scripted_entities: Query<(Entity, &mut RubyScriptData)>, + scripting_runtime: ResMut, + mut exit: EventWriter, +) { + for (entity, mut script_data) in &mut scripted_entities { + let val = scripting_runtime + .call_fn("get_value", &mut script_data, entity, ()) + .unwrap() + .0; + scripting_runtime.with_engine_thread(move |ruby| { + let val: i32 = TryConvert::try_convert(val.get_inner_with(&ruby)).unwrap(); + println!("script returned: {}", val); + }); + exit.write(AppExit::Success); + } +} diff --git a/src/runtimes/ruby.rs b/src/runtimes/ruby.rs index 0a9f18f..9abab09 100644 --- a/src/runtimes/ruby.rs +++ b/src/runtimes/ruby.rs @@ -275,7 +275,7 @@ impl Drop for RubyRuntime { } #[derive(Clone)] -pub struct RubyValue(magnus::value::Opaque); +pub struct RubyValue(pub magnus::value::Opaque); impl RubyValue { fn nil(ruby: &Ruby) -> Self { @@ -339,11 +339,11 @@ impl Runtime for RubyRuntime { } fn with_engine_mut(&mut self, _f: impl FnOnce(&mut Self::RawEngine) -> T) -> T { - unimplemented!(); + unimplemented!("Ruby requires single threaded execution, use `with_engine_thread`"); } fn with_engine(&self, _f: impl FnOnce(&Self::RawEngine) -> T) -> T { - unimplemented!(); + unimplemented!("Ruby requires single threaded execution, use `with_engine_thread`"); } fn eval(