瀏覽代碼

add serde feature to signals

Evan Almloff 1 年之前
父節點
當前提交
18d255decc
共有 3 個文件被更改,包括 41 次插入0 次删除
  1. 5 0
      packages/signals/Cargo.toml
  2. 22 0
      packages/signals/src/rt.rs
  3. 14 0
      packages/signals/src/signal.rs

+ 5 - 0
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"]

+ 22 - 0
packages/signals/src/rt.rs

@@ -48,6 +48,28 @@ pub struct CopyValue<T: 'static> {
     origin_scope: ScopeId,
 }
 
+#[cfg(feature = "serde")]
+impl<T: 'static> serde::Serialize for CopyValue<T>
+where
+    T: serde::Serialize,
+{
+    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
+        self.value.read().serialize(serializer)
+    }
+}
+
+#[cfg(feature = "serde")]
+impl<'de, T: 'static> serde::Deserialize<'de> for CopyValue<T>
+where
+    T: serde::Deserialize<'de>,
+{
+    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
+        let value = T::deserialize(deserializer)?;
+
+        Ok(Self::new(value))
+    }
+}
+
 impl<T: 'static> CopyValue<T> {
     /// Create a new CopyValue. The value will be stored in the current component.
     ///

+ 14 - 0
packages/signals/src/signal.rs

@@ -118,6 +118,20 @@ pub struct Signal<T: 'static> {
     pub(crate) inner: CopyValue<SignalData<T>>,
 }
 
+#[cfg(feature = "serde")]
+impl<T: serde::Serialize + 'static> serde::Serialize for Signal<T> {
+    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
+        self.read().serialize(serializer)
+    }
+}
+
+#[cfg(feature = "serde")]
+impl<'de, T: serde::Deserialize<'de> + 'static> serde::Deserialize<'de> for Signal<T> {
+    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
+        Ok(Self::new(T::deserialize(deserializer)?))
+    }
+}
+
 impl<T: 'static> Signal<T> {
     /// Creates a new Signal. Signals are a Copy state management solution with automatic dependency tracking.
     pub fn new(value: T) -> Self {