use mlua::IntoLua; #[derive(Clone,Copy)] pub struct Enum(u32); pub struct EnumItems; pub struct EnumItem<'a>{ ed:&'a rbx_reflection::EnumDescriptor<'a>, } impl Into for Enum{ fn into(self)->rbx_types::Enum{ rbx_types::Enum::from_u32(self.0) } } impl<'a> EnumItem<'a>{ const fn new(ed:&'a rbx_reflection::EnumDescriptor)->Self{ Self{ed} } } pub fn set_globals(_lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ globals.set("Enum",EnumItems) } impl mlua::UserData for EnumItem<'_>{ fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ } fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItem<'lua>,mlua::String)|{ match this.ed.items.get(val.to_str()?){ Some(&id)=>Enum(id).into_lua(lua), None=>mlua::Value::Nil.into_lua(lua), } }); } } type_from_lua_userdata_lua_lifetime!(EnumItem); impl mlua::UserData for EnumItems{ fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ } fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ methods.add_meta_function(mlua::MetaMethod::Index,|lua,(_,val):(Self,mlua::String)|{ let db=rbx_reflection_database::get(); match db.enums.get(val.to_str()?){ Some(ed)=>EnumItem::new(ed).into_lua(lua), None=>mlua::Value::Nil.into_lua(lua), } }); } } type_from_lua_userdata!(EnumItems); impl mlua::UserData for Enum{ fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ } fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(_methods:&mut M){ } } type_from_lua_userdata!(Enum);