mirror of
https://github.com/DioxusLabs/dioxus
synced 2025-02-17 06:08:26 +00:00
add serde feature to signals
This commit is contained in:
parent
3f31b9de43
commit
18d255decc
3 changed files with 41 additions and 0 deletions
|
@ -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"]
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue