Skip to content

Commit 1c0ff27

Browse files
committed
added json serde wasm codec
1 parent 8a2cf9e commit 1c0ff27

3 files changed

Lines changed: 59 additions & 0 deletions

File tree

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,25 @@ repository = "https://github.com/Synphonyte/codee"
1414
[dependencies]
1515
base64 = { version = "0.21", optional = true }
1616
bincode = { version = "1", optional = true }
17+
js-sys = { version = "0.3", optional = true }
1718
miniserde = { version = "0.1", optional = true }
1819
prost = { version = "0.12", optional = true }
1920
rkyv = { version = "0.7", optional = true, features = ["validation", "strict"] }
2021
rmp-serde = { version = "1.1", optional = true }
2122
serde = { version = "1", optional = true }
2223
serde_json = { version = "1", optional = true }
2324
serde-lite = { version = "0.5", optional = true }
25+
serde-wasm-bindgen = { version = "0.6", optional = true }
2426
thiserror = "1.0.61"
27+
wasm-bindgen = { version = "0.2", optional = true }
2528

2629
[features]
2730
prost = ["dep:prost"]
2831
json_serde = ["dep:serde_json", "dep:serde"]
2932
msgpack_serde = ["dep:rmp-serde", "dep:serde"]
3033
bincode_serde = ["dep:bincode", "dep:serde"]
3134
serde_lite = ["dep:serde-lite"]
35+
json_serde_wasm = ["dep:serde", "dep:serde_json", "dep:js-sys", "dep:serde-wasm-bindgen", "dep:wasm-bindgen"]
3236

3337

3438
[dev-dependencies]

src/string/json_serde_wasm.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use crate::{Decoder, Encoder};
2+
use serde::{Deserialize, Serialize};
3+
4+
/// A codec for encoding with [`serde_json`] and decoding using [`serde-wasm-bindgen`].
5+
///
6+
/// Only available with the **`json_serde_wasm` feature** enabled.
7+
pub struct JsonSerdeWasmCodec;
8+
9+
impl<T: Serialize> Encoder<T> for JsonSerdeWasmCodec {
10+
type Error = serde_json::Error;
11+
type Encoded = String;
12+
13+
fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
14+
serde_json::to_string(val)
15+
}
16+
}
17+
18+
impl<T> Decoder<T> for JsonSerdeWasmCodec
19+
where
20+
for<'de> T: Deserialize<'de>,
21+
{
22+
type Error = wasm_bindgen::JsValue;
23+
type Encoded = str;
24+
25+
fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
26+
let json = js_sys::JSON::parse(val)?;
27+
Ok(serde_wasm_bindgen::from_value(json)?)
28+
}
29+
}
30+
31+
// TODO
32+
// #[cfg(test)]
33+
// mod tests {
34+
// use super::*;
35+
//
36+
// #[test]
37+
// fn test_json_codec() {
38+
// #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
39+
// struct Test {
40+
// s: String,
41+
// i: i32,
42+
// }
43+
// let t = Test {
44+
// s: String::from("party time 🎉"),
45+
// i: 42,
46+
// };
47+
// let enc = JsonSerdeWasmCodec::encode(&t).unwrap();
48+
// let dec: Test = JsonSerdeWasmCodec::decode(&enc).unwrap();
49+
// assert_eq!(dec, t);
50+
// }
51+
// }

src/string/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ mod base64;
33
mod from_to_string;
44
#[cfg(feature = "json_serde")]
55
mod json_serde;
6+
#[cfg(feature = "json_serde_wasm")]
7+
mod json_serde_wasm;
68
#[cfg(feature = "miniserde")]
79
mod miniserde;
810
mod option;
@@ -12,6 +14,8 @@ pub use base64::*;
1214
pub use from_to_string::*;
1315
#[cfg(feature = "json_serde")]
1416
pub use json_serde::*;
17+
#[cfg(feature = "json_serde_wasm")]
18+
pub use json_serde_wasm::*;
1519
#[cfg(feature = "miniserde")]
1620
pub use miniserde::*;
1721
pub use option::*;

0 commit comments

Comments
 (0)