95 lines
1.9 KiB
Rust
Raw Normal View History

2024-09-18 18:47:38 -07:00
use crate::context::Context;
2024-09-17 17:17:12 -07:00
use super::vector3::Vector3;
use super::cframe::CFrame;
2024-09-17 17:16:57 -07:00
pub struct Runner{
lua:mlua::Lua,
2024-09-16 18:54:04 -07:00
}
2024-09-18 18:47:38 -07:00
#[derive(Debug)]
pub enum Error{
Lua(mlua::Error),
Script(crate::script::Error),
/// If the lua.remove_app_data function fails
RemoveAppData,
}
impl Error{
pub fn print(self){
match self{
Self::Lua(mlua::Error::RuntimeError(s))=>{
println!("lua error: {s}");
},
other=>println!("{:?}",other),
}
}
}
2024-09-16 18:54:04 -07:00
2024-09-17 17:16:57 -07:00
fn init(lua:&mlua::Lua)->mlua::Result<()>{
2024-09-17 17:17:12 -07:00
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)?;
}
2024-09-16 19:01:16 -07:00
Ok(())
2024-09-16 18:54:04 -07:00
}
2024-09-17 17:16:57 -07:00
impl Runner{
pub fn new()->mlua::Result<Self>{
let runner=Self{
lua:mlua::Lua::new(),
};
init(&runner.lua)?;
Ok(runner)
}
2024-09-18 18:47:38 -07:00
pub fn run_script(&self,script:crate::script::Script,context:Context)->(Context,Result<(),Error>){
let yoink=script.name_source(&context);
self.lua.set_app_data(context.dom);
let r=(||{
let (name,source)=yoink.map_err(Error::Script)?;
self.lua.globals().set("script",super::instance::Instance::from(script)).map_err(Error::Lua)?;
self.lua.load(source)
.set_name(name)
.exec().map_err(Error::Lua)?;
Ok(())
})();
let dom=self.lua.remove_app_data()
.expect("Fatal: Lua lost the dom");
(Context::new(dom),r)
2024-09-17 17:16:57 -07:00
}
}