roblox_emulator: implement __index Enum

This commit is contained in:
Quaternions 2025-04-23 01:51:09 -07:00
parent d07571519e
commit 5b5f356863
Signed by: Quaternions
GPG Key ID: D0DF5964F79AC131
2 changed files with 27 additions and 15 deletions
lib/roblox_emulator/src/runner

@ -2,9 +2,28 @@ use mlua::IntoLua;
#[derive(Clone,Copy)]
pub struct EnumItem<'a>{
name:&'a str,
name:Option<&'a str>,
value:u32,
}
impl<'a> EnumItem<'a>{
fn known_name((name,&value):(&'a std::borrow::Cow<'a,str>,&u32))->Self{
Self{name:Some(name.as_ref()),value}
}
}
impl<'a> From<rbx_types::Enum> for EnumItem<'a>{
fn from(e:rbx_types::Enum)->Self{
EnumItem{
name:None,
value:e.to_u32(),
}
}
}
impl From<EnumItem<'_>> for rbx_types::Enum{
fn from(e:EnumItem)->rbx_types::Enum{
rbx_types::Enum::from_u32(e.value)
}
}
#[derive(Clone,Copy)]
pub struct Enums;
#[derive(Clone,Copy)]
@ -12,11 +31,6 @@ pub struct EnumItems<'a>{
ed:&'a rbx_reflection::EnumDescriptor<'a>,
}
impl From<EnumItem<'_>> for rbx_types::Enum{
fn from(e:EnumItem)->rbx_types::Enum{
rbx_types::Enum::from_u32(e.value)
}
}
pub fn set_globals(_lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
globals.set("Enum",Enums)
@ -26,13 +40,10 @@ impl mlua::UserData for EnumItems<'_>{
fn add_fields<F:mlua::UserDataFields<Self>>(_fields:&mut F){
}
fn add_methods<M:mlua::UserDataMethods<Self>>(methods:&mut M){
methods.add_meta_function("GetEnumItems",|_,this:EnumItems|Ok(this.ed.items.iter().map(|(name,&value)|EnumItem{name,value}).collect::<Vec<_>>()));
methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItems,mlua::String)|{
methods.add_meta_function("GetEnumItems",|_,this:EnumItems|Ok(this.ed.items.iter().map(EnumItem::known_name).collect::<Vec<_>>()));
methods.add_meta_function(mlua::MetaMethod::Index,|_,(this,val):(EnumItems,mlua::String)|{
let index=&*val.to_str()?;
match this.ed.items.get_key_value(index){
Some((name,&value))=>EnumItem{name,value}.into_lua(lua),
None=>mlua::Value::Nil.into_lua(lua),
}
Ok(this.ed.items.get_key_value(index).map(EnumItem::known_name))
});
}
}

@ -310,9 +310,10 @@ impl mlua::UserData for Instance{
Some(rbx_types::Variant::Float64(val))=>return val.into_lua(lua),
Some(rbx_types::Variant::String(val))=>return val.into_lua(lua),
Some(rbx_types::Variant::Ref(val))=>return Instance::new_unchecked(val).into_lua(lua),
Some(rbx_types::Variant::Color3(c))=>return Into::<crate::runner::color3::Color3>::into(c).into_lua(lua),
Some(rbx_types::Variant::CFrame(cf))=>return Into::<crate::runner::cframe::CFrame>::into(cf).into_lua(lua),
Some(rbx_types::Variant::Vector3(v))=>return Into::<crate::runner::vector3::Vector3>::into(v).into_lua(lua),
Some(rbx_types::Variant::Enum(e))=>return crate::runner::r#enum::EnumItem::from(e).into_lua(lua),
Some(rbx_types::Variant::Color3(c))=>return crate::runner::color3::Color3::from(c).into_lua(lua),
Some(rbx_types::Variant::CFrame(cf))=>return crate::runner::cframe::CFrame::from(cf).into_lua(lua),
Some(rbx_types::Variant::Vector3(v))=>return crate::runner::vector3::Vector3::from(v).into_lua(lua),
None=>(),
other=>return Err(mlua::Error::runtime(format!("Instance.__index Unsupported property type instance={} index={index_str} value={other:?}",instance.name))),
}