Skip to content

Commit 8a2cf9e

Browse files
committed
added support for serde-lite
1 parent 9aba45e commit 8a2cf9e

4 files changed

Lines changed: 93 additions & 12 deletions

File tree

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,20 @@ rkyv = { version = "0.7", optional = true, features = ["validation", "strict"] }
2020
rmp-serde = { version = "1.1", optional = true }
2121
serde = { version = "1", optional = true }
2222
serde_json = { version = "1", optional = true }
23+
serde-lite = { version = "0.5", optional = true }
2324
thiserror = "1.0.61"
2425

2526
[features]
2627
prost = ["dep:prost"]
2728
json_serde = ["dep:serde_json", "dep:serde"]
2829
msgpack_serde = ["dep:rmp-serde", "dep:serde"]
2930
bincode_serde = ["dep:bincode", "dep:serde"]
31+
serde_lite = ["dep:serde-lite"]
32+
3033

3134
[dev-dependencies]
3235
serde = { version = "1", features = ["derive"] }
36+
serde-lite = { version = "0.5", features = ["derive"] }
3337
leptos = "0.6"
3438
leptos-use = "0.10"
3539

src/lib.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,13 @@
159159
pub mod binary;
160160
mod error;
161161
mod hybrid;
162+
#[cfg(feature = "serde_lite")]
163+
mod serde_lite;
162164
pub mod string;
163165
mod traits;
164166

165167
pub use error::*;
166168
pub use hybrid::*;
169+
#[cfg(feature = "serde_lite")]
170+
pub use serde_lite::*;
167171
pub use traits::*;
168-
169-
// #[cfg(test)]
170-
// mod tests {
171-
// #[test]
172-
// fn it_works() {
173-
// let result = add(2, 2);
174-
// assert_eq!(result, 4);
175-
// }
176-
// }

src/serde_lite.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use crate::{Decoder, Encoder};
2+
use serde_lite::{Deserialize, Intermediate, Serialize};
3+
4+
/// A wrapper codec that relies on [`serde_lite`]. With this, you can wrap serde based codecs that
5+
/// also work with serde-lite like the [`JsonSerdeCodec`] or the [`MsgpackSerdeCodec`].
6+
///
7+
/// Only available with the **`serde_lite` feature** enabled plus the feature you need for the
8+
/// wrapped codec.
9+
///
10+
/// ## Example
11+
///
12+
/// ```
13+
/// use codee::{Encoder, Decoder, SerdeLite, string::JsonSerdeCodec, binary::MsgpackSerdeCodec};
14+
/// use serde_lite::{Deserialize, Serialize};
15+
///
16+
/// #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
17+
/// struct Test {
18+
/// s: String,
19+
/// i: i32,
20+
/// }
21+
///
22+
/// let t = Test {
23+
/// s: String::from("party time 🎉"),
24+
/// i: 42,
25+
/// };
26+
///
27+
/// let enc = SerdeLite::<JsonSerdeCodec>::encode(&t).unwrap();
28+
/// let dec: Test = SerdeLite::<JsonSerdeCodec>::decode(&enc).unwrap();
29+
///
30+
/// let enc = SerdeLite::<MsgpackSerdeCodec>::encode(&t).unwrap();
31+
/// let dec: Test = SerdeLite::<MsgpackSerdeCodec>::decode(&enc).unwrap();
32+
/// assert_eq!(dec, t);
33+
/// ```
34+
pub struct SerdeLite<C>(C);
35+
36+
#[derive(Debug, thiserror::Error)]
37+
pub enum SerdeLiteEncodeError<E> {
38+
#[error("Error from serde-lite: {0}")]
39+
SerdeLite(serde_lite::Error),
40+
#[error("Error from wrapped encoder")]
41+
Encoder(#[from] E),
42+
}
43+
44+
#[derive(Debug, thiserror::Error)]
45+
pub enum SerdeLiteDecodeError<E> {
46+
#[error("Error from serde-lite: {0}")]
47+
SerdeLite(serde_lite::Error),
48+
#[error("Error from wrapped decoder")]
49+
Decoder(#[from] E),
50+
}
51+
52+
impl<T, E> Encoder<T> for SerdeLite<E>
53+
where
54+
T: Serialize,
55+
E: Encoder<Intermediate>,
56+
{
57+
type Error = SerdeLiteEncodeError<<E as Encoder<Intermediate>>::Error>;
58+
type Encoded = <E as Encoder<Intermediate>>::Encoded;
59+
60+
fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
61+
let intermediate = val.serialize().map_err(SerdeLiteEncodeError::SerdeLite)?;
62+
Ok(E::encode(&intermediate)?)
63+
}
64+
}
65+
66+
impl<T, D> Decoder<T> for SerdeLite<D>
67+
where
68+
T: Deserialize,
69+
D: Decoder<Intermediate>,
70+
{
71+
type Error = SerdeLiteDecodeError<<D as Decoder<Intermediate>>::Error>;
72+
type Encoded = <D as Decoder<Intermediate>>::Encoded;
73+
74+
fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
75+
let intermediate = D::decode(val)?;
76+
Ok(T::deserialize(&intermediate).map_err(SerdeLiteDecodeError::SerdeLite)?)
77+
}
78+
}

src/string/json_serde.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::{Decoder, Encoder};
2+
use serde::{Deserialize, Serialize};
23

34
/// A codec for encoding JSON messages that relies on [`serde_json`].
45
///
@@ -28,7 +29,7 @@ use crate::{Decoder, Encoder};
2829
/// ```
2930
pub struct JsonSerdeCodec;
3031

31-
impl<T: serde::Serialize> Encoder<T> for JsonSerdeCodec {
32+
impl<T: Serialize> Encoder<T> for JsonSerdeCodec {
3233
type Error = serde_json::Error;
3334
type Encoded = String;
3435

@@ -37,7 +38,10 @@ impl<T: serde::Serialize> Encoder<T> for JsonSerdeCodec {
3738
}
3839
}
3940

40-
impl<T: serde::de::DeserializeOwned> Decoder<T> for JsonSerdeCodec {
41+
impl<T> Decoder<T> for JsonSerdeCodec
42+
where
43+
for<'de> T: Deserialize<'de>,
44+
{
4145
type Error = serde_json::Error;
4246
type Encoded = str;
4347

@@ -52,7 +56,7 @@ mod tests {
5256

5357
#[test]
5458
fn test_json_codec() {
55-
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
59+
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
5660
struct Test {
5761
s: String,
5862
i: i32,

0 commit comments

Comments
 (0)