use super::vector3::Vector3; use super::cframe::CFrame; pub struct Runner{ lua:mlua::Lua, } fn init(lua:&mlua::Lua)->mlua::Result<()>{ lua.sandbox(true)?; //global environment let globals=lua.globals(); //Vector3 { let vector3_table=lua.create_table()?; //Vector3.new vector3_table.raw_set("new", lua.create_function(|ctx,(x,y,z):(f32,f32,f32)| Ok(ctx.create_userdata(Vector3::new(x,y,z))) )? )?; globals.set("Vector3",vector3_table)?; } //CFrame { let cframe_table=lua.create_table()?; //CFrame.new cframe_table.raw_set("new", lua.create_function(|ctx,(x,y,z):(f32,f32,f32)| Ok(ctx.create_userdata(CFrame::new(x,y,z))) )? )?; //CFrame.Angles cframe_table.raw_set("Angles", lua.create_function(|ctx,(x,y,z):(f32,f32,f32)| Ok(ctx.create_userdata(CFrame::angles(x,y,z))) )? )?; globals.set("CFrame",cframe_table)?; } Ok(()) } impl Runner{ pub fn new()->mlua::Result{ let runner=Self{ lua:mlua::Lua::new(), }; init(&runner.lua)?; Ok(runner) } pub fn set_script(&self,script:rbx_dom_weak::types::Ref,name:String)->mlua::Result<()>{ //TODO: Instance type let script_table=self.lua.create_table()?; //script.Name script_table.raw_set("Name",name)?; self.lua.globals().set("script",script_table)?; Ok(()) } pub fn run(&self,source:String,context:&mut crate::context::Context)->mlua::Result<()>{ //Set up dom access here? let script:mlua::Table<'_>=self.lua.globals().raw_get("script")?; let name:String=script.raw_get("Name")?; self.lua.load(source) .set_name(name) .exec() } }