bevy_script_api 0.8.0

Bevy API for multiple script languages, part of bevy_mod_scripting.
Documentation
use crate::lua::RegisterForeignLuaType;

pub struct LuaCoreBevyAPIProvider;

#[derive(Default)]
pub(crate) struct CoreBevyGlobals;

crate::impl_tealr_generic!(pub(crate) struct T);

impl bevy_mod_scripting_lua::tealr::mlu::ExportInstances for CoreBevyGlobals {
    fn add_instances<'lua, T: bevy_mod_scripting_lua::tealr::mlu::InstanceCollector<'lua>>(
        self,
        instances: &mut T,
    ) -> bevy_mod_scripting_lua::tealr::mlu::mlua::Result<()> {
        instances.add_instance(
            "world",
            crate::lua::util::DummyTypeName::<crate::lua::bevy::LuaWorld>::new,
        )?;
        instances.add_instance(
            "script",
            crate::lua::util::DummyTypeName::<crate::lua::bevy::LuaScriptData>::new,
        )?;
        instances.add_instance(
            "entity",
            crate::lua::util::DummyTypeName::<crate::providers::bevy_ecs::LuaEntity>::new,
        )?;
        Ok(())
    }
}

impl bevy_mod_scripting_core::hosts::APIProvider for LuaCoreBevyAPIProvider {
    type APITarget = std::sync::Mutex<bevy_mod_scripting_lua::tealr::mlu::mlua::Lua>;
    type ScriptContext = std::sync::Mutex<bevy_mod_scripting_lua::tealr::mlu::mlua::Lua>;
    type DocTarget = bevy_mod_scripting_lua::docs::LuaDocFragment;

    fn attach_api(
        &mut self,
        ctx: &mut Self::APITarget,
    ) -> Result<(), bevy_mod_scripting_core::error::ScriptError> {
        let ctx = ctx
            .get_mut()
            .expect("Unable to acquire lock on Lua context");
        bevy_mod_scripting_lua::tealr::mlu::set_global_env(CoreBevyGlobals, ctx)
            .map_err(|e| bevy_mod_scripting_core::error::ScriptError::Other(e.to_string()))
    }

    fn get_doc_fragment(&self) -> Option<Self::DocTarget> {
        Some(bevy_mod_scripting_lua::docs::LuaDocFragment::new(
            "CoreBevyAPI",
            |tw| {
                tw
			.document_global_instance::<CoreBevyGlobals>().expect("Something went wrong documenting globals")            
            .process_type::<crate::lua::bevy::LuaWorld>()
			.process_type::<bevy_mod_scripting_lua::tealr::mlu::UserDataProxy<crate::lua::bevy::LuaWorld>>()
			.process_type::<crate::lua::bevy::LuaScriptData>()
			.process_type::<bevy_mod_scripting_lua::tealr::mlu::UserDataProxy<crate::lua::bevy::LuaScriptData>>()
			.process_type::<crate::lua::bevy::LuaTypeRegistration>()
			.process_type::<crate::lua::std::LuaVec<T>>()
            .process_type::<crate::lua::bevy::LuaQueryBuilder>()
            },
        ))
    }

    fn setup_script(
        &mut self,
        script_data: &bevy_mod_scripting_core::hosts::ScriptData,
        ctx: &mut Self::ScriptContext,
    ) -> Result<(), bevy_mod_scripting_core::error::ScriptError> {
        let ctx = ctx.get_mut().expect("Could not get context");
        let globals = ctx.globals();
        globals
            .set(
                "entity",
                crate::providers::bevy_ecs::LuaEntity::new(script_data.entity),
            )
            .map_err(bevy_mod_scripting_core::error::ScriptError::new_other)?;
        globals
            .set::<_, crate::lua::bevy::LuaScriptData>("script", script_data.into())
            .map_err(bevy_mod_scripting_core::error::ScriptError::new_other)?;

        Ok(())
    }

    fn setup_script_runtime(
        &mut self,
        world_ptr: bevy_mod_scripting_core::world::WorldPointer,
        _script_data: &bevy_mod_scripting_core::hosts::ScriptData,
        ctx: &mut Self::ScriptContext,
    ) -> Result<(), bevy_mod_scripting_core::error::ScriptError> {
        let ctx = ctx.get_mut().expect("Could not get context");
        let globals = ctx.globals();
        globals
            .set("world", crate::lua::bevy::LuaWorld::new(world_ptr))
            .map_err(bevy_mod_scripting_core::error::ScriptError::new_other)
    }

    fn register_with_app(&self, app: &mut bevy::app::App) {
        app.register_foreign_lua_type::<usize>();
        app.register_foreign_lua_type::<isize>();
        app.register_foreign_lua_type::<f32>();
        app.register_foreign_lua_type::<f64>();
        app.register_foreign_lua_type::<u128>();
        app.register_foreign_lua_type::<u64>();
        app.register_foreign_lua_type::<u32>();
        app.register_foreign_lua_type::<u16>();
        app.register_foreign_lua_type::<u8>();
        app.register_foreign_lua_type::<i128>();
        app.register_foreign_lua_type::<i64>();
        app.register_foreign_lua_type::<i32>();
        app.register_foreign_lua_type::<i16>();
        app.register_foreign_lua_type::<i8>();
        app.register_foreign_lua_type::<String>();
        app.register_foreign_lua_type::<bool>();
    }
}