diff --git a/lib/roblox_emulator/src/runner/enum.rs b/lib/roblox_emulator/src/runner/enum.rs index 889bf8d..43242aa 100644 --- a/lib/roblox_emulator/src/runner/enum.rs +++ b/lib/roblox_emulator/src/runner/enum.rs @@ -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)) }); } } diff --git a/lib/roblox_emulator/src/runner/instance/instance.rs b/lib/roblox_emulator/src/runner/instance/instance.rs index 58a4a92..5e4d836 100644 --- a/lib/roblox_emulator/src/runner/instance/instance.rs +++ b/lib/roblox_emulator/src/runner/instance/instance.rs @@ -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))), }