sonic_rs/lazyvalue/
ser.rs

1use serde::ser::SerializeStruct;
2
3use super::value::LazyValue;
4
5impl<'a> serde::ser::Serialize for LazyValue<'a> {
6    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
7    where
8        S: serde::Serializer,
9    {
10        let raw = self.as_raw_str();
11        let mut s = serializer.serialize_struct(super::TOKEN, 1)?;
12        // will directly write raw in `LazyValueStrEmitter::seriazlie_str`
13        s.serialize_field(super::TOKEN, raw)?;
14        s.end()
15    }
16}
17
18#[cfg(test)]
19mod test {
20    use serde::{Deserialize, Serialize};
21
22    use crate::{from_str, to_string, LazyValue, OwnedLazyValue, Result};
23
24    #[test]
25    fn test_lazyvalue_serde() {
26        let json = r#"{
27            "a": 1,
28            "b": "2",
29            "c": [3, 4, 5],
30            "d": {
31                "e": 6,
32                "f": "7",
33                "g": [8, 9, 10]
34            }
35        }"#;
36        let value = crate::from_str::<crate::LazyValue>(json).unwrap();
37        let json2 = crate::to_string(&value).unwrap();
38        assert_eq!(json, json2);
39    }
40
41    #[derive(Debug, Deserialize, Serialize)]
42    struct TestLazyValue<'a> {
43        #[serde(borrow)]
44        borrowed_lv: LazyValue<'a>,
45        owned_lv: OwnedLazyValue,
46    }
47
48    #[test]
49    fn test_raw_value_ok() {
50        fn test_json_ok(json: &str) {
51            let data = TestLazyValue {
52                borrowed_lv: from_str(json).expect(json),
53                owned_lv: from_str(json).expect(json),
54            };
55
56            // test long json for SIMD
57            let json2 = json.to_string() + &" ".repeat(1000);
58            let data2 = TestLazyValue {
59                borrowed_lv: from_str(json).expect(&json2),
60                owned_lv: from_str(json).expect(&json2),
61            };
62            assert_eq!(to_string(&data).unwrap(), to_string(&data2).unwrap());
63            let json = json.trim();
64            let expect: String = format!("{{\"borrowed_lv\":{json},\"owned_lv\":{json}}}");
65            let serialized = to_string(&data).expect(json);
66            assert_eq!(expect, serialized);
67            assert_eq!(serialized, to_string(&data).unwrap());
68        }
69        test_json_ok(r#""""#);
70        test_json_ok(r#""raw value""#);
71        test_json_ok(r#""哈哈哈☺""#);
72        test_json_ok(r#"true"#);
73        test_json_ok(r#"false"#);
74        test_json_ok(r#"0"#);
75        test_json_ok(r#"-1"#);
76        test_json_ok(r#"-1e+1111111111111"#);
77        test_json_ok(r#"-1e-1111111111111"#);
78        test_json_ok(r#"{}"#);
79        test_json_ok(r#"[]"#);
80        test_json_ok(r#"{"":[], "": ["", "", []]}"#);
81        test_json_ok(r#"{"":[], "": ["", "", []]}"#);
82    }
83
84    #[test]
85    fn test_raw_value_failed() {
86        fn test_json_failed(json: &str) {
87            let ret: Result<LazyValue<'_>> = from_str(json);
88            assert!(ret.is_err(), "invalid json is {json}");
89        }
90        test_json_failed(r#"""#);
91        test_json_failed(r#""raw " value""#);
92        test_json_failed(r#"哈哈哈""#);
93        test_json_failed(r#""\x""#);
94        test_json_failed("\"\x00\"");
95        test_json_failed(r#"tru"#);
96        test_json_failed(r#"fals"#);
97        test_json_failed(r#"0."#);
98        test_json_failed(r#"-"#);
99        test_json_failed(r#"-1e"#);
100        test_json_failed(r#"-1e-"#);
101        test_json_failed(r#"-1e-1.111"#);
102        test_json_failed(r#"-1e-1,"#);
103        test_json_failed(r#"{"#);
104        test_json_failed(r#" ]"#);
105        test_json_failed(r#"{"":[], ["", "", []]}"#);
106    }
107}