strafe-client/src/script.rs

54 lines
1.3 KiB
Rust
Raw Normal View History

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
}
}