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