From 534b45d7ddb2687ad5fd66758cc7dd7d5cb3629e Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Wed, 23 Apr 2025 01:31:45 -0700 Subject: [PATCH] roblox_emulator: EnumItems:GetEnumItems & Enum.Name --- lib/roblox_emulator/src/runner/enum.rs | 27 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/roblox_emulator/src/runner/enum.rs b/lib/roblox_emulator/src/runner/enum.rs index 0b6bd47..1cbaa94 100644 --- a/lib/roblox_emulator/src/runner/enum.rs +++ b/lib/roblox_emulator/src/runner/enum.rs @@ -1,7 +1,10 @@ use mlua::IntoLua; #[derive(Clone,Copy)] -pub struct Enum(u32); +pub struct Enum<'a>{ + name:&'a str, + value:u32, +} #[derive(Clone,Copy)] pub struct EnumItems; #[derive(Clone,Copy)] @@ -9,9 +12,9 @@ pub struct EnumItem<'a>{ ed:&'a rbx_reflection::EnumDescriptor<'a>, } -impl Into<rbx_types::Enum> for Enum{ - fn into(self)->rbx_types::Enum{ - rbx_types::Enum::from_u32(self.0) +impl From<Enum<'_>> for rbx_types::Enum{ + fn from(e:Enum)->rbx_types::Enum{ + rbx_types::Enum::from_u32(e.value) } } @@ -29,9 +32,11 @@ impl mlua::UserData for EnumItem<'_>{ fn add_fields<F:mlua::UserDataFields<Self>>(_fields:&mut F){ } fn add_methods<M:mlua::UserDataMethods<Self>>(methods:&mut M){ - methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItem<'_>,mlua::String)|{ - match this.ed.items.get(&*val.to_str()?){ - Some(&id)=>Enum(id).into_lua(lua), + methods.add_meta_function("GetEnumItems",|_,this:EnumItem|Ok(this.ed.items.iter().map(|(name,&value)|Enum{name,value}).collect::<Vec<_>>())); + methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItem,mlua::String)|{ + let index=&*val.to_str()?; + match this.ed.items.get_key_value(index){ + Some((name,&value))=>Enum{name,value}.into_lua(lua), None=>mlua::Value::Nil.into_lua(lua), } }); @@ -54,10 +59,12 @@ impl mlua::UserData for EnumItems{ } type_from_lua_userdata!(EnumItems); -impl mlua::UserData for Enum{ - fn add_fields<F:mlua::UserDataFields<Self>>(_fields:&mut F){ +impl mlua::UserData for Enum<'_>{ + fn add_fields<F:mlua::UserDataFields<Self>>(fields:&mut F){ + fields.add_field_method_get("Name",|_,this|Ok(this.name)); + fields.add_field_method_get("Value",|_,this|Ok(this.value)); } fn add_methods<M:mlua::UserDataMethods<Self>>(_methods:&mut M){ } } -type_from_lua_userdata!(Enum); +type_from_lua_userdata_lua_lifetime!(Enum);