use rbx_dom_weak::types::Ref; #[derive(Debug)] pub enum Error{ Runner(mlua::Error), NoScript, NoSource, } impl Error{ pub fn print(self){ match self{ Self::Runner(mlua::Error::RuntimeError(s))=>{ println!("lua error: {s}"); }, other=>println!("{:?}",other), } } } fn get_full_name(dom:&rbx_dom_weak::WeakDom,instance:&rbx_dom_weak::Instance)->String{ let mut full_name=instance.name.clone(); let mut pref=instance.parent(); while let Some(parent)=dom.get_by_ref(pref){ full_name.insert(0,'.'); full_name.insert_str(0,parent.name.as_str()); pref=parent.parent(); } full_name } pub struct Script{ script:Ref, } impl Script{ pub const fn new(script:Ref)->Self{ Self{script} } pub fn run(&self,context:&mut crate::context::Context)->Result<(),Error>{ // grab source let (source,full_name)={ let instance=context.dom.get_by_ref(self.script).ok_or(Error::NoScript)?; let source=match instance.properties.get("Source").ok_or(Error::NoSource)?{ rbx_dom_weak::types::Variant::String(s)=>s.clone(), _=>Err(Error::NoSource)?, }; (source,get_full_name(&context.dom,instance)) }; // run it lole let runner=crate::runner::Runner::new().map_err(Error::Runner)?; runner.set_script(self.script,full_name).map_err(Error::Runner)?; runner.run(source,context).map_err(Error::Runner) } }