2024-09-17 01:54:04 +00:00
|
|
|
use rbx_dom_weak::types::Ref;
|
|
|
|
|
2024-09-18 01:00:17 +00:00
|
|
|
#[derive(Debug)]
|
2024-09-17 01:54:04 +00:00
|
|
|
pub enum Error{
|
2024-09-18 00:16:57 +00:00
|
|
|
Runner(mlua::Error),
|
2024-09-17 01:54:04 +00:00
|
|
|
NoScript,
|
|
|
|
NoSource,
|
|
|
|
}
|
2024-09-18 01:00:17 +00:00
|
|
|
impl Error{
|
|
|
|
pub fn print(self){
|
|
|
|
match self{
|
|
|
|
Self::Runner(mlua::Error::RuntimeError(s))=>{
|
2024-09-18 01:26:30 +00:00
|
|
|
println!("lua error: {s}");
|
2024-09-18 01:00:17 +00:00
|
|
|
},
|
|
|
|
other=>println!("{:?}",other),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-09-17 01:54:04 +00:00
|
|
|
|
2024-09-18 01:26:58 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2024-09-17 01:54:04 +00:00
|
|
|
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
|
2024-09-18 01:26:58 +00:00
|
|
|
let (source,full_name)={
|
2024-09-17 01:54:04 +00:00
|
|
|
let instance=context.dom.get_by_ref(self.script).ok_or(Error::NoScript)?;
|
2024-09-18 01:26:58 +00:00
|
|
|
let source=match instance.properties.get("Source").ok_or(Error::NoSource)?{
|
2024-09-17 01:54:04 +00:00
|
|
|
rbx_dom_weak::types::Variant::String(s)=>s.clone(),
|
|
|
|
_=>Err(Error::NoSource)?,
|
2024-09-18 01:26:58 +00:00
|
|
|
};
|
|
|
|
(source,get_full_name(&context.dom,instance))
|
2024-09-17 01:54:04 +00:00
|
|
|
};
|
|
|
|
// run it lole
|
2024-09-18 00:16:57 +00:00
|
|
|
let runner=crate::runner::Runner::new().map_err(Error::Runner)?;
|
2024-09-18 01:26:58 +00:00
|
|
|
runner.set_script(self.script,full_name).map_err(Error::Runner)?;
|
2024-09-18 00:16:57 +00:00
|
|
|
runner.run(source,context).map_err(Error::Runner)
|
2024-09-17 01:54:04 +00:00
|
|
|
}
|
|
|
|
}
|