use rbx_dom_weak::{types::Ref,WeakDom}; pub fn class_is_a(class:&str,superclass:&str)->bool{ class==superclass ||rbx_reflection_database::get().classes.get(class) .is_some_and(|descriptor| descriptor.superclass.as_ref().is_some_and(|class_super| class_is_a(class_super,superclass) ) ) } #[repr(transparent)] pub struct Context{ pub(crate)dom:WeakDom, } impl Context{ pub const fn new(dom:WeakDom)->Self{ Self{dom} } pub fn script_singleton(source:String)->(Context,crate::runner::instance::Script){ let dom=WeakDom::new( rbx_dom_weak::InstanceBuilder::new("Script") .with_property("Source",rbx_types::Variant::String(source)) ); let script=crate::runner::instance::Script::new(dom.root_ref()); (Context{dom},script) } pub fn from_mut(dom:&mut WeakDom)->&mut Context{ unsafe{&mut *(dom as *mut WeakDom as *mut Context)} } /// Creates an iterator over all items of a particular class. pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator+'a{ self.dom.descendants().filter(|&instance| class_is_a(instance.class.as_ref(),superclass) ).map(|instance|instance.referent()) } pub fn scripts(&self)->Vec{ self.superclass_iter("LuaSourceContainer").map(crate::runner::instance::Script::new).collect() } }