Skip to main content

oak_json/language/
ser.rs

1use serde::ser::{self, Serialize, Serializer};
2
3use crate::ast::JsonValueNode;
4use oak_core::OakError;
5
6/// JSON 序列化实现
7pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
8where
9    S: Serializer,
10    T: Serialize,
11{
12    value.serialize(serializer)
13}
14
15/// Serializes a Rust type into a JSON string.
16pub fn to_string<T>(value: &T) -> Result<String, OakError>
17where
18    T: serde::Serialize,
19{
20    // 直接使用 serde_json 来序列化 Rust 类型
21    serde_json::to_string(value).map_err(|e| OakError::custom_error(format!("{:?}", e)))
22}
23
24struct JsonValueSerializer {}
25
26impl Default for JsonValueSerializer {
27    fn default() -> Self {
28        Self {}
29    }
30}
31
32impl serde::ser::Serializer for JsonValueSerializer {
33    type Ok = JsonValueNode;
34    type Error = OakError;
35
36    type SerializeSeq = JsonSeqSerializer;
37    type SerializeTuple = JsonSeqSerializer;
38    type SerializeTupleStruct = JsonSeqSerializer;
39    type SerializeTupleVariant = JsonSeqSerializer;
40    type SerializeMap = JsonMapSerializer;
41    type SerializeStruct = JsonMapSerializer;
42    type SerializeStructVariant = JsonMapSerializer;
43
44    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
45        Ok(JsonValueNode::Boolean(crate::ast::JsonBoolean { span: (0..0).into(), value: v }))
46    }
47
48    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
49        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
50    }
51
52    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
53        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
54    }
55
56    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
57        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
58    }
59
60    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
61        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
62    }
63
64    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
65        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
66    }
67
68    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
69        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
70    }
71
72    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
73        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
74    }
75
76    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
77        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
78    }
79
80    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
81        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v as f64 }))
82    }
83
84    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
85        Ok(JsonValueNode::Number(crate::ast::JsonNumber { span: (0..0).into(), value: v }))
86    }
87
88    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
89        Ok(JsonValueNode::String(crate::ast::JsonString { span: (0..0).into(), value: v.to_string() }))
90    }
91
92    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
93        Ok(JsonValueNode::String(crate::ast::JsonString { span: (0..0).into(), value: v.to_string() }))
94    }
95
96    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
97        Ok(JsonValueNode::String(crate::ast::JsonString { span: (0..0).into(), value: String::from_utf8_lossy(v).to_string() }))
98    }
99
100    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
101        Ok(JsonValueNode::Null(crate::ast::JsonNull { span: (0..0).into() }))
102    }
103
104    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
105    where
106        T: ?Sized + Serialize,
107    {
108        value.serialize(self)
109    }
110
111    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
112        Ok(JsonValueNode::Null(crate::ast::JsonNull { span: (0..0).into() }))
113    }
114
115    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
116        self.serialize_unit()
117    }
118
119    fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
120        Ok(JsonValueNode::String(crate::ast::JsonString { span: (0..0).into(), value: variant.to_string() }))
121    }
122
123    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok, Self::Error>
124    where
125        T: ?Sized + Serialize,
126    {
127        value.serialize(self)
128    }
129
130    fn serialize_newtype_variant<T>(self, _name: &'static str, _variant_index: u32, _variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error>
131    where
132        T: ?Sized + Serialize,
133    {
134        value.serialize(self)
135    }
136
137    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
138        Ok(JsonSeqSerializer { elements: Vec::with_capacity(len.unwrap_or(0)) })
139    }
140
141    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
142        Ok(JsonSeqSerializer { elements: Vec::with_capacity(len) })
143    }
144
145    fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
146        Ok(JsonSeqSerializer { elements: Vec::with_capacity(len) })
147    }
148
149    fn serialize_tuple_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
150        Ok(JsonSeqSerializer { elements: Vec::with_capacity(len) })
151    }
152
153    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
154        Ok(JsonMapSerializer { fields: Vec::with_capacity(len.unwrap_or(0)), current_key: None })
155    }
156
157    fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> {
158        Ok(JsonMapSerializer { fields: Vec::with_capacity(len), current_key: None })
159    }
160
161    fn serialize_struct_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
162        Ok(JsonMapSerializer { fields: Vec::with_capacity(len), current_key: None })
163    }
164}
165
166struct JsonSeqSerializer {
167    elements: Vec<JsonValueNode>,
168}
169
170impl serde::ser::SerializeSeq for JsonSeqSerializer {
171    type Ok = JsonValueNode;
172    type Error = OakError;
173
174    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
175    where
176        T: ?Sized + Serialize,
177    {
178        let serializer = JsonValueSerializer {};
179        let item = value.serialize(serializer)?;
180        self.elements.push(item);
181        Ok(())
182    }
183
184    fn end(self) -> Result<Self::Ok, Self::Error> {
185        Ok(JsonValueNode::Array(crate::ast::JsonArray { elements: self.elements, span: (0..0).into() }))
186    }
187}
188
189impl serde::ser::SerializeTuple for JsonSeqSerializer {
190    type Ok = JsonValueNode;
191    type Error = OakError;
192
193    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
194    where
195        T: ?Sized + Serialize,
196    {
197        let serializer = JsonValueSerializer {};
198        let item = value.serialize(serializer)?;
199        self.elements.push(item);
200        Ok(())
201    }
202
203    fn end(self) -> Result<Self::Ok, Self::Error> {
204        Ok(JsonValueNode::Array(crate::ast::JsonArray { elements: self.elements, span: (0..0).into() }))
205    }
206}
207
208impl serde::ser::SerializeTupleStruct for JsonSeqSerializer {
209    type Ok = JsonValueNode;
210    type Error = OakError;
211
212    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
213    where
214        T: ?Sized + Serialize,
215    {
216        let serializer = JsonValueSerializer {};
217        let item = value.serialize(serializer)?;
218        self.elements.push(item);
219        Ok(())
220    }
221
222    fn end(self) -> Result<Self::Ok, Self::Error> {
223        Ok(JsonValueNode::Array(crate::ast::JsonArray { elements: self.elements, span: (0..0).into() }))
224    }
225}
226
227impl serde::ser::SerializeTupleVariant for JsonSeqSerializer {
228    type Ok = JsonValueNode;
229    type Error = OakError;
230
231    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
232    where
233        T: ?Sized + Serialize,
234    {
235        let serializer = JsonValueSerializer {};
236        let item = value.serialize(serializer)?;
237        self.elements.push(item);
238        Ok(())
239    }
240
241    fn end(self) -> Result<Self::Ok, Self::Error> {
242        Ok(JsonValueNode::Array(crate::ast::JsonArray { elements: self.elements, span: (0..0).into() }))
243    }
244}
245
246struct JsonMapSerializer {
247    fields: Vec<crate::ast::JsonField>,
248    current_key: Option<JsonValueNode>,
249}
250
251impl serde::ser::SerializeMap for JsonMapSerializer {
252    type Ok = JsonValueNode;
253    type Error = OakError;
254
255    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
256    where
257        T: ?Sized + Serialize,
258    {
259        let serializer = JsonValueSerializer {};
260        let key_value = key.serialize(serializer)?;
261        self.current_key = Some(key_value);
262        Ok(())
263    }
264
265    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
266    where
267        T: ?Sized + Serialize,
268    {
269        let serializer = JsonValueSerializer {};
270        let value_value = value.serialize(serializer)?;
271        if let Some(key) = self.current_key.take() {
272            // Convert JsonValueNode key to JsonString
273            let json_string = match key {
274                JsonValueNode::String(s) => s,
275                _ => return Err(OakError::custom_error("JSON keys must be strings")),
276            };
277            self.fields.push(crate::ast::JsonField { span: (0..0).into(), name: json_string, value: value_value });
278        }
279        Ok(())
280    }
281
282    fn end(self) -> Result<Self::Ok, Self::Error> {
283        Ok(JsonValueNode::Object(crate::ast::JsonObject { fields: self.fields, span: (0..0).into() }))
284    }
285}
286
287impl serde::ser::SerializeStruct for JsonMapSerializer {
288    type Ok = JsonValueNode;
289    type Error = OakError;
290
291    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
292    where
293        T: ?Sized + Serialize,
294    {
295        let json_string = crate::ast::JsonString { span: (0..0).into(), value: key.to_string() };
296        let serializer = JsonValueSerializer {};
297        let value_value = value.serialize(serializer)?;
298        self.fields.push(crate::ast::JsonField { span: (0..0).into(), name: json_string, value: value_value });
299        Ok(())
300    }
301
302    fn end(self) -> Result<Self::Ok, Self::Error> {
303        Ok(JsonValueNode::Object(crate::ast::JsonObject { fields: self.fields, span: (0..0).into() }))
304    }
305}
306
307impl serde::ser::SerializeStructVariant for JsonMapSerializer {
308    type Ok = JsonValueNode;
309    type Error = OakError;
310
311    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
312    where
313        T: ?Sized + Serialize,
314    {
315        let json_string = crate::ast::JsonString { span: (0..0).into(), value: key.to_string() };
316        let serializer = JsonValueSerializer {};
317        let value_value = value.serialize(serializer)?;
318        self.fields.push(crate::ast::JsonField { span: (0..0).into(), name: json_string, value: value_value });
319        Ok(())
320    }
321
322    fn end(self) -> Result<Self::Ok, Self::Error> {
323        Ok(JsonValueNode::Object(crate::ast::JsonObject { fields: self.fields, span: (0..0).into() }))
324    }
325}