sonic_rs/lazyvalue/
ser.rs1use 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 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 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}