Skip to content

Commit 7a35ce4

Browse files
committed
Implement Enum attributes
1 parent bb8c4bc commit 7a35ce4

File tree

6 files changed

+31
-6
lines changed

6 files changed

+31
-6
lines changed

crates/lune-roblox/src/datatypes/attributes.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub fn ensure_valid_attribute_value(value: &DomValue) -> LuaResult<()> {
4747
| DomType::CFrame
4848
| DomType::Color3
4949
| DomType::ColorSequence
50+
| DomType::EnumItem
5051
| DomType::Float32
5152
| DomType::Float64
5253
| DomType::Font

crates/lune-roblox/src/datatypes/conversion.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ impl<'lua> DomValueToLua<'lua> for LuaAnyUserData<'lua> {
200200
DomValue::Color3(value) => dom_to_userdata!(lua, value => Color3),
201201
DomValue::Color3uint8(value) => dom_to_userdata!(lua, value => Color3),
202202
DomValue::ColorSequence(value) => dom_to_userdata!(lua, value => ColorSequence),
203+
DomValue::EnumItem(value) => dom_to_userdata!(lua, value => EnumItem),
203204
DomValue::Faces(value) => dom_to_userdata!(lua, value => Faces),
204205
DomValue::Font(value) => dom_to_userdata!(lua, value => Font),
205206
DomValue::NumberRange(value) => dom_to_userdata!(lua, value => NumberRange),
@@ -256,7 +257,7 @@ impl<'lua> LuaToDomValue<'lua> for LuaAnyUserData<'lua> {
256257
DomType::Color3 => userdata_to_dom!(self as Color3 => dom::Color3),
257258
DomType::Color3uint8 => userdata_to_dom!(self as Color3 => dom::Color3uint8),
258259
DomType::ColorSequence => userdata_to_dom!(self as ColorSequence => dom::ColorSequence),
259-
DomType::Enum => userdata_to_dom!(self as EnumItem => dom::Enum),
260+
DomType::EnumItem => userdata_to_dom!(self as EnumItem => dom::EnumItem),
260261
DomType::Faces => userdata_to_dom!(self as Faces => dom::Faces),
261262
DomType::Font => userdata_to_dom!(self as Font => dom::Font),
262263
DomType::NumberRange => userdata_to_dom!(self as NumberRange => dom::NumberRange),
@@ -314,7 +315,8 @@ impl<'lua> LuaToDomValue<'lua> for LuaAnyUserData<'lua> {
314315
value if value.is::<CFrame>() => userdata_to_dom!(value as CFrame => dom::CFrame),
315316
value if value.is::<Color3>() => userdata_to_dom!(value as Color3 => dom::Color3),
316317
value if value.is::<ColorSequence>() => userdata_to_dom!(value as ColorSequence => dom::ColorSequence),
317-
value if value.is::<Enum>() => userdata_to_dom!(value as EnumItem => dom::Enum),
318+
value if value.is::<Enum>() => userdata_to_dom!(value as EnumItem => dom::EnumItem),
319+
value if value.is::<EnumItem>() => userdata_to_dom!(value as EnumItem => dom::EnumItem),
318320
value if value.is::<Faces>() => userdata_to_dom!(value as Faces => dom::Faces),
319321
value if value.is::<Font>() => userdata_to_dom!(value as Font => dom::Font),
320322
value if value.is::<Instance>() => userdata_to_dom!(value as Instance => dom::Ref),

crates/lune-roblox/src/datatypes/extension.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ impl DomValueExt for DomType {
2020
ColorSequence => "ColorSequence",
2121
Content => "Content",
2222
Enum => "Enum",
23+
EnumItem => "EnumItem",
2324
Faces => "Faces",
2425
Float32 => "Float32",
2526
Float64 => "Float64",

crates/lune-roblox/src/datatypes/types/enum_item.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::fmt;
22

33
use mlua::prelude::*;
4-
use rbx_dom_weak::types::Enum as DomEnum;
4+
use rbx_dom_weak::types::EnumItem as DomEnumItem;
55

66
use super::{super::*, Enum};
77

@@ -100,8 +100,19 @@ impl PartialEq for EnumItem {
100100
}
101101
}
102102

103-
impl From<EnumItem> for DomEnum {
103+
impl From<EnumItem> for DomEnumItem {
104104
fn from(v: EnumItem) -> Self {
105-
DomEnum::from_u32(v.value)
105+
DomEnumItem {
106+
ty: v.parent.desc.name.to_string(),
107+
value: v.value,
108+
}
109+
}
110+
}
111+
112+
impl From<DomEnumItem> for EnumItem {
113+
fn from(value: DomEnumItem) -> Self {
114+
println!("dom enum item: {value:?}");
115+
EnumItem::from_enum_name_and_value(value.ty, value.value)
116+
.expect("cannot convert rbx_type::EnumItem with unknown type into EnumItem")
106117
}
107118
}

crates/lune-roblox/src/instance/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ fn instance_property_set<'lua>(
331331
if let Some(enum_name) = info.enum_name {
332332
match LuaUserDataRef::<EnumItem>::from_lua(prop_value, lua) {
333333
Ok(given_enum) if given_enum.parent.desc.name == enum_name => {
334-
this.set_property(prop_name, DomValue::Enum((*given_enum).clone().into()));
334+
this.set_property(prop_name, DomValue::EnumItem((*given_enum).clone().into()));
335335
Ok(())
336336
}
337337
Ok(given_enum) => Err(LuaError::RuntimeError(format!(

tests/roblox/instance/attributes.luau

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ local UDim2 = roblox.UDim2
1616
local Vector2 = roblox.Vector2
1717
local Vector3 = roblox.Vector3
1818
local Instance = roblox.Instance
19+
local Enum = roblox.Enum
1920

2021
local modelFile = fs.readFile("tests/roblox/rbx-test-files/models/attributes/binary.rbxm")
2122
local model = roblox.deserializeModel(modelFile)[1]
@@ -114,3 +115,12 @@ model.Parent = game
114115
local placeFile = roblox.serializePlace(game)
115116
fs.writeDir("bin/roblox")
116117
fs.writeFile("bin/roblox/attributes.rbxl", placeFile)
118+
119+
local enum_attr = Instance.new("Folder")
120+
enum_attr:SetAttribute("Foo", Enum.NormalId.Front)
121+
assert(enum_attr:GetAttribute("Foo") == Enum.NormalId.Front)
122+
123+
local enum_attr_ser = roblox.serializeModel({ enum_attr })
124+
local enum_attr_de = roblox.deserializeModel(enum_attr_ser)
125+
126+
assert(enum_attr_de[1]:GetAttribute("Foo") == Enum.NormalId.Front)

0 commit comments

Comments
 (0)