diff --git a/Cargo.toml b/Cargo.toml index e750347..6305975 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -205,6 +205,11 @@ name = "promises_ruby" path = "examples/ruby/promises.rs" required-features = ["ruby"] +[[example]] +name = "side_effects_ruby" +path = "examples/ruby/side_effects.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/side_effects.rb b/assets/examples/ruby/side_effects.rb new file mode 100644 index 0000000..63642de --- /dev/null +++ b/assets/examples/ruby/side_effects.rb @@ -0,0 +1 @@ +spawn_entity() diff --git a/examples/ruby/side_effects.rs b/examples/ruby/side_effects.rs new file mode 100644 index 0000000..031bdea --- /dev/null +++ b/examples/ruby/side_effects.rs @@ -0,0 +1,41 @@ +use bevy::{app::AppExit, prelude::*}; +use bevy_scriptum::prelude::*; +use bevy_scriptum::runtimes::ruby::prelude::*; + +fn main() { + App::new() + // This is just needed for headless console app, not needed for a regular bevy game + // that uses a winit window + .set_runner(move |mut app: App| loop { + app.update(); + if let Some(exit) = app.should_exit() { + return exit; + } + }) + .add_plugins(DefaultPlugins) + .add_systems(Startup, startup) + .add_systems(Update, print_entity_names_and_quit) + .add_scripting::(|runtime| { + runtime.add_function(String::from("spawn_entity"), spawn_entity); + }) + .run(); +} + +fn spawn_entity(mut commands: Commands) { + commands.spawn(Name::new("SpawnedEntity")); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn((Script::::new( + assets_server.load("examples/ruby/side_effects.rb"), + ),)); +} + +fn print_entity_names_and_quit(query: Query<&Name>, mut exit: EventWriter) { + if !query.is_empty() { + for e in &query { + println!("{}", e); + } + exit.write(AppExit::Success); + } +}