1use serde::ser::{self, Serialize, Serializer};
2
3use crate::ast::JsonValueNode;
4use oak_core::OakError;
5
6pub 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
15pub fn to_string<T>(value: &T) -> Result<String, OakError>
17where
18 T: serde::Serialize,
19{
20 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 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}