lyra-engine/lyra-scripting/src/lib.rs

98 lines
2.3 KiB
Rust
Raw Normal View History

2024-01-05 01:52:47 +00:00
#[cfg(feature = "lua")]
pub mod lua;
pub mod world;
use lyra_ecs::Component;
2024-01-05 01:52:47 +00:00
pub use world::*;
pub mod wrap;
pub use wrap::*;
pub mod host;
pub use host::*;
pub mod script;
pub use script::*;
use lyra_game::game::Game;
2024-01-05 01:52:47 +00:00
#[allow(unused_imports)]
pub(crate) mod lyra_engine {
pub use lyra_ecs as ecs;
pub use lyra_reflect as reflect;
2024-01-05 01:52:47 +00:00
}
use lyra_reflect::{ReflectedComponent, Reflect, FromType};
2024-01-05 01:52:47 +00:00
#[derive(Clone)]
pub enum ReflectBranch {
Component(ReflectedComponent),
}
impl ReflectBranch {
/// Gets self as a [`ReflectedComponent`].
///
/// # Panics
/// If `self` is not a variant of [`ReflectBranch::Component`].
pub fn as_component_unchecked(&self) -> &ReflectedComponent {
match self {
ReflectBranch::Component(c) => c,
2024-01-06 20:52:12 +00:00
//_ => panic!("`self` is not an instance of `ReflectBranch::Component`")
2024-01-05 01:52:47 +00:00
}
}
pub fn is_component(&self) -> bool {
matches!(self, ReflectBranch::Component(_))
}
}
pub struct ScriptBorrow {
reflect_branch: ReflectBranch,
data: Option<Box<dyn Reflect>>,
}
impl Clone for ScriptBorrow {
fn clone(&self) -> Self {
let data = self.data.as_ref().map(|b| b.clone_inner());
Self {
reflect_branch: self.reflect_branch.clone(),
data,
}
}
}
impl ScriptBorrow {
pub fn from_component<T>(data: Option<T>) -> Self
where
T: Reflect + Component + Default + 'static
{
let data = data.map(|d| Box::new(d) as Box<(dyn Reflect + 'static)>);
Self {
reflect_branch: ReflectBranch::Component(<ReflectedComponent as FromType<T>>::from_type()),
data,
}
}
}
/// An extension trait that adds some helpful methods that makes it easier to do scripting things
pub trait GameScriptExt {
fn add_script_api_provider<T, P>(&mut self, provider: P)
where
T: ScriptHost,
P: ScriptApiProvider<ScriptContext = T::ScriptContext> + 'static;
}
impl GameScriptExt for Game {
fn add_script_api_provider<T, P>(&mut self, mut provider: P)
where
T: ScriptHost,
P: ScriptApiProvider<ScriptContext = T::ScriptContext> + 'static
{
let world = self.world();
provider.prepare_world(world);
let mut providers = world.get_resource_mut::<ScriptApiProviders<T>>();
providers.add_provider(provider);
}
2024-01-05 01:52:47 +00:00
}