cu29_value/
ser.rs

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