roblox_emulator/src/context.rs

50 lines
1.6 KiB
Rust
Raw Normal View History

2024-10-04 00:19:47 +00:00
use rbx_dom_weak::{types::Ref,InstanceBuilder,WeakDom};
2024-09-17 01:54:04 +00:00
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)
)
)
}
2024-09-20 20:51:17 +00:00
#[repr(transparent)]
2024-09-19 01:47:38 +00:00
pub struct Context{
pub(crate)dom:WeakDom,
2024-09-17 01:54:04 +00:00
}
2024-09-19 01:47:38 +00:00
impl Context{
2024-10-03 23:26:54 +00:00
pub const fn new(dom:WeakDom)->Self{
Self{dom}
2024-09-17 01:54:04 +00:00
}
2024-10-04 00:19:47 +00:00
pub fn script_singleton(source:String)->(Context,crate::runner::instance::Script,crate::place::Services){
let script=InstanceBuilder::new("Script")
.with_property("Source",rbx_types::Variant::String(source));
let script_ref=script.referent();
let (dom,services)=crate::place::new_place_with_instances_in_workspace(
WeakDom::new(
InstanceBuilder::new("DataModel")
.with_child(script)
)
);
2024-10-04 00:19:47 +00:00
(Context{dom},crate::runner::instance::Script::new(script_ref),services)
}
2024-10-04 23:32:49 +00:00
pub fn from_ref(dom:&WeakDom)->&Context{
unsafe{&*(dom as *const WeakDom as *const Context)}
}
2024-09-20 20:51:17 +00:00
pub fn from_mut(dom:&mut WeakDom)->&mut Context{
unsafe{&mut *(dom as *mut WeakDom as *mut Context)}
2024-09-19 01:47:38 +00:00
}
2024-09-17 01:54:04 +00:00
/// Creates an iterator over all items of a particular class.
pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator<Item=Ref>+'a{
self.dom.descendants().filter(|&instance|
class_is_a(instance.class.as_ref(),superclass)
).map(|instance|instance.referent())
}
pub fn scripts(&self)->Vec<crate::runner::instance::Script>{
self.superclass_iter("LuaSourceContainer").map(crate::runner::instance::Script::new).collect()
2024-09-17 01:54:04 +00:00
}
}