From fbb897f5a94e611d1e955bb44d1dcbb52821a2fd Mon Sep 17 00:00:00 2001 From: Micah Date: Wed, 2 Apr 2025 15:02:53 -0700 Subject: [PATCH] Reject DomContentType, return to ContentType --- .../src/datatypes/types/content.rs | 104 +++--------------- 1 file changed, 13 insertions(+), 91 deletions(-) diff --git a/crates/lune-roblox/src/datatypes/types/content.rs b/crates/lune-roblox/src/datatypes/types/content.rs index 45b19e4..16f8615 100644 --- a/crates/lune-roblox/src/datatypes/types/content.rs +++ b/crates/lune-roblox/src/datatypes/types/content.rs @@ -1,7 +1,7 @@ use core::fmt; use mlua::prelude::*; -use rbx_dom_weak::types::{Content as DomContent, ContentType as DomContentType}; +use rbx_dom_weak::types::{Content as DomContent, ContentType}; use lune_utils::TableBuilder; @@ -23,7 +23,8 @@ impl LuaExportsTable<'_> for Content { fn create_exports_table(lua: &'_ Lua) -> LuaResult> { let from_uri = |_, uri: String| Ok(Self(ContentType::Uri(uri))); - let from_object = |_, obj: LuaUserDataRef| Ok(Self(ContentType::Object(*obj))); + let from_object = + |_, obj: LuaUserDataRef| Ok(Self(ContentType::Object(obj.dom_ref))); TableBuilder::new(lua)? .with_value("none", Content(ContentType::None))? @@ -36,10 +37,15 @@ impl LuaExportsTable<'_> for Content { impl LuaUserData for Content { fn add_fields<'lua, F: LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_method_get("SourceType", |_, this| { - let variant_name = match this.0 { + let variant_name = match &this.0 { ContentType::None => "None", ContentType::Uri(_) => "Uri", ContentType::Object(_) => "Object", + other => { + return Err(LuaError::runtime(format!( + "cannot get SourceType: unknown ContentType variant '{other:?}'" + ))) + } }; Ok(EnumItem::from_enum_name_and_name( "ContentSourceType", @@ -54,8 +60,8 @@ impl LuaUserData for Content { } }); fields.add_field_method_get("Object", |_, this| { - if let ContentType::Object(object) = &this.0 { - Ok(Some(*object)) + if let ContentType::Object(referent) = &this.0 { + Ok(Instance::new_opt(*referent)) } else { Ok(None) } @@ -77,6 +83,7 @@ impl fmt::Display for Content { ContentType::None => write!(f, "None")?, ContentType::Uri(uri) => write!(f, "Uri={uri}")?, ContentType::Object(_) => write!(f, "Object")?, + other => write!(f, "UnknownType({other:?})")?, } write!(f, ")") } @@ -86,91 +93,6 @@ impl TryFrom for Content { type Error = LuaError; fn try_from(value: DomContent) -> Result { - // TODO: Replace with `DomContent.into_value()`. - // rbx_types::Content is missing a method to get ownership of the - // value right now so we have to do this. - let converted_value = match value.value() { - DomContentType::None => ContentType::None, - DomContentType::Uri(uri) => ContentType::Uri(uri.to_owned()), - DomContentType::Object(referent) => { - if let Some(instance) = Instance::new_opt(*referent) { - ContentType::Object(instance) - } else { - return Err(DomConversionError::FromDomValue { - from: "DomContentType", - to: "ContentType", - detail: Some( - "the value of DomContentType::Object must be a valid referent".into(), - ), - } - .into()); - } - } - _ => { - return Err(DomConversionError::FromDomValue { - from: "???", - to: "ContentType", - detail: Some(format!( - "unknown variant of DomContentType (please open an issue at {})", - env!("CARGO_PKG_REPOSITORY") - )), - } - .into()) - } - }; - - Ok(Self(converted_value)) - } -} - -#[derive(Debug, Clone, PartialEq)] -#[non_exhaustive] -pub enum ContentType { - Uri(String), - Object(Instance), - None, -} - -impl TryFrom for ContentType { - type Error = LuaError; - - fn try_from(value: DomContentType) -> Result { - match value { - DomContentType::None => Ok(Self::None), - DomContentType::Uri(uri) => Ok(Self::Uri(uri)), - DomContentType::Object(referent) => { - if let Some(instance) = Instance::new_opt(referent) { - Ok(Self::Object(instance)) - } else { - Err(DomConversionError::FromDomValue { - from: "DomContentType", - to: "ContentType", - detail: Some( - "the value of DomContentType::Object must be a valid referent".into(), - ), - } - .into()) - } - } - _ => Err(DomConversionError::FromDomValue { - from: "???", - to: "ContentType", - detail: Some(format!( - "unknown variant of DomContentType (please open an issue at {})", - env!("CARGO_PKG_REPOSITORY") - )), - } - .into()), - } - } -} - -impl From for DomContentType { - fn from(value: ContentType) -> Self { - match value { - ContentType::None => Self::None, - ContentType::Uri(uri) => Self::Uri(uri), - ContentType::Object(object) => Self::Object(object.dom_ref), - } + Ok(Self(value.value().clone())) } }