diff --git a/packages/signals/Cargo.toml b/packages/signals/Cargo.toml index 2c24758b5..0017a1545 100644 --- a/packages/signals/Cargo.toml +++ b/packages/signals/Cargo.toml @@ -11,8 +11,13 @@ dioxus-core = { workspace = true } generational-box = { workspace = true } log.workspace = true simple_logger = "4.2.0" +serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] dioxus = { workspace = true } dioxus-desktop = { workspace = true } tokio = { version = "1", features = ["full"] } + +[features] +default = [] +serialize = ["serde"] \ No newline at end of file diff --git a/packages/signals/src/rt.rs b/packages/signals/src/rt.rs index 0f0b3a8c2..7322d43b4 100644 --- a/packages/signals/src/rt.rs +++ b/packages/signals/src/rt.rs @@ -48,6 +48,28 @@ pub struct CopyValue { origin_scope: ScopeId, } +#[cfg(feature = "serde")] +impl serde::Serialize for CopyValue +where + T: serde::Serialize, +{ + fn serialize(&self, serializer: S) -> Result { + self.value.read().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T: 'static> serde::Deserialize<'de> for CopyValue +where + T: serde::Deserialize<'de>, +{ + fn deserialize>(deserializer: D) -> Result { + let value = T::deserialize(deserializer)?; + + Ok(Self::new(value)) + } +} + impl CopyValue { /// Create a new CopyValue. The value will be stored in the current component. /// diff --git a/packages/signals/src/signal.rs b/packages/signals/src/signal.rs index 5d696ee17..a5599a1ce 100644 --- a/packages/signals/src/signal.rs +++ b/packages/signals/src/signal.rs @@ -118,6 +118,20 @@ pub struct Signal { pub(crate) inner: CopyValue>, } +#[cfg(feature = "serde")] +impl serde::Serialize for Signal { + fn serialize(&self, serializer: S) -> Result { + self.read().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T: serde::Deserialize<'de> + 'static> serde::Deserialize<'de> for Signal { + fn deserialize>(deserializer: D) -> Result { + Ok(Self::new(T::deserialize(deserializer)?)) + } +} + impl Signal { /// Creates a new Signal. Signals are a Copy state management solution with automatic dependency tracking. pub fn new(value: T) -> Self {