diff --git a/packages/core/Cargo.toml b/packages/core/Cargo.toml
index 5bf348b33..7158b3970 100644
--- a/packages/core/Cargo.toml
+++ b/packages/core/Cargo.toml
@@ -44,6 +44,4 @@ pretty_assertions = "1.3.0"
[features]
default = []
-serialize = ["serde"]
-# Adds a Sync + Send bound on any values in attributes
-sync_attributes = []
\ No newline at end of file
+serialize = ["serde"]
\ No newline at end of file
diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs
index aef8e8b2d..e5440fd85 100644
--- a/packages/core/src/arena.rs
+++ b/packages/core/src/arena.rs
@@ -158,10 +158,10 @@ impl VirtualDom {
let listener = unsafe { &*listener };
match &listener.value {
AttributeValue::Listener(l) => {
- _ = l.0.take();
+ _ = l.take();
}
- AttributeValue::Any(a) => {
- _ = a.take();
+ AttributeValue::Any(_) => {
+ todo!()
}
_ => (),
}
diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs
index 30ee00f41..7e5633f12 100644
--- a/packages/core/src/create.rs
+++ b/packages/core/src/create.rs
@@ -1,5 +1,5 @@
use crate::any_props::AnyProps;
-use crate::innerlude::{VComponent, VPlaceholder, VText};
+use crate::innerlude::{BorrowedAttributeValue, VComponent, VPlaceholder, VText};
use crate::mutations::Mutation;
use crate::mutations::Mutation::*;
use crate::nodes::VNode;
@@ -285,7 +285,7 @@ impl<'b> VirtualDom {
}
}
- fn write_attribute(&mut self, attribute: &crate::Attribute, id: ElementId) {
+ fn write_attribute(&mut self, attribute: &'b crate::Attribute<'b>, id: ElementId) {
// Make sure we set the attribute's associated id
attribute.mounted_element.set(id);
@@ -302,7 +302,8 @@ impl<'b> VirtualDom {
}
_ => {
// Safety: we promise not to re-alias this text later on after committing it to the mutation
- let unbounded_value = unsafe { std::mem::transmute(attribute.value.clone()) };
+ let value: BorrowedAttributeValue<'b> = (&attribute.value).into();
+ let unbounded_value = unsafe { std::mem::transmute(value) };
self.mutations.push(SetAttribute {
name: unbounded_name,
diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs
index f055fb650..7227ee6e7 100644
--- a/packages/core/src/diff.rs
+++ b/packages/core/src/diff.rs
@@ -1,7 +1,7 @@
use crate::{
any_props::AnyProps,
arena::ElementId,
- innerlude::{DirtyScope, VComponent, VPlaceholder, VText},
+ innerlude::{BorrowedAttributeValue, DirtyScope, VComponent, VPlaceholder, VText},
mutations::Mutation,
nodes::RenderReturn,
nodes::{DynamicNode, VNode},
@@ -150,10 +150,10 @@ impl<'b> VirtualDom {
};
}
- fn update_attribute(&mut self, right_attr: &Attribute, left_attr: &Attribute) {
- // todo: add more types of attribute values
+ fn update_attribute(&mut self, right_attr: &'b Attribute<'b>, left_attr: &'b Attribute) {
let name = unsafe { std::mem::transmute(left_attr.name) };
- let value = unsafe { std::mem::transmute(right_attr.value.clone()) };
+ let value: BorrowedAttributeValue<'b> = (&right_attr.value).into();
+ let value = unsafe { std::mem::transmute(value) };
self.mutations.push(Mutation::SetAttribute {
id: left_attr.mounted_element.get(),
ns: right_attr.namespace,
diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs
index b6fe456bc..4e26f5a56 100644
--- a/packages/core/src/lib.rs
+++ b/packages/core/src/lib.rs
@@ -70,10 +70,10 @@ pub(crate) mod innerlude {
}
pub use crate::innerlude::{
- fc_to_builder, AnyValueContainer, Attribute, AttributeValue, CapturedError, Component,
- DynamicNode, Element, ElementId, Event, Fragment, IntoDynNode, LazyNodes, Mutation, Mutations,
- Properties, RenderReturn, Scope, ScopeId, ScopeState, Scoped, SuspenseContext, TaskId,
- Template, TemplateAttribute, TemplateNode, VComponent, VNode, VText, VirtualDom,
+ fc_to_builder, AnyValue, Attribute, AttributeValue, BorrowedAttributeValue, CapturedError,
+ Component, DynamicNode, Element, ElementId, Event, Fragment, IntoDynNode, LazyNodes, Mutation,
+ Mutations, Properties, RenderReturn, Scope, ScopeId, ScopeState, Scoped, SuspenseContext,
+ TaskId, Template, TemplateAttribute, TemplateNode, VComponent, VNode, VText, VirtualDom,
};
/// The purpose of this module is to alleviate imports of many common types
diff --git a/packages/core/src/mutations.rs b/packages/core/src/mutations.rs
index 06116f5dc..b02e89581 100644
--- a/packages/core/src/mutations.rs
+++ b/packages/core/src/mutations.rs
@@ -1,6 +1,6 @@
use rustc_hash::FxHashSet;
-use crate::{arena::ElementId, AttributeValue, ScopeId, Template};
+use crate::{arena::ElementId, innerlude::BorrowedAttributeValue, ScopeId, Template};
/// A container for all the relevant steps to modify the Real DOM
///
@@ -208,7 +208,7 @@ pub enum Mutation<'a> {
name: &'a str,
/// The value of the attribute.
- value: AttributeValue<'a>,
+ value: BorrowedAttributeValue<'a>,
/// The ID of the node to set the attribute of.
id: ElementId,
diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs
index 0c797460a..d17863c20 100644
--- a/packages/core/src/nodes.rs
+++ b/packages/core/src/nodes.rs
@@ -6,9 +6,8 @@ use bumpalo::Bump;
use std::{
any::{Any, TypeId},
cell::{Cell, RefCell, UnsafeCell},
- fmt::Arguments,
+ fmt::{Arguments, Debug},
future::Future,
- ops::Deref,
};
pub type TemplateId = &'static str;
@@ -200,7 +199,7 @@ impl<'a> VNode<'a> {
pub(crate) fn clear_listeners(&self) {
for attr in self.dynamic_attrs {
if let AttributeValue::Listener(l) = &attr.value {
- l.0.borrow_mut().take();
+ l.borrow_mut().take();
}
}
}
@@ -507,9 +506,6 @@ pub struct Attribute<'a> {
///
/// These are built-in to be faster during the diffing process. To use a custom value, use the [`AttributeValue::Any`]
/// variant.
-#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "serialize", serde(untagged))]
-#[derive(Clone)]
pub enum AttributeValue<'a> {
/// Text attribute
Text(&'a str),
@@ -524,107 +520,105 @@ pub enum AttributeValue<'a> {
Bool(bool),
/// A listener, like "onclick"
- Listener(ListenerCb<'a>),
+ Listener(RefCell