1use crate::Value;
2use core::error::Error;
3use core::fmt;
4use cu29_clock::CuTime;
5use serde::ser;
6
7use alloc::boxed::Box;
8use alloc::collections::BTreeMap;
9use alloc::string::{String, ToString};
10use alloc::vec;
11use alloc::vec::Vec;
12
13#[derive(Debug)]
14pub enum SerializerError {
15 Custom(String),
16}
17
18impl fmt::Display for SerializerError {
19 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
20 match *self {
21 SerializerError::Custom(ref s) => fmt.write_str(s),
22 }
23 }
24}
25
26impl Error for SerializerError {
27 fn description(&self) -> &str {
28 "Value serializer error"
29 }
30}
31
32impl ser::Error for SerializerError {
33 fn custom<T: fmt::Display>(msg: T) -> SerializerError {
34 SerializerError::Custom(msg.to_string())
35 }
36}
37
38impl ser::Serialize for Value {
39 fn serialize<S: ser::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
40 match *self {
41 Value::Bool(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
42 Value::U8(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
43 Value::U16(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
44 Value::U32(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
45 Value::U64(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
46 Value::I8(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
47 Value::I16(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
48 Value::I32(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
49 Value::I64(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
50 Value::F32(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
51 Value::F64(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
52 Value::Char(v) => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v)),
53 Value::String(ref v) => {
54 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v))
55 }
56 Value::Bytes(ref v) => {
57 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v))
58 }
59 Value::Unit => s.serialize_newtype_struct("Value", &(self.discriminant() as u8, ())),
60 Value::Option(None) => {
61 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, ()))
62 }
63 Value::Option(Some(ref v)) => {
64 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v))
65 }
66 Value::Newtype(ref v) => {
67 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v))
68 }
69 Value::Seq(ref v) => v.serialize(s),
70 Value::Map(ref v) => v.serialize(s),
71 Value::CuTime(v) => {
72 s.serialize_newtype_struct("Value", &(self.discriminant() as u8, v))
73 }
74 }
75 }
76}
77
78pub fn to_value<T: ser::Serialize>(value: T) -> Result<Value, SerializerError> {
79 value.serialize(Serializer)
80}
81
82struct Serializer;
83
84impl ser::Serializer for Serializer {
85 type Ok = Value;
86 type Error = SerializerError;
87 type SerializeSeq = SerializeSeq;
88 type SerializeTuple = SerializeTuple;
89 type SerializeTupleStruct = SerializeTupleStruct;
90 type SerializeTupleVariant = SerializeTupleVariant;
91 type SerializeMap = SerializeMap;
92 type SerializeStruct = SerializeStruct;
93 type SerializeStructVariant = SerializeStructVariant;
94
95 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
96 Ok(Value::Bool(v))
97 }
98
99 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
100 Ok(Value::I8(v))
101 }
102
103 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
104 Ok(Value::I16(v))
105 }
106
107 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
108 Ok(Value::I32(v))
109 }
110
111 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
112 Ok(Value::I64(v))
113 }
114
115 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
116 Ok(Value::U8(v))
117 }
118
119 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
120 Ok(Value::U16(v))
121 }
122
123 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
124 Ok(Value::U32(v))
125 }
126
127 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
128 Ok(Value::U64(v))
129 }
130
131 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
132 Ok(Value::F32(v))
133 }
134
135 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
136 Ok(Value::F64(v))
137 }
138
139 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
140 Ok(Value::Char(v))
141 }
142
143 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
144 Ok(Value::String(v.to_string()))
145 }
146
147 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
148 Ok(Value::Bytes(v.to_vec()))
149 }
150
151 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
152 Ok(Value::Option(None))
153 }
154
155 fn serialize_some<T: ?Sized + ser::Serialize>(
156 self,
157 value: &T,
158 ) -> Result<Self::Ok, Self::Error> {
159 value
160 .serialize(Serializer)
161 .map(|v| Value::Option(Some(Box::new(v))))
162 }
163
164 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
165 Ok(Value::Unit)
166 }
167
168 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
169 Ok(Value::Unit)
170 }
171
172 fn serialize_unit_variant(
173 self,
174 _name: &'static str,
175 _variant_index: u32,
176 variant: &'static str,
177 ) -> Result<Self::Ok, Self::Error> {
178 Ok(Value::String(variant.to_string()))
179 }
180
181 fn serialize_newtype_struct<T: ?Sized + ser::Serialize>(
182 self,
183 name: &'static str,
184 value: &T,
185 ) -> Result<Self::Ok, Self::Error> {
186 if name == "CuDuration" || name == "CuTime" {
187 return value.serialize(Serializer).map(|v| {
188 if let Value::U64(v) = v {
189 Value::CuTime(CuTime::from(v))
190 } else {
191 v
192 }
193 });
194 }
195 value
196 .serialize(Serializer)
197 .map(|v| Value::Newtype(Box::new(v)))
198 }
199
200 fn serialize_newtype_variant<T: ?Sized + ser::Serialize>(
201 self,
202 _name: &'static str,
203 _variant_index: u32,
204 variant: &'static str,
205 value: &T,
206 ) -> Result<Self::Ok, Self::Error> {
207 value.serialize(Serializer).map(|v| {
208 let mut map = BTreeMap::new();
209 map.insert(Value::String(variant.to_string()), v);
210 Value::Map(map)
211 })
212 }
213
214 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
215 Ok(SerializeSeq(vec![]))
216 }
217
218 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
219 Ok(SerializeTuple(vec![]))
220 }
221
222 fn serialize_tuple_struct(
223 self,
224 _name: &'static str,
225 _len: usize,
226 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
227 Ok(SerializeTupleStruct(vec![]))
228 }
229
230 fn serialize_tuple_variant(
231 self,
232 _name: &'static str,
233 _variant_index: u32,
234 variant: &'static str,
235 len: usize,
236 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
237 Ok(SerializeTupleVariant(
238 Value::String(variant.to_string()),
239 Vec::with_capacity(len),
240 ))
241 }
242
243 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
244 Ok(SerializeMap {
245 map: BTreeMap::new(),
246 key: None,
247 })
248 }
249
250 fn serialize_struct(
251 self,
252 _name: &'static str,
253 _len: usize,
254 ) -> Result<Self::SerializeStruct, Self::Error> {
255 Ok(SerializeStruct(BTreeMap::new()))
256 }
257
258 fn serialize_struct_variant(
259 self,
260 _name: &'static str,
261 _variant_index: u32,
262 variant: &'static str,
263 _len: usize,
264 ) -> Result<Self::SerializeStructVariant, Self::Error> {
265 Ok(SerializeStructVariant(
266 Value::String(variant.to_string()),
267 BTreeMap::new(),
268 ))
269 }
270}
271
272struct SerializeSeq(Vec<Value>);
273
274impl ser::SerializeSeq for SerializeSeq {
275 type Ok = Value;
276 type Error = SerializerError;
277
278 fn serialize_element<T: ?Sized + ser::Serialize>(
279 &mut self,
280 value: &T,
281 ) -> Result<(), Self::Error> {
282 let Self(vec) = self;
283 let value = value.serialize(Serializer)?;
284 vec.push(value);
285 Ok(())
286 }
287
288 fn end(self) -> Result<Self::Ok, Self::Error> {
289 let Self(vec) = self;
290 Ok(Value::Seq(vec))
291 }
292}
293
294struct SerializeTuple(Vec<Value>);
295
296impl ser::SerializeTuple for SerializeTuple {
297 type Ok = Value;
298 type Error = SerializerError;
299
300 fn serialize_element<T: ?Sized + ser::Serialize>(
301 &mut self,
302 value: &T,
303 ) -> Result<(), Self::Error> {
304 let value = value.serialize(Serializer)?;
305 let Self(vec) = self;
306 vec.push(value);
307 Ok(())
308 }
309
310 fn end(self) -> Result<Self::Ok, Self::Error> {
311 let Self(vec) = self;
312 Ok(Value::Seq(vec))
313 }
314}
315
316struct SerializeTupleStruct(Vec<Value>);
317
318impl ser::SerializeTupleStruct for SerializeTupleStruct {
319 type Ok = Value;
320 type Error = SerializerError;
321
322 fn serialize_field<T: ?Sized + ser::Serialize>(
323 &mut self,
324 value: &T,
325 ) -> Result<(), Self::Error> {
326 let value = value.serialize(Serializer)?;
327 let Self(vec) = self;
328 vec.push(value);
329 Ok(())
330 }
331
332 fn end(self) -> Result<Self::Ok, Self::Error> {
333 let Self(vec) = self;
334 Ok(Value::Seq(vec))
335 }
336}
337
338struct SerializeTupleVariant(Value, Vec<Value>);
339
340impl ser::SerializeTupleVariant for SerializeTupleVariant {
341 type Ok = Value;
342 type Error = SerializerError;
343
344 fn serialize_field<T: ?Sized + ser::Serialize>(
345 &mut self,
346 value: &T,
347 ) -> Result<(), Self::Error> {
348 let value = value.serialize(Serializer)?;
349 self.1.push(value);
350 Ok(())
351 }
352
353 fn end(self) -> Result<Self::Ok, Self::Error> {
354 let mut map = BTreeMap::new();
355 let Self(key, value) = self;
356 map.insert(key, Value::Seq(value));
357 Ok(Value::Map(map))
358 }
359}
360
361struct SerializeMap {
362 map: BTreeMap<Value, Value>,
363 key: Option<Value>,
364}
365
366impl ser::SerializeMap for SerializeMap {
367 type Ok = Value;
368 type Error = SerializerError;
369
370 fn serialize_key<T: ?Sized + ser::Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
371 let key = key.serialize(Serializer)?;
372 self.key = Some(key);
373 Ok(())
374 }
375
376 fn serialize_value<T: ?Sized + ser::Serialize>(
377 &mut self,
378 value: &T,
379 ) -> Result<(), Self::Error> {
380 let value = value.serialize(Serializer)?;
381 self.map.insert(self.key.take().unwrap(), value);
382 Ok(())
383 }
384
385 fn end(self) -> Result<Self::Ok, Self::Error> {
386 Ok(Value::Map(self.map))
387 }
388}
389
390struct SerializeStruct(BTreeMap<Value, Value>);
391
392impl ser::SerializeStruct for SerializeStruct {
393 type Ok = Value;
394 type Error = SerializerError;
395
396 fn serialize_field<T: ?Sized + ser::Serialize>(
397 &mut self,
398 key: &'static str,
399 value: &T,
400 ) -> Result<(), Self::Error> {
401 let key = Value::String(key.to_string());
402 let value = value.serialize(Serializer)?;
403 let Self(map) = self;
404 map.insert(key, value);
405 Ok(())
406 }
407
408 fn end(self) -> Result<Self::Ok, Self::Error> {
409 let Self(map) = self;
410 Ok(Value::Map(map))
411 }
412}
413
414struct SerializeStructVariant(Value, BTreeMap<Value, Value>);
415
416impl ser::SerializeStructVariant for SerializeStructVariant {
417 type Ok = Value;
418 type Error = SerializerError;
419
420 fn serialize_field<T: ?Sized + ser::Serialize>(
421 &mut self,
422 key: &'static str,
423 value: &T,
424 ) -> Result<(), Self::Error> {
425 let key = Value::String(key.to_string());
426 let value = value.serialize(Serializer)?;
427 self.1.insert(key, value);
428 Ok(())
429 }
430
431 fn end(self) -> Result<Self::Ok, Self::Error> {
432 let mut map = BTreeMap::new();
433 let Self(key, value) = self;
434 map.insert(key, Value::Map(value));
435 Ok(Value::Map(map))
436 }
437}