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);