mirror of
https://github.com/lune-org/lune.git
synced 2025-04-10 21:40:54 +01:00
Reject DomContentType, return to ContentType
This commit is contained in:
parent
dd231fc8b5
commit
fbb897f5a9
1 changed files with 13 additions and 91 deletions
|
@ -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<LuaTable<'_>> {
|
||||
let from_uri = |_, uri: String| Ok(Self(ContentType::Uri(uri)));
|
||||
|
||||
let from_object = |_, obj: LuaUserDataRef<Instance>| Ok(Self(ContentType::Object(*obj)));
|
||||
let from_object =
|
||||
|_, obj: LuaUserDataRef<Instance>| 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<DomContent> for Content {
|
|||
type Error = LuaError;
|
||||
|
||||
fn try_from(value: DomContent) -> Result<Self, Self::Error> {
|
||||
// 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<DomContentType> for ContentType {
|
||||
type Error = LuaError;
|
||||
|
||||
fn try_from(value: DomContentType) -> Result<Self, Self::Error> {
|
||||
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<ContentType> 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()))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue