mirror of
https://github.com/leptos-rs/leptos
synced 2024-11-10 06:44:17 +00:00
add serde-wasm-bindgen encoding for resources
This commit is contained in:
parent
54fd74839a
commit
20c29cab89
3 changed files with 78 additions and 1 deletions
|
@ -22,6 +22,9 @@ futures = "0.3"
|
|||
|
||||
# serialization formats
|
||||
serde = { version = "1", optional = true }
|
||||
serde-wasm-bindgen = { version = "0.6", optional = true }
|
||||
js-sys = { version = "0.3", optional = true }
|
||||
wasm-bindgen = { version = "0.2", optional = true }
|
||||
serde_json = { version = "1", optional = true }
|
||||
miniserde = { version = "0.1", optional = true }
|
||||
rkyv = { version = "0.7", optional = true, features = [
|
||||
|
@ -40,6 +43,7 @@ default-tls = ["server_fn/default-tls"]
|
|||
rustls = ["server_fn/rustls"]
|
||||
hydration = ["reactive_graph/hydration", "dep:serde", "dep:serde_json"]
|
||||
rkyv = ["dep:rkyv", "dep:base64"]
|
||||
serde-wasm-bindgen = ["dep:serde-wasm-bindgen", "dep:js-sys", "dep:wasm-bindgen"]
|
||||
tracing = ["dep:tracing"]
|
||||
|
||||
[package.metadata.cargo-all-features]
|
||||
|
|
|
@ -4,6 +4,8 @@ use crate::serializers::Miniserde;
|
|||
use crate::serializers::Rkyv;
|
||||
#[cfg(feature = "serde-lite")]
|
||||
use crate::serializers::SerdeLite;
|
||||
#[cfg(feature = "serde-wasm-bindgen")]
|
||||
use crate::serializers::SerdeWasmBindgen;
|
||||
use crate::serializers::{SerdeJson, SerializableData, Serializer, Str};
|
||||
use core::{fmt::Debug, marker::PhantomData};
|
||||
use futures::Future;
|
||||
|
@ -55,7 +57,7 @@ where
|
|||
T::SerErr: Debug,
|
||||
T::DeErr: Debug,
|
||||
{
|
||||
pub fn new<S, Fut>(
|
||||
pub fn new_serde<S, Fut>(
|
||||
source: impl Fn() -> S + Send + Sync + 'static,
|
||||
fetcher: impl Fn(S) -> Fut + Send + Sync + 'static,
|
||||
) -> Self
|
||||
|
@ -68,6 +70,25 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde-wasm-bindgen")]
|
||||
impl<T> ArcResource<T, SerdeWasmBindgen>
|
||||
where
|
||||
T: Debug + SerializableData<SerdeWasmBindgen>,
|
||||
T::SerErr: Debug,
|
||||
T::DeErr: Debug,
|
||||
{
|
||||
pub fn new_serde_wb<S, Fut>(
|
||||
source: impl Fn() -> S + Send + Sync + 'static,
|
||||
fetcher: impl Fn(S) -> Fut + Send + Sync + 'static,
|
||||
) -> Self
|
||||
where
|
||||
S: PartialEq + Clone + Send + Sync + 'static,
|
||||
T: Send + Sync + 'static,
|
||||
Fut: Future<Output = T> + Send + 'static,
|
||||
{
|
||||
ArcResource::new_with_encoding(source, fetcher)
|
||||
}
|
||||
}
|
||||
#[cfg(feature = "miniserde")]
|
||||
impl<T> ArcResource<T, Miniserde>
|
||||
where
|
||||
|
@ -282,6 +303,26 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde-wasm-bindgen")]
|
||||
impl<T> Resource<T, SerdeWasmBindgen>
|
||||
where
|
||||
T: Debug + SerializableData<SerdeWasmBindgen> + Send + Sync + 'static,
|
||||
T::SerErr: Debug,
|
||||
T::DeErr: Debug,
|
||||
{
|
||||
pub fn new_serde_wb<S, Fut>(
|
||||
source: impl Fn() -> S + Send + Sync + 'static,
|
||||
fetcher: impl Fn(S) -> Fut + Send + Sync + 'static,
|
||||
) -> Self
|
||||
where
|
||||
S: PartialEq + Clone + Send + Sync + 'static,
|
||||
T: Send + Sync + 'static,
|
||||
Fut: Future<Output = T> + Send + 'static,
|
||||
{
|
||||
Resource::new_with_encoding(source, fetcher)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "miniserde")]
|
||||
impl<T> Resource<T, Miniserde>
|
||||
where
|
||||
|
|
|
@ -200,3 +200,35 @@ mod rkyv {
|
|||
|
||||
#[cfg(feature = "rkyv")]
|
||||
pub use rkyv::*;
|
||||
|
||||
#[cfg(feature = "serde-wasm-bindgen")]
|
||||
mod serde_wasm_bindgen {
|
||||
use super::{SerializableData, Serializer};
|
||||
use serde::{de::DeserializeOwned, Serialize};
|
||||
|
||||
/// A [`Serializer`] that serializes using [`serde_json`] and deserializes using
|
||||
/// [`serde-wasm-bindgen`].
|
||||
pub struct SerdeWasmBindgen;
|
||||
|
||||
impl Serializer for SerdeWasmBindgen {}
|
||||
|
||||
impl<T> SerializableData<SerdeWasmBindgen> for T
|
||||
where
|
||||
T: DeserializeOwned + Serialize,
|
||||
{
|
||||
type SerErr = serde_json::Error;
|
||||
type DeErr = wasm_bindgen::JsValue;
|
||||
|
||||
fn ser(&self) -> Result<String, Self::SerErr> {
|
||||
serde_json::to_string(&self)
|
||||
}
|
||||
|
||||
fn de(data: &str) -> Result<Self, Self::DeErr> {
|
||||
let json = js_sys::JSON::parse(data)?;
|
||||
serde_wasm_bindgen::from_value(json).map_err(Into::into)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde-wasm-bindgen")]
|
||||
pub use serde_wasm_bindgen::*;
|
||||
|
|
Loading…
Reference in a new issue