codee/string/
miniserde.rs

1use crate::{Decoder, Encoder};
2use miniserde::{json, Deserialize, Serialize};
3
4/// A codec that relies on `miniserde` to encode data in the json format.
5///
6/// This is only available with the **`miniserde` feature** enabled.
7pub struct MiniserdeCodec;
8
9impl<T: Serialize> Encoder<T> for MiniserdeCodec {
10    type Error = ();
11    type Encoded = String;
12
13    fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
14        Ok(json::to_string(val))
15    }
16}
17
18impl<T: Deserialize> Decoder<T> for MiniserdeCodec {
19    type Error = miniserde::Error;
20    type Encoded = str;
21
22    fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
23        json::from_str(val)
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    #[test]
32    fn test_json_codec() {
33        #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
34        struct Test {
35            s: String,
36            i: i32,
37        }
38        let t = Test {
39            s: String::from("party time 🎉"),
40            i: 42,
41        };
42        let enc = MiniserdeCodec::encode(&t).unwrap();
43        let dec: Test = MiniserdeCodec::decode(&enc).unwrap();
44        assert_eq!(dec, t);
45    }
46}