Skip to content

Commit d108cbd

Browse files
committed
Improve UI for adding intiializers and add docs, correct initialization of lua plugins
1 parent 05ffc7e commit d108cbd

File tree

6 files changed

+53
-16
lines changed

6 files changed

+53
-16
lines changed

crates/bevy_mod_scripting_core/src/lib.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub struct ScriptingPlugin<P: IntoScriptPluginParams> {
6565
pub callback_handler: Option<HandlerFn<P>>,
6666
/// The context builder for loading contexts
6767
pub context_builder: ContextBuilder<P>,
68-
/// The context assigner for assigning contexts to scripts, if not provided default strategy of keeping each script in its own context is used
68+
/// The context assigner for assigning contexts to scripts.
6969
pub context_assigner: ContextAssigner<P>,
7070
pub language_mapper: Option<AssetPathToLanguageMapper>,
7171

@@ -139,6 +139,40 @@ impl<P: IntoScriptPluginParams> ScriptingPlugin<P> {
139139
}
140140
}
141141

142+
/// Utility trait for configuring all scripting plugins.
143+
pub trait ConfigureScriptPlugin {
144+
type P: IntoScriptPluginParams;
145+
fn add_context_initializer(self, initializer: ContextInitializer<Self::P>) -> Self;
146+
fn add_context_pre_handling_initializer(
147+
self,
148+
initializer: ContextPreHandlingInitializer<Self::P>,
149+
) -> Self;
150+
fn add_runtime_initializer(self, initializer: RuntimeInitializer<Self::P>) -> Self;
151+
}
152+
153+
impl<P: IntoScriptPluginParams + AsMut<ScriptingPlugin<P>>> ConfigureScriptPlugin for P {
154+
type P = P;
155+
156+
fn add_context_initializer(mut self, initializer: ContextInitializer<Self::P>) -> Self {
157+
self.as_mut().add_context_initializer(initializer);
158+
self
159+
}
160+
161+
fn add_context_pre_handling_initializer(
162+
mut self,
163+
initializer: ContextPreHandlingInitializer<Self::P>,
164+
) -> Self {
165+
self.as_mut()
166+
.add_context_pre_handling_initializer(initializer);
167+
self
168+
}
169+
170+
fn add_runtime_initializer(mut self, initializer: RuntimeInitializer<Self::P>) -> Self {
171+
self.as_mut().add_runtime_initializer(initializer);
172+
self
173+
}
174+
}
175+
142176
// One of registration of things that need to be done only once per app
143177
fn once_per_app_init(app: &mut App) {
144178
#[derive(Resource)]

crates/languages/bevy_mod_scripting_lua/src/lib.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ impl IntoScriptPluginParams for LuaScriptingPlugin {
3131
fn build_runtime() -> Self::R {}
3232
}
3333

34+
// necessary for automatic config goodies
35+
impl AsMut<ScriptingPlugin<Self>> for LuaScriptingPlugin {
36+
fn as_mut(&mut self) -> &mut ScriptingPlugin<LuaScriptingPlugin> {
37+
&mut self.scripting_plugin
38+
}
39+
}
40+
3441
pub struct LuaScriptingPlugin {
3542
pub scripting_plugin: ScriptingPlugin<Self>,
3643
}
@@ -39,13 +46,13 @@ impl Default for LuaScriptingPlugin {
3946
fn default() -> Self {
4047
LuaScriptingPlugin {
4148
scripting_plugin: ScriptingPlugin {
42-
context_assigner: None,
49+
context_assigner: Default::default(),
4350
runtime_settings: None,
4451
callback_handler: Some(lua_handler),
45-
context_builder: Some(ContextBuilder::<LuaScriptingPlugin> {
52+
context_builder: ContextBuilder::<LuaScriptingPlugin> {
4653
load: lua_context_load,
4754
reload: lua_context_reload,
48-
}),
55+
},
4956
language_mapper: Some(AssetPathToLanguageMapper {
5057
map: lua_language_mapper,
5158
}),

crates/languages/bevy_mod_scripting_lua/tests/lua_tests.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use bevy_mod_scripting_core::{
22
bindings::{pretty_print::DisplayWithWorld, ThreadWorldContainer, WorldContainer},
33
error::ScriptError,
4-
AddContextInitializer,
4+
ConfigureScriptPlugin,
55
};
66
use bevy_mod_scripting_lua::LuaScriptingPlugin;
77
use libtest_mimic::{Arguments, Failed, Trial};
@@ -26,8 +26,7 @@ impl Test {
2626
let _ = type_registry;
2727
},
2828
|app| {
29-
app.add_plugins(LuaScriptingPlugin::default());
30-
app.add_context_initializer::<LuaScriptingPlugin>(|_,ctxt: &mut Lua| {
29+
app.add_plugins(LuaScriptingPlugin::default().add_context_initializer(|_,ctxt: &mut Lua| {
3130
let globals = ctxt.globals();
3231
globals.set(
3332
"assert_throws",
@@ -60,7 +59,7 @@ impl Test {
6059
})?,
6160
)?;
6261
Ok(())
63-
});
62+
}));
6463
},
6564
self.path.as_os_str().to_str().unwrap(),
6665
self.code.as_bytes(),

crates/script_integration_test_harness/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub fn execute_integration_test<
6666
});
6767

6868
// load the context as normal
69-
let mut loaded_context = (context_settings.loader.unwrap().load)(
69+
let mut loaded_context = (context_settings.loader.load)(
7070
&(script_id.to_owned()).into(),
7171
code,
7272
&context_settings.context_initializers,

docs/src/Summary/customizing-script-contexts.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ For example, let's say you want to set a dynamic amount of globals in your scrip
1111

1212
You could do this by customizing the scripting plugin:
1313
```rust,ignore
14-
let plugin = LuaScriptingPlugin::default();
15-
plugin.add_context_initializer(|script_id: &str, context: &mut Lua| {
14+
let plugin = LuaScriptingPlugin::default().add_context_initializer(|script_id: &str, context: &mut Lua| {
1615
let globals = context.globals();
1716
for i in 0..10 {
1817
globals.set(i, i);
@@ -29,8 +28,7 @@ The above will run every time the script is loaded or re-loaded.
2928

3029
If you want to customize your context before every time it's about to handle events, you can use `Context Pre Handling Initializers`:
3130
```rust,ignore
32-
let plugin = LuaScriptingPlugin::default();
33-
plugin.add_context_pre_handling_initializer(|script_id: &str, entity: Entity, context: &mut Lua| {
31+
let plugin = LuaScriptingPlugin::default().add_context_pre_handling_initializer(|script_id: &str, entity: Entity, context: &mut Lua| {
3432
let globals = context.globals();
3533
globals.set("script_name", script_id.to_owned());
3634
Ok(())
@@ -40,8 +38,7 @@ plugin.add_context_pre_handling_initializer(|script_id: &str, entity: Entity, co
4038

4139
Some scripting languages, have the concept of a `runtime`. This is a global object which is shared between all contexts. You can customize this object using `Runtime Initializers`:
4240
```rust,ignore
43-
let plugin = SomeScriptingPlugin::default();
44-
plugin.add_runtime_initializer(|runtime: &mut Runtime| {
41+
let plugin = SomeScriptingPlugin::default().add_runtime_initializer(|runtime: &mut Runtime| {
4542
runtime.set_max_stack_size(1000);
4643
Ok(())
4744
});

examples/game_of_life.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use bevy_mod_scripting_core::{
1818
bindings::{function::namespace::NamespaceBuilder, script_value::ScriptValue},
1919
callback_labels,
2020
event::ScriptCallbackEvent,
21+
handler::event_handler,
2122
script::ScriptComponent,
22-
systems::event_handler,
2323
};
2424
use bevy_mod_scripting_lua::LuaScriptingPlugin;
2525
// use bevy_mod_scripting_rhai::RhaiScriptingPlugin;

0 commit comments

Comments
 (0)