1use crate::Value;
2use cu29_clock::CuDuration;
3use serde::{de, forward_to_deserialize_any};
4use std::collections::BTreeMap;
5use std::error::Error;
6use std::fmt;
7use std::marker::PhantomData;
8
9#[derive(Debug)]
10pub enum Unexpected {
11 Bool(bool),
12 Unsigned(u64),
13 Signed(i64),
14 Float(f64),
15 Char(char),
16 Str(String),
17 Bytes(Vec<u8>),
18 Unit,
19 Option,
20 NewtypeStruct,
21 Seq,
22 Map,
23 Enum,
24 UnitVariant,
25 NewtypeVariant,
26 TupleVariant,
27 StructVariant,
28 Other(String),
29}
30
31impl From<de::Unexpected<'_>> for Unexpected {
32 fn from(unexp: de::Unexpected) -> Unexpected {
33 match unexp {
34 de::Unexpected::Bool(v) => Unexpected::Bool(v),
35 de::Unexpected::Unsigned(v) => Unexpected::Unsigned(v),
36 de::Unexpected::Signed(v) => Unexpected::Signed(v),
37 de::Unexpected::Float(v) => Unexpected::Float(v),
38 de::Unexpected::Char(v) => Unexpected::Char(v),
39 de::Unexpected::Str(v) => Unexpected::Str(v.to_owned()),
40 de::Unexpected::Bytes(v) => Unexpected::Bytes(v.to_owned()),
41 de::Unexpected::Unit => Unexpected::Unit,
42 de::Unexpected::Option => Unexpected::Option,
43 de::Unexpected::NewtypeStruct => Unexpected::NewtypeStruct,
44 de::Unexpected::Seq => Unexpected::Seq,
45 de::Unexpected::Map => Unexpected::Map,
46 de::Unexpected::Enum => Unexpected::Enum,
47 de::Unexpected::UnitVariant => Unexpected::UnitVariant,
48 de::Unexpected::NewtypeVariant => Unexpected::NewtypeVariant,
49 de::Unexpected::TupleVariant => Unexpected::TupleVariant,
50 de::Unexpected::StructVariant => Unexpected::StructVariant,
51 de::Unexpected::Other(v) => Unexpected::Other(v.to_owned()),
52 }
53 }
54}
55
56impl Unexpected {
57 pub fn to_unexpected(&self) -> de::Unexpected<'_> {
58 match *self {
59 Unexpected::Bool(v) => de::Unexpected::Bool(v),
60 Unexpected::Unsigned(v) => de::Unexpected::Unsigned(v),
61 Unexpected::Signed(v) => de::Unexpected::Signed(v),
62 Unexpected::Float(v) => de::Unexpected::Float(v),
63 Unexpected::Char(v) => de::Unexpected::Char(v),
64 Unexpected::Str(ref v) => de::Unexpected::Str(v),
65 Unexpected::Bytes(ref v) => de::Unexpected::Bytes(v),
66 Unexpected::Unit => de::Unexpected::Unit,
67 Unexpected::Option => de::Unexpected::Option,
68 Unexpected::NewtypeStruct => de::Unexpected::NewtypeStruct,
69 Unexpected::Seq => de::Unexpected::Seq,
70 Unexpected::Map => de::Unexpected::Map,
71 Unexpected::Enum => de::Unexpected::Enum,
72 Unexpected::UnitVariant => de::Unexpected::UnitVariant,
73 Unexpected::NewtypeVariant => de::Unexpected::NewtypeVariant,
74 Unexpected::TupleVariant => de::Unexpected::TupleVariant,
75 Unexpected::StructVariant => de::Unexpected::StructVariant,
76 Unexpected::Other(ref v) => de::Unexpected::Other(v),
77 }
78 }
79}
80
81#[derive(Debug)]
82pub enum DeserializerError {
83 Custom(String),
84 InvalidType(Unexpected, String),
85 InvalidValue(Unexpected, String),
86 InvalidLength(usize, String),
87 UnknownVariant(String, &'static [&'static str]),
88 UnknownField(String, &'static [&'static str]),
89 MissingField(&'static str),
90 DuplicateField(&'static str),
91}
92
93impl de::Error for DeserializerError {
94 fn custom<T: fmt::Display>(msg: T) -> Self {
95 DeserializerError::Custom(msg.to_string())
96 }
97
98 fn invalid_type(unexp: de::Unexpected, exp: &dyn de::Expected) -> Self {
99 DeserializerError::InvalidType(unexp.into(), exp.to_string())
100 }
101
102 fn invalid_value(unexp: de::Unexpected, exp: &dyn de::Expected) -> Self {
103 DeserializerError::InvalidValue(unexp.into(), exp.to_string())
104 }
105
106 fn invalid_length(len: usize, exp: &dyn de::Expected) -> Self {
107 DeserializerError::InvalidLength(len, exp.to_string())
108 }
109
110 fn unknown_variant(field: &str, expected: &'static [&'static str]) -> Self {
111 DeserializerError::UnknownVariant(field.into(), expected)
112 }
113
114 fn unknown_field(field: &str, expected: &'static [&'static str]) -> Self {
115 DeserializerError::UnknownField(field.into(), expected)
116 }
117
118 fn missing_field(field: &'static str) -> Self {
119 DeserializerError::MissingField(field)
120 }
121
122 fn duplicate_field(field: &'static str) -> Self {
123 DeserializerError::DuplicateField(field)
124 }
125}
126
127impl DeserializerError {
128 pub fn to_error<E: de::Error>(&self) -> E {
129 match *self {
130 DeserializerError::Custom(ref msg) => E::custom(msg.clone()),
131 DeserializerError::InvalidType(ref unexp, ref exp) => {
132 E::invalid_type(unexp.to_unexpected(), &&**exp)
133 }
134 DeserializerError::InvalidValue(ref unexp, ref exp) => {
135 E::invalid_value(unexp.to_unexpected(), &&**exp)
136 }
137 DeserializerError::InvalidLength(len, ref exp) => E::invalid_length(len, &&**exp),
138 DeserializerError::UnknownVariant(ref field, exp) => E::unknown_variant(field, exp),
139 DeserializerError::UnknownField(ref field, exp) => E::unknown_field(field, exp),
140 DeserializerError::MissingField(field) => E::missing_field(field),
141 DeserializerError::DuplicateField(field) => E::missing_field(field),
142 }
143 }
144
145 pub fn into_error<E: de::Error>(self) -> E {
146 self.to_error()
147 }
148}
149
150impl Error for DeserializerError {
151 fn description(&self) -> &str {
152 "Value deserializer error"
153 }
154}
155
156impl fmt::Display for DeserializerError {
157 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
158 match *self {
159 DeserializerError::Custom(ref msg) => write!(f, "{}", msg),
160 DeserializerError::InvalidType(ref unexp, ref exp) => {
161 write!(
162 f,
163 "Invalid type {}. Expected {}",
164 unexp.to_unexpected(),
165 exp
166 )
167 }
168 DeserializerError::InvalidValue(ref unexp, ref exp) => {
169 write!(
170 f,
171 "Invalid value {}. Expected {}",
172 unexp.to_unexpected(),
173 exp
174 )
175 }
176 DeserializerError::InvalidLength(len, ref exp) => {
177 write!(f, "Invalid length {}. Expected {}", len, exp)
178 }
179 DeserializerError::UnknownVariant(ref field, exp) => {
180 write!(
181 f,
182 "Unknown variant {}. Expected one of {}",
183 field,
184 exp.join(", ")
185 )
186 }
187 DeserializerError::UnknownField(ref field, exp) => {
188 write!(
189 f,
190 "Unknown field {}. Expected one of {}",
191 field,
192 exp.join(", ")
193 )
194 }
195 DeserializerError::MissingField(field) => write!(f, "Missing field {}", field),
196 DeserializerError::DuplicateField(field) => write!(f, "Duplicate field {}", field),
197 }
198 }
199}
200
201impl From<de::value::Error> for DeserializerError {
202 fn from(e: de::value::Error) -> DeserializerError {
203 DeserializerError::Custom(e.to_string())
204 }
205}
206
207pub struct ValueVisitor;
208
209impl<'de> de::Visitor<'de> for ValueVisitor {
210 type Value = Value;
211
212 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
213 fmt.write_str("any value")
214 }
215
216 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
217 Ok(Value::Bool(value))
218 }
219
220 fn visit_i8<E>(self, value: i8) -> Result<Value, E> {
221 Ok(Value::I8(value))
222 }
223
224 fn visit_i16<E>(self, value: i16) -> Result<Value, E> {
225 Ok(Value::I16(value))
226 }
227
228 fn visit_i32<E>(self, value: i32) -> Result<Value, E> {
229 Ok(Value::I32(value))
230 }
231
232 fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
233 Ok(Value::I64(value))
234 }
235
236 fn visit_u8<E>(self, value: u8) -> Result<Value, E> {
237 Ok(Value::U8(value))
238 }
239
240 fn visit_u16<E>(self, value: u16) -> Result<Value, E> {
241 Ok(Value::U16(value))
242 }
243
244 fn visit_u32<E>(self, value: u32) -> Result<Value, E> {
245 Ok(Value::U32(value))
246 }
247
248 fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
249 Ok(Value::U64(value))
250 }
251
252 fn visit_f32<E>(self, value: f32) -> Result<Value, E> {
253 Ok(Value::F32(value))
254 }
255
256 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
257 Ok(Value::F64(value))
258 }
259
260 fn visit_char<E>(self, value: char) -> Result<Value, E> {
261 Ok(Value::Char(value))
262 }
263
264 fn visit_str<E>(self, value: &str) -> Result<Value, E> {
265 Ok(Value::String(value.into()))
266 }
267
268 fn visit_string<E>(self, value: String) -> Result<Value, E> {
269 Ok(Value::String(value))
270 }
271
272 fn visit_unit<E>(self) -> Result<Value, E> {
273 Ok(Value::Unit)
274 }
275
276 fn visit_none<E>(self) -> Result<Value, E> {
277 Ok(Value::Option(None))
278 }
279
280 fn visit_some<D: de::Deserializer<'de>>(self, d: D) -> Result<Value, D::Error> {
281 d.deserialize_any(ValueVisitor)
282 .map(|v| Value::Option(Some(Box::new(v))))
283 }
284
285 fn visit_newtype_struct<D: de::Deserializer<'de>>(self, d: D) -> Result<Value, D::Error> {
286 d.deserialize_any(ValueVisitor)
287 .map(|v| Value::Newtype(Box::new(v)))
288 }
289
290 fn visit_seq<V: de::SeqAccess<'de>>(self, mut visitor: V) -> Result<Value, V::Error> {
291 let mut values = Vec::new();
292 while let Some(elem) = visitor.next_element()? {
293 values.push(elem);
294 }
295 Ok(Value::Seq(values))
296 }
297
298 fn visit_map<V: de::MapAccess<'de>>(self, mut visitor: V) -> Result<Value, V::Error> {
299 let mut values = BTreeMap::new();
300 while let Some((key, value)) = visitor.next_entry()? {
301 values.insert(key, value);
302 }
303 Ok(Value::Map(values))
304 }
305
306 fn visit_bytes<E>(self, v: &[u8]) -> Result<Value, E> {
307 Ok(Value::Bytes(v.into()))
308 }
309
310 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Value, E> {
311 Ok(Value::Bytes(v))
312 }
313}
314
315impl<'de> de::Deserialize<'de> for Value {
316 fn deserialize<D: de::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
317 d.deserialize_any(ValueVisitor)
318 }
319}
320
321impl de::IntoDeserializer<'_, DeserializerError> for Value {
322 type Deserializer = Value;
323
324 fn into_deserializer(self) -> Value {
325 self
326 }
327}
328
329pub struct ValueDeserializer<E> {
330 value: Value,
331 error: PhantomData<fn() -> E>,
332}
333
334impl<E> ValueDeserializer<E> {
335 pub fn new(value: Value) -> Self {
336 ValueDeserializer {
337 value,
338 error: Default::default(),
339 }
340 }
341
342 pub fn into_value(self) -> Value {
343 self.value
344 }
345}
346
347impl<'de, E> de::Deserializer<'de> for ValueDeserializer<E>
348where
349 E: de::Error,
350{
351 type Error = E;
352
353 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
354 match self.value {
355 Value::Bool(v) => visitor.visit_bool(v),
356 Value::U8(v) => visitor.visit_u8(v),
357 Value::U16(v) => visitor.visit_u16(v),
358 Value::U32(v) => visitor.visit_u32(v),
359 Value::U64(v) => visitor.visit_u64(v),
360 Value::I8(v) => visitor.visit_i8(v),
361 Value::I16(v) => visitor.visit_i16(v),
362 Value::I32(v) => visitor.visit_i32(v),
363 Value::I64(v) => visitor.visit_i64(v),
364 Value::F32(v) => visitor.visit_f32(v),
365 Value::F64(v) => visitor.visit_f64(v),
366 Value::Char(v) => visitor.visit_char(v),
367 Value::String(v) => visitor.visit_string(v),
368 Value::Unit => visitor.visit_unit(),
369 Value::Option(None) => visitor.visit_none(),
370 Value::Option(Some(v)) => visitor.visit_some(ValueDeserializer::new(*v)),
371 Value::Newtype(v) => visitor.visit_newtype_struct(ValueDeserializer::new(*v)),
372 Value::Seq(v) => visitor.visit_seq(de::value::SeqDeserializer::new(
373 v.into_iter().map(ValueDeserializer::new),
374 )),
375 Value::Map(v) => visitor
376 .visit_map(de::value::MapDeserializer::new(v.into_iter().map(
377 |(k, v)| (ValueDeserializer::new(k), ValueDeserializer::new(v)),
378 ))),
379 Value::Bytes(v) => visitor.visit_byte_buf(v),
380 Value::CuTime(v) => {
381 let CuDuration(nanos) = v;
382 visitor.visit_u64(nanos)
383 }
384 }
385 }
386
387 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
388 match self.value {
389 Value::Option(..) => self.deserialize_any(visitor),
390 Value::Unit => visitor.visit_unit(),
391 _ => visitor.visit_some(self),
392 }
393 }
394
395 fn deserialize_enum<V: de::Visitor<'de>>(
396 self,
397 _name: &'static str,
398 _variants: &'static [&'static str],
399 visitor: V,
400 ) -> Result<V::Value, Self::Error> {
401 let (variant, value) = match self.value {
402 Value::Map(value) => {
403 let mut iter = value.into_iter();
404 let (variant, value) = match iter.next() {
405 Some(v) => v,
406 None => {
407 return Err(de::Error::invalid_value(
408 de::Unexpected::Map,
409 &"map with a single key",
410 ));
411 }
412 };
413 if iter.next().is_some() {
415 return Err(de::Error::invalid_value(
416 de::Unexpected::Map,
417 &"map with a single key",
418 ));
419 }
420 (variant, Some(value))
421 }
422 Value::String(variant) => (Value::String(variant), None),
423 other => {
424 return Err(de::Error::invalid_type(
425 other.unexpected(),
426 &"string or map",
427 ));
428 }
429 };
430
431 let d = EnumDeserializer {
432 variant,
433 value,
434 error: Default::default(),
435 };
436 visitor.visit_enum(d)
437 }
438
439 fn deserialize_newtype_struct<V: de::Visitor<'de>>(
440 self,
441 _name: &'static str,
442 visitor: V,
443 ) -> Result<V::Value, Self::Error> {
444 match self.value {
445 Value::Newtype(v) => visitor.visit_newtype_struct(ValueDeserializer::new(*v)),
446 _ => visitor.visit_newtype_struct(self),
447 }
448 }
449
450 forward_to_deserialize_any! {
451 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit
452 seq bytes byte_buf map unit_struct
453 tuple_struct struct tuple ignored_any identifier
454 }
455}
456
457impl<E> de::IntoDeserializer<'_, E> for ValueDeserializer<E>
458where
459 E: de::Error,
460{
461 type Deserializer = Self;
462
463 fn into_deserializer(self) -> Self::Deserializer {
464 self
465 }
466}
467
468impl<'de> de::Deserializer<'de> for Value {
469 type Error = DeserializerError;
470
471 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
472 ValueDeserializer::new(self).deserialize_any(visitor)
473 }
474
475 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
476 ValueDeserializer::new(self).deserialize_option(visitor)
477 }
478
479 fn deserialize_enum<V: de::Visitor<'de>>(
480 self,
481 name: &'static str,
482 variants: &'static [&'static str],
483 visitor: V,
484 ) -> Result<V::Value, Self::Error> {
485 ValueDeserializer::new(self).deserialize_enum(name, variants, visitor)
486 }
487
488 fn deserialize_newtype_struct<V: de::Visitor<'de>>(
489 self,
490 name: &'static str,
491 visitor: V,
492 ) -> Result<V::Value, Self::Error> {
493 ValueDeserializer::new(self).deserialize_newtype_struct(name, visitor)
494 }
495
496 forward_to_deserialize_any! {
497 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit
498 seq bytes byte_buf map unit_struct
499 tuple_struct struct tuple ignored_any identifier
500 }
501}
502
503struct EnumDeserializer<E> {
504 variant: Value,
505 value: Option<Value>,
506 error: PhantomData<fn() -> E>,
507}
508
509impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<E>
510where
511 E: de::Error,
512{
513 type Error = E;
514 type Variant = VariantDeserializer<Self::Error>;
515
516 fn variant_seed<V>(
517 self,
518 seed: V,
519 ) -> Result<(V::Value, VariantDeserializer<Self::Error>), Self::Error>
520 where
521 V: de::DeserializeSeed<'de>,
522 {
523 let visitor = VariantDeserializer {
524 value: self.value,
525 error: Default::default(),
526 };
527 seed.deserialize(ValueDeserializer::new(self.variant))
528 .map(|v| (v, visitor))
529 }
530}
531
532struct VariantDeserializer<E> {
533 value: Option<Value>,
534 error: PhantomData<fn() -> E>,
535}
536
537impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<E>
538where
539 E: de::Error,
540{
541 type Error = E;
542
543 fn unit_variant(self) -> Result<(), Self::Error> {
544 match self.value {
545 Some(value) => de::Deserialize::deserialize(ValueDeserializer::new(value)),
546 None => Ok(()),
547 }
548 }
549
550 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
551 where
552 T: de::DeserializeSeed<'de>,
553 {
554 match self.value {
555 Some(value) => seed.deserialize(ValueDeserializer::new(value)),
556 None => Err(de::Error::invalid_type(
557 de::Unexpected::UnitVariant,
558 &"newtype variant",
559 )),
560 }
561 }
562
563 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
564 where
565 V: de::Visitor<'de>,
566 {
567 match self.value {
568 Some(Value::Seq(v)) => de::Deserializer::deserialize_any(
569 de::value::SeqDeserializer::new(v.into_iter().map(ValueDeserializer::new)),
570 visitor,
571 ),
572 Some(other) => Err(de::Error::invalid_type(
573 other.unexpected(),
574 &"tuple variant",
575 )),
576 None => Err(de::Error::invalid_type(
577 de::Unexpected::UnitVariant,
578 &"tuple variant",
579 )),
580 }
581 }
582
583 fn struct_variant<V>(
584 self,
585 _fields: &'static [&'static str],
586 visitor: V,
587 ) -> Result<V::Value, Self::Error>
588 where
589 V: de::Visitor<'de>,
590 {
591 match self.value {
592 Some(Value::Map(v)) => de::Deserializer::deserialize_any(
593 de::value::MapDeserializer::new(
594 v.into_iter()
595 .map(|(k, v)| (ValueDeserializer::new(k), ValueDeserializer::new(v))),
596 ),
597 visitor,
598 ),
599 Some(other) => Err(de::Error::invalid_type(
600 other.unexpected(),
601 &"struct variant",
602 )),
603 None => Err(de::Error::invalid_type(
604 de::Unexpected::UnitVariant,
605 &"struct variant",
606 )),
607 }
608 }
609}