roblox_emulator: implement __index Enum
This commit is contained in:
parent
d07571519e
commit
5b5f356863
lib/roblox_emulator/src/runner
@ -2,9 +2,28 @@ use mlua::IntoLua;
|
|||||||
|
|
||||||
#[derive(Clone,Copy)]
|
#[derive(Clone,Copy)]
|
||||||
pub struct EnumItem<'a>{
|
pub struct EnumItem<'a>{
|
||||||
name:&'a str,
|
name:Option<&'a str>,
|
||||||
value:u32,
|
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)]
|
#[derive(Clone,Copy)]
|
||||||
pub struct Enums;
|
pub struct Enums;
|
||||||
#[derive(Clone,Copy)]
|
#[derive(Clone,Copy)]
|
||||||
@ -12,11 +31,6 @@ pub struct EnumItems<'a>{
|
|||||||
ed:&'a rbx_reflection::EnumDescriptor<'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>{
|
pub fn set_globals(_lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
|
||||||
globals.set("Enum",Enums)
|
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_fields<F:mlua::UserDataFields<Self>>(_fields:&mut F){
|
||||||
}
|
}
|
||||||
fn add_methods<M:mlua::UserDataMethods<Self>>(methods:&mut M){
|
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("GetEnumItems",|_,this:EnumItems|Ok(this.ed.items.iter().map(EnumItem::known_name).collect::<Vec<_>>()));
|
||||||
methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItems,mlua::String)|{
|
methods.add_meta_function(mlua::MetaMethod::Index,|_,(this,val):(EnumItems,mlua::String)|{
|
||||||
let index=&*val.to_str()?;
|
let index=&*val.to_str()?;
|
||||||
match this.ed.items.get_key_value(index){
|
Ok(this.ed.items.get_key_value(index).map(EnumItem::known_name))
|
||||||
Some((name,&value))=>EnumItem{name,value}.into_lua(lua),
|
|
||||||
None=>mlua::Value::Nil.into_lua(lua),
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,9 +310,10 @@ impl mlua::UserData for Instance{
|
|||||||
Some(rbx_types::Variant::Float64(val))=>return val.into_lua(lua),
|
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::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::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::Enum(e))=>return crate::runner::r#enum::EnumItem::from(e).into_lua(lua),
|
||||||
Some(rbx_types::Variant::CFrame(cf))=>return Into::<crate::runner::cframe::CFrame>::into(cf).into_lua(lua),
|
Some(rbx_types::Variant::Color3(c))=>return crate::runner::color3::Color3::from(c).into_lua(lua),
|
||||||
Some(rbx_types::Variant::Vector3(v))=>return Into::<crate::runner::vector3::Vector3>::into(v).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=>(),
|
None=>(),
|
||||||
other=>return Err(mlua::Error::runtime(format!("Instance.__index Unsupported property type instance={} index={index_str} value={other:?}",instance.name))),
|
other=>return Err(mlua::Error::runtime(format!("Instance.__index Unsupported property type instance={} index={index_str} value={other:?}",instance.name))),
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user