From a4c5911603b4bb4a9f32bf62781e93e6b501d7f7 Mon Sep 17 00:00:00 2001 From: Jaroslaw Konik Date: Fri, 9 May 2025 18:19:44 +0200 Subject: [PATCH] call rust from ruby --- .../rust_function_gets_called_from_script.rb | 3 +++ src/runtimes/ruby.rs | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 assets/tests/ruby/rust_function_gets_called_from_script.rb diff --git a/assets/tests/ruby/rust_function_gets_called_from_script.rb b/assets/tests/ruby/rust_function_gets_called_from_script.rb new file mode 100644 index 0000000..fc70a31 --- /dev/null +++ b/assets/tests/ruby/rust_function_gets_called_from_script.rb @@ -0,0 +1,3 @@ +def test_func() + rust_func() +end diff --git a/src/runtimes/ruby.rs b/src/runtimes/ruby.rs index bd1b9bd..7e808f3 100644 --- a/src/runtimes/ruby.rs +++ b/src/runtimes/ruby.rs @@ -10,6 +10,7 @@ use bevy::{ }; use magnus::{ embed::{init, Cleanup}, + function, prelude::*, }; use serde::Deserialize; @@ -93,8 +94,6 @@ impl Runtime for RubyRuntime { script: &Self::ScriptAsset, entity: bevy::prelude::Entity, ) -> Result { - // let engine = - // RUBY_ENGINE.get_or_init(|| Mutex::new(RubyEngine(unsafe { magnus::embed::init() }))); let ruby = magnus::Ruby::get().unwrap(); ruby.eval::(&script.0); Ok(RubyScriptData) @@ -114,7 +113,19 @@ impl Runtime for RubyRuntime { + Sync + 'static, ) -> Result<(), crate::ScriptingError> { - todo!() + let ruby = magnus::Ruby::get().unwrap(); + + unsafe extern "C" fn callback(val: magnus::Value) -> magnus::Value { + let ruby = magnus::Ruby::get().unwrap(); + // f(); + ruby.qnil().as_value() + } + + ruby.define_global_function( + &name, + callback as unsafe extern "C" fn(magnus::Value) -> magnus::Value, + ); + Ok(()) } fn call_fn(