roblox_emulator: EnumItems:GetEnumItems & Enum.Name

This commit is contained in:
Quaternions 2025-04-23 01:31:45 -07:00
parent 3ff8ccf58d
commit 534b45d7dd
Signed by: Quaternions
GPG Key ID: D0DF5964F79AC131

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