mirror of
https://github.com/lune-org/lune.git
synced 2024-12-13 13:30:38 +00:00
Implement mechanism for implementing roblox methods only on certain classes
This commit is contained in:
parent
9f13b8e667
commit
b0d401421e
4 changed files with 82 additions and 2 deletions
20
packages/lib-roblox/src/instance/data_model.rs
Normal file
20
packages/lib-roblox/src/instance/data_model.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
use mlua::prelude::*;
|
||||||
|
|
||||||
|
use crate::shared::classes::add_class_restricted_method;
|
||||||
|
|
||||||
|
use super::Instance;
|
||||||
|
|
||||||
|
pub fn add_methods<'lua, M: LuaUserDataMethods<'lua, Instance>>(methods: &mut M) {
|
||||||
|
add_class_restricted_method(
|
||||||
|
methods,
|
||||||
|
"DataModel",
|
||||||
|
"GetService",
|
||||||
|
|_, _, _service_name: String| Ok(()),
|
||||||
|
);
|
||||||
|
add_class_restricted_method(
|
||||||
|
methods,
|
||||||
|
"DataModel",
|
||||||
|
"FindService",
|
||||||
|
|_, _, _service_name: String| Ok(()),
|
||||||
|
);
|
||||||
|
}
|
|
@ -15,6 +15,8 @@ use crate::{
|
||||||
shared::instance::{class_exists, class_is_a, find_property_info},
|
shared::instance::{class_exists, class_is_a, find_property_info},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mod data_model;
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
static ref INTERNAL_DOM: RwLock<WeakDom> =
|
static ref INTERNAL_DOM: RwLock<WeakDom> =
|
||||||
RwLock::new(WeakDom::new(DomInstanceBuilder::new("ROOT")));
|
RwLock::new(WeakDom::new(DomInstanceBuilder::new("ROOT")));
|
||||||
|
@ -865,8 +867,9 @@ impl LuaUserData for Instance {
|
||||||
.find_ancestor(|ancestor| ancestor.referent() == instance.dom_ref)
|
.find_ancestor(|ancestor| ancestor.referent() == instance.dom_ref)
|
||||||
.is_some())
|
.is_some())
|
||||||
});
|
});
|
||||||
// FUTURE: We could pass the "methods" struct to some other functions
|
// Here we add inheritance-like behavior for instances by creating
|
||||||
// here to add inheritance-like behavior and class-specific methods
|
// methods that are restricted to specific classnames / base classes
|
||||||
|
data_model::add_methods(methods);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
56
packages/lib-roblox/src/shared/classes.rs
Normal file
56
packages/lib-roblox/src/shared/classes.rs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
use mlua::prelude::*;
|
||||||
|
|
||||||
|
use crate::instance::Instance;
|
||||||
|
|
||||||
|
use super::instance::class_is_a;
|
||||||
|
|
||||||
|
pub(crate) fn add_class_restricted_method<'lua, M: LuaUserDataMethods<'lua, Instance>, A, R, F>(
|
||||||
|
methods: &mut M,
|
||||||
|
class_name: &'static str,
|
||||||
|
method_name: &'static str,
|
||||||
|
method: F,
|
||||||
|
) where
|
||||||
|
A: FromLuaMulti<'lua>,
|
||||||
|
R: ToLuaMulti<'lua>,
|
||||||
|
F: 'static + Fn(&'lua Lua, &Instance, A) -> LuaResult<R>,
|
||||||
|
{
|
||||||
|
methods.add_method(method_name, move |lua, this, args| {
|
||||||
|
if class_is_a(this.get_class_name(), class_name).unwrap_or(false) {
|
||||||
|
method(lua, this, args)
|
||||||
|
} else {
|
||||||
|
Err(LuaError::RuntimeError(format!(
|
||||||
|
"{} is not a valid member of {}",
|
||||||
|
method_name, class_name
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub(crate) fn add_class_restricted_method_mut<
|
||||||
|
'lua,
|
||||||
|
M: LuaUserDataMethods<'lua, Instance>,
|
||||||
|
A,
|
||||||
|
R,
|
||||||
|
F,
|
||||||
|
>(
|
||||||
|
methods: &mut M,
|
||||||
|
class_name: &'static str,
|
||||||
|
method_name: &'static str,
|
||||||
|
method: F,
|
||||||
|
) where
|
||||||
|
A: FromLuaMulti<'lua>,
|
||||||
|
R: ToLuaMulti<'lua>,
|
||||||
|
F: 'static + Fn(&'lua Lua, &mut Instance, A) -> LuaResult<R>,
|
||||||
|
{
|
||||||
|
methods.add_method_mut(method_name, move |lua, this, args| {
|
||||||
|
if class_is_a(this.get_class_name(), class_name).unwrap_or(false) {
|
||||||
|
method(lua, this, args)
|
||||||
|
} else {
|
||||||
|
Err(LuaError::RuntimeError(format!(
|
||||||
|
"{} is not a valid member of {}",
|
||||||
|
method_name, class_name
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
|
@ -1,2 +1,3 @@
|
||||||
|
pub(crate) mod classes;
|
||||||
pub(crate) mod instance;
|
pub(crate) mod instance;
|
||||||
pub(crate) mod userdata;
|
pub(crate) mod userdata;
|
||||||
|
|
Loading…
Reference in a new issue