use std::any::Any;
use bevy_ecs::world::WorldId;
use bevy_mod_scripting_bindings::{
InteropError, ThreadScriptContext, ThreadWorldContainer, WorldGuard,
};
use bevy_mod_scripting_script::ScriptAttachment;
use crate::IntoScriptPluginParams;
pub trait Context: 'static + Send + Any {}
impl<T: 'static + Send + Any> Context for T {}
pub type ContextInitializer<P> =
fn(&ScriptAttachment, &mut <P as IntoScriptPluginParams>::C) -> Result<(), InteropError>;
pub type ContextPreHandlingInitializer<P> =
fn(&ScriptAttachment, &mut <P as IntoScriptPluginParams>::C) -> Result<(), InteropError>;
pub type ContextLoadFn<P> = fn(
attachment: &ScriptAttachment,
content: &[u8],
world_id: WorldId,
) -> Result<<P as IntoScriptPluginParams>::C, InteropError>;
pub type ContextReloadFn<P> = fn(
attachment: &ScriptAttachment,
content: &[u8],
previous_context: &mut <P as IntoScriptPluginParams>::C,
world_id: WorldId,
) -> Result<(), InteropError>;
pub trait ScriptingLoader<P: IntoScriptPluginParams> {
fn load(
attachment: &ScriptAttachment,
content: &[u8],
world: WorldGuard,
) -> Result<P::C, InteropError>;
fn reload(
attachment: &ScriptAttachment,
content: &[u8],
previous_context: &mut P::C,
world: WorldGuard,
) -> Result<(), InteropError>;
}
impl<P: IntoScriptPluginParams> ScriptingLoader<P> for P {
fn load(
attachment: &ScriptAttachment,
content: &[u8],
world: WorldGuard,
) -> Result<P::C, InteropError> {
WorldGuard::with_existing_static_guard(world.clone(), |world| {
let world_id = world.id();
ThreadWorldContainer.set_context(ThreadScriptContext {
world,
attachment: attachment.clone(),
})?;
Self::context_loader()(attachment, content, world_id)
})
}
fn reload(
attachment: &ScriptAttachment,
content: &[u8],
previous_context: &mut P::C,
world: WorldGuard,
) -> Result<(), InteropError> {
WorldGuard::with_existing_static_guard(world, |world| {
let world_id = world.id();
ThreadWorldContainer.set_context(ThreadScriptContext {
world,
attachment: attachment.clone(),
})?;
Self::context_reloader()(attachment, content, previous_context, world_id)
})
}
}