1pub mod assistant;
2pub mod serializer;
3
4use {
5 assistant::{EnumAssistant, Seed, VariantKind},
6 serde::{
7 de::{self, Deserializer as _, IntoDeserializer as _, VariantAccess as _},
8 forward_to_deserialize_any,
9 ser::{
10 self, SerializeMap as _, SerializeStruct as _, SerializeStructVariant as _,
11 SerializeTuple as _, SerializeTupleStruct as _, SerializeTupleVariant as _,
12 },
13 serde_if_integer128,
14 },
15 std::{borrow::Cow, marker::PhantomData},
16 try_match::try_match,
17 wyz::pipe::Pipe as _,
18};
19
20#[derive(Debug)]
43pub enum Object<'a> {
44 Bool(bool),
45
46 I8(i8),
47 I16(i16),
48 I32(i32),
49 I64(i64),
50 I128(i128),
51
52 U8(u8),
53 U16(u16),
54 U32(u32),
55 U64(u64),
56 U128(u128),
57
58 F32(f32),
59 F64(f64),
60
61 Char(char),
62
63 String(Cow<'a, str>),
64
65 ByteArray(Cow<'a, [u8]>),
66
67 Option(Option<Box<Object<'a>>>),
68
69 Unit,
70
71 UnitStruct {
72 name: Cow<'a, str>,
73 },
74
75 UnitVariant {
76 name: Cow<'a, str>,
77 variant: Box<Object<'a>>,
78 },
79
80 NewtypeStruct {
81 name: Cow<'a, str>,
82 value: Box<Object<'a>>,
83 },
84
85 NewtypeVariant {
86 name: Cow<'a, str>,
87 variant: Box<Object<'a>>,
88 value: Box<Object<'a>>,
89 },
90
91 Seq(Vec<Object<'a>>),
92
93 Tuple(Vec<Object<'a>>),
94
95 TupleStruct {
96 name: Cow<'a, str>,
97 fields: Vec<Object<'a>>,
98 },
99
100 TupleVariant {
101 name: Cow<'a, str>,
102 variant: Box<Object<'a>>,
103 fields: Box<Object<'a>>,
104 },
105
106 Map(Vec<(Object<'a>, Object<'a>)>),
109
110 Struct {
113 name: Cow<'a, str>,
114 fields: Vec<(Cow<'a, str>, Option<Object<'a>>)>,
115 },
116
117 StructVariant {
120 name: Cow<'a, str>,
121 variant: Box<Object<'a>>,
122 fields: Box<Object<'a>>,
123 },
124
125 DualVariantKey {
128 index: u32,
129 name: Cow<'a, str>,
130 },
131
132 FieldMap(Vec<(Object<'a>, Option<Object<'a>>)>),
135}
136
137impl<'a> Object<'a> {
138 pub fn into_owned(self) -> Object<'static> {
139 match self {
140 Object::Bool(bool) => Object::Bool(bool),
141
142 Object::I8(i8) => Object::I8(i8),
143 Object::I16(i16) => Object::I16(i16),
144 Object::I32(i32) => Object::I32(i32),
145 Object::I64(i64) => Object::I64(i64),
146 Object::I128(i128) => Object::I128(i128),
147
148 Object::U8(u8) => Object::U8(u8),
149 Object::U16(u16) => Object::U16(u16),
150 Object::U32(u32) => Object::U32(u32),
151 Object::U64(u64) => Object::U64(u64),
152 Object::U128(u128) => Object::U128(u128),
153
154 Object::F32(f32) => Object::F32(f32),
155 Object::F64(f64) => Object::F64(f64),
156
157 Object::Char(char) => Object::Char(char),
158
159 Object::String(string) => Object::String(string.into_owned().into()),
160
161 Object::ByteArray(bytes) => Object::ByteArray(bytes.into_owned().into()),
162
163 Object::Option(option) => Object::Option(option.map(|b| b.into_owned().into())),
164
165 Object::Unit => Object::Unit,
166
167 Object::UnitStruct { name } => Object::UnitStruct {
168 name: name.into_owned().into(),
169 },
170
171 Object::UnitVariant { name, variant } => Object::UnitVariant {
172 name: name.into_owned().into(),
173 variant: variant.into_owned().into(),
174 },
175
176 Object::NewtypeStruct { name, value } => Object::NewtypeStruct {
177 name: name.into_owned().into(),
178 value: value.into_owned().into(),
179 },
180 Object::NewtypeVariant {
181 name,
182 variant,
183 value,
184 } => Object::NewtypeVariant {
185 name: name.into_owned().into(),
186 variant: variant.into_owned().into(),
187 value: value.into_owned().into(),
188 },
189
190 Object::Seq(elements) => {
191 Object::Seq(elements.into_iter().map(Object::into_owned).collect())
192 }
193
194 Object::Tuple(fields) => {
195 Object::Seq(fields.into_iter().map(Object::into_owned).collect())
196 }
197
198 Object::TupleStruct { name, fields } => Object::TupleStruct {
199 name: name.into_owned().into(),
200 fields: fields.into_iter().map(Object::into_owned).collect(),
201 },
202
203 Object::TupleVariant {
204 name,
205 variant,
206 fields,
207 } => Object::TupleVariant {
208 name: name.into_owned().into(),
209 variant: variant.into_owned().into(),
210 fields: fields.into_owned().into(),
211 },
212
213 Object::Map(fields) => Object::Map(
214 fields
215 .into_iter()
216 .map(|(k, v)| (k.into_owned(), v.into_owned()))
217 .collect(),
218 ),
219
220 Object::Struct { name, fields } => Object::Struct {
221 name: name.into_owned().into(),
222 fields: fields
223 .into_iter()
224 .map(|(k, v)| (k.into_owned().into(), v.map(Object::into_owned)))
225 .collect(),
226 },
227
228 Object::StructVariant {
229 name,
230 variant,
231 fields,
232 } => Object::StructVariant {
233 name: name.into_owned().into(),
234 variant: variant.into_owned().into(),
235 fields: fields.into_owned().into(),
236 },
237
238 Object::DualVariantKey { index, name } => Object::DualVariantKey {
239 index,
240 name: name.into_owned().into(),
241 },
242
243 Object::FieldMap(fields) => Object::FieldMap(
244 fields
245 .into_iter()
246 .map(|(k, v)| (k.into_owned(), v.map(Object::into_owned)))
247 .collect(),
248 ),
249 }
250 }
251}
252
253impl<'a> ser::Serialize for Object<'a> {
254 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
255 where
256 S: ser::Serializer,
257 {
258 match self {
259 Object::Bool(bool) => serializer.serialize_bool(*bool),
260
261 Object::I8(i8) => serializer.serialize_i8(*i8),
262 Object::I16(i16) => serializer.serialize_i16(*i16),
263 Object::I32(i32) => serializer.serialize_i32(*i32),
264 Object::I64(i64) => serializer.serialize_i64(*i64),
265 Object::I128(i128) => serializer.serialize_i128(*i128),
266
267 Object::U8(u8) => serializer.serialize_u8(*u8),
268 Object::U16(u16) => serializer.serialize_u16(*u16),
269 Object::U32(u32) => serializer.serialize_u32(*u32),
270 Object::U64(u64) => serializer.serialize_u64(*u64),
271 Object::U128(u128) => serializer.serialize_u128(*u128),
272
273 Object::F32(f32) => serializer.serialize_f32(*f32),
274 Object::F64(f64) => serializer.serialize_f64(*f64),
275
276 Object::Char(char) => serializer.serialize_char(*char),
277
278 Object::String(cow) => serializer.serialize_str(cow),
279
280 Object::ByteArray(cow) => serializer.serialize_bytes(cow),
281
282 Object::Option(option) => match option {
283 Some(object) => serializer.serialize_some(object),
284 None => serializer.serialize_none(),
285 },
286
287 Object::Unit => serializer.serialize_unit(),
288
289 Object::UnitStruct { name } => serializer.serialize_unit_struct(leak_str(name)),
290
291 Object::UnitVariant { name, variant } => serializer.serialize_unit_variant(
292 leak_str(name),
293 make_variant_index(variant),
294 make_variant_name(variant)?,
295 ),
296
297 Object::NewtypeStruct { name, value } => {
298 serializer.serialize_newtype_struct(leak_str(name), value)
299 }
300
301 Object::NewtypeVariant {
302 name,
303 variant,
304 value,
305 } => serializer.serialize_newtype_variant(
306 leak_str(name),
307 make_variant_index(variant),
308 make_variant_name(variant)?,
309 value,
310 ),
311
312 Object::Seq(vec) => serializer.collect_seq(vec.iter()),
313
314 Object::Tuple(vec) => {
315 let mut serializer = serializer.serialize_tuple(vec.len())?;
316 for element in vec {
317 serializer.serialize_element(element)?
318 }
319 serializer.end()
320 }
321
322 Object::TupleStruct { name, fields } => {
323 let mut serializer =
324 serializer.serialize_tuple_struct(leak_str(name), fields.len())?;
325 for field in fields {
326 serializer.serialize_field(field)?
327 }
328 serializer.end()
329 }
330
331 Object::TupleVariant {
332 name,
333 variant,
334 fields,
335 } => {
336 let mut serializer = serializer.serialize_tuple_variant(
337 leak_str(name),
338 make_variant_index(variant),
339 make_variant_name(variant)?,
340 match Box::as_ref(fields) {
341 Object::String(cow) => cow.as_ref().len(),
342 Object::ByteArray(cow) => cow.as_ref().len(),
343 Object::Seq(vec) | Object::Tuple(vec) => vec.len(),
344 Object::Map(vec) => vec.len(),
345 _ => return Err(ser::Error::custom("Tried to serialise a tuple variant, but couldn't figure out the field count."))
346 },
347 )?;
348
349 match Box::as_ref(fields) {
350 Object::String(cow) => {
351 for value in cow.chars() {
352 serializer.serialize_field(&value)?
353 }
354 }
355 Object::ByteArray(cow) => {
356 for value in cow.iter() {
357 serializer.serialize_field(value)?
358 }
359 }
360 Object::Seq(vec) | Object::Tuple(vec) => {
361 for value in vec.iter() {
362 serializer.serialize_field(value)?
363 }
364 }
365 Object::Map(vec) => {
366 for value in vec.iter() {
367 serializer.serialize_field(value)?
368 }
369 }
370 _ => unreachable!(),
371 }
372 serializer.end()
373 }
374
375 Object::Map(pairs) => {
376 let mut serialize_map = serializer.serialize_map(pairs.len().into())?;
377 for (k, v) in pairs {
378 serialize_map.serialize_entry(k, v)?
379 }
380 serialize_map.end()
381 }
382
383 Object::Struct { name, fields } => {
384 let mut serializer = serializer.serialize_struct(leak_str(name), fields.len())?;
385 for (key, value) in fields {
386 if let Some(value) = value.as_ref() {
387 serializer.serialize_field(leak_str(key), value)?
388 } else {
389 serializer.skip_field(leak_str(key))?
390 }
391 }
392 serializer.end()
393 }
394
395 Object::StructVariant {
396 name,
397 variant,
398 fields,
399 } => {
400 let mut serializer = serializer.serialize_struct_variant(
401 leak_str(name),
402 make_variant_index(variant),
403 make_variant_name(variant)?,
404 match Box::as_ref(fields) {
405 Object::String(cow) => cow.as_ref().len(),
406 Object::ByteArray(cow) => cow.as_ref().len(),
407 Object::Seq(vec) | Object::Tuple(vec) => vec.len(),
408 Object::Map(vec) => vec.len(),
409 Object::FieldMap(vec) => vec.len(),
410 _ => return Err(ser::Error::custom("Tried to serialise a struct variant, but couldn't figure out the field count."))
411 },
412 )?;
413
414 match Box::as_ref(fields) {
415 Object::String(cow) => {
416 for (key, value) in cow.chars().enumerate() {
417 serializer
418 .serialize_field(leak_str(key.to_string().as_ref()), &value)?
419 }
420 }
421 Object::ByteArray(cow) => {
422 for (key, value) in cow.iter().enumerate() {
423 serializer.serialize_field(leak_str(key.to_string().as_ref()), value)?
424 }
425 }
426 Object::Seq(vec) | Object::Tuple(vec) => {
427 for (key, value) in vec.iter().enumerate() {
428 serializer.serialize_field(leak_str(key.to_string().as_ref()), value)?
429 }
430 }
431 Object::Map(vec) => {
432 for (key, value) in vec.iter() {
433 serializer.serialize_field(make_field_key(key)?, value)?
434 }
435 }
436 Object::FieldMap(vec) => {
437 for (key, value) in vec.iter() {
438 let key = make_field_key(key)?;
439 if let Some(value) = value {
440 serializer.serialize_field(key, value)?
441 } else {
442 serializer.skip_field(key)?
443 }
444 }
445 }
446 _ => unreachable!(),
447 }
448 serializer.end()
449 }
450
451 Object::DualVariantKey { index, name } => {
452 if serializer.is_human_readable() {
453 serializer.serialize_str(name)
454 } else {
455 serializer.serialize_u32(*index)
456 }
457 }
458
459 Object::FieldMap(map) => {
460 serializer.collect_map(map.iter().filter_map(|(k, v)| v.as_ref().map(|v| (k, v))))
461 }
462 }
463 }
464}
465
466fn make_variant_index<'a>(variant: impl AsRef<Object<'a>>) -> u32 {
467 match variant.as_ref() {
468 Object::U8(u8) => *u8 as u32,
469 Object::U16(u16) => *u16 as u32,
470 Object::U32(u32) => *u32,
471 _ => u32::MAX,
472 }
473}
474
475fn make_variant_name<'a, E: ser::Error>(
476 variant: impl AsRef<Object<'a>>,
477) -> Result<&'static str, E> {
478 leak_str(
479 match variant.as_ref() {
480 Object::Bool(bool) => bool.to_string(),
481 Object::I8(i8) => i8.to_string(),
482 Object::I16(i16) => i16.to_string(),
483 Object::I32(i32) => i32.to_string(),
484 Object::I64(i64) => i64.to_string(),
485 Object::I128(i128) => i128.to_string(),
486 Object::U8(u8) => u8.to_string(),
487 Object::U16(u16) => u16.to_string(),
488 Object::U32(u32) => u32.to_string(),
489 Object::U64(u64) => u64.to_string(),
490 Object::U128(u128) => u128.to_string(),
491 Object::F32(f32) => f32.to_string(),
492 Object::F64(f64) => f64.to_string(),
493 Object::Char(char) => char.to_string(),
494 Object::String(cow) => cow.to_string(),
495 Object::ByteArray(cow) => String::from_utf8_lossy(cow).to_string(),
496 _ => {
497 return Err(ser::Error::custom(
498 "Tried to serialise a variant, but couldn't make a name.",
499 ))
500 }
501 }
502 .as_ref(),
503 )
504 .pipe(Ok)
505}
506
507fn make_field_key<E: ser::Error>(variant: &Object) -> Result<&'static str, E> {
508 leak_str(
509 match variant {
510 Object::Bool(bool) => bool.to_string(),
511 Object::I8(i8) => i8.to_string(),
512 Object::I16(i16) => i16.to_string(),
513 Object::I32(i32) => i32.to_string(),
514 Object::I64(i64) => i64.to_string(),
515 Object::I128(i128) => i128.to_string(),
516 Object::U8(u8) => u8.to_string(),
517 Object::U16(u16) => u16.to_string(),
518 Object::U32(u32) => u32.to_string(),
519 Object::U64(u64) => u64.to_string(),
520 Object::U128(u128) => u128.to_string(),
521 Object::F32(f32) => f32.to_string(),
522 Object::F64(f64) => f64.to_string(),
523 Object::Char(char) => char.to_string(),
524 Object::String(cow) => cow.to_string(),
525 Object::ByteArray(cow) => String::from_utf8_lossy(cow).to_string(),
526 Object::DualVariantKey { index: _, name } => name.to_string(),
527 _ => {
528 return Err(ser::Error::custom(
529 "Tried to serialise a struct variant, but couldn't make a field key.",
530 ))
531 }
532 }
533 .as_ref(),
534 )
535 .pipe(Ok)
536}
537
538fn leak_str(str: &str) -> &'static str {
541 Box::leak(Box::new(str.to_string()))
542}
543
544impl<'de> de::Deserialize<'de> for Object<'de> {
545 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
546 where
547 D: de::Deserializer<'de>,
548 {
549 deserializer.deserialize_any(Visitor(NoEnumAssistant))
550 }
551}
552
553macro_rules! visit {
554 ($($visit_:ident$(+ $self:ident)?($($ty:ty$( | $($expr:expr$(, $question_mark:tt)*);+$(;)?)?)?) => $variant:ident$(($const:expr))? $(/ ::$Error:ident where T: $t_path:path)?),*$(,)?) => {
555 $(
556 fn $visit_<T>(self$(, v: $ty)?) -> Result<Self::Value, T$(::$Error)?>
557 where
558 T: $($t_path, T::Error: )?de::Error,
559 {
560 $(let $self = self;)?
561 Ok(Object::$variant
562 $(({let _: $ty; v$($(.pipe($expr)$($question_mark)*)+)?.into()}))?
564 $(($const))?
565 )
566 }
567 )*
568 };
569}
570
571#[derive(Clone)]
572struct Visitor<Assistant: EnumAssistant + Clone>(Assistant);
573impl<'de, Assistant: EnumAssistant + Clone> de::Visitor<'de> for Visitor<Assistant> {
574 type Value = Object<'de>;
575
576 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
577 write!(formatter, "just about anything")
578 }
579
580 visit! {
581 visit_bool(bool) => Bool,
582
583 visit_i8(i8) => I8,
584 visit_i16(i16) => I16,
585 visit_i32(i32) => I32,
586 visit_i64(i64) => I64,
587 visit_i128(i128) => I128,
588
589 visit_u8(u8) => U8,
590 visit_u16(u16) => U16,
591 visit_u32(u32) => U32,
592 visit_u64(u64) => U64,
593 visit_u128(u128) => U128,
594
595 visit_f32(f32) => F32,
596 visit_f64(f64) => F64,
597
598 visit_char(char) => Char,
599
600 visit_str(&str | str::to_owned) => String,
601 visit_borrowed_str(&'de str) => String,
602 visit_string(String) => String,
603
604 visit_bytes(&[u8] | <[u8]>::to_owned) => ByteArray,
605 visit_borrowed_bytes(&'de [u8]) => ByteArray,
606 visit_byte_buf(Vec<u8>) => ByteArray,
607
608 visit_none() => Option(None),
609 visit_some + self_(T | |d| d.deserialize_any(self_), ?; Box::new) => Option / ::Error where T: de::Deserializer<'de>,
610
611 visit_unit() => Unit,
612 }
613
614 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
615 where
616 D: de::Deserializer<'de>,
617 {
618 Ok(Object::NewtypeStruct {
619 name: "UNKNOWN".into(),
620 value: deserializer.deserialize_any(self)?.into(),
621 })
622 }
623
624 fn visit_seq<A>(self, access: A) -> Result<Self::Value, A::Error>
625 where
626 A: de::SeqAccess<'de>,
627 {
628 struct SeqAccessIterator<'de, Assistant: EnumAssistant + Clone, Access: de::SeqAccess<'de>> {
629 assistant: Assistant,
630 access: Access,
631 marker: PhantomData<&'de ()>,
632 }
633 impl<'de, Assistant: EnumAssistant + Clone, Access: de::SeqAccess<'de>> Iterator
634 for SeqAccessIterator<'de, Assistant, Access>
635 {
636 type Item = Result<Object<'de>, Access::Error>;
637 fn next(&mut self) -> Option<Self::Item> {
638 self.access
639 .next_element_seed(Seed(self.assistant.clone()))
640 .transpose()
641 }
642 fn size_hint(&self) -> (usize, Option<usize>) {
643 (self.access.size_hint().unwrap_or(0), None)
644 }
645 }
646
647 Ok(Object::Seq(
648 SeqAccessIterator {
649 assistant: self.0,
650 access,
651 marker: PhantomData,
652 }
653 .collect::<Result<_, _>>()?,
654 ))
655 }
656
657 fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
658 where
659 A: de::MapAccess<'de>,
660 {
661 struct MapAccessIterator<'de, Assistant: EnumAssistant + Clone, Access> {
662 assistant: Assistant,
663 access: Access,
664 marker: PhantomData<&'de ()>,
665 };
666 impl<'de, Assistant: EnumAssistant + Clone, Access: de::MapAccess<'de>> Iterator
667 for MapAccessIterator<'de, Assistant, Access>
668 {
669 type Item = Result<(Object<'de>, Object<'de>), Access::Error>;
670 fn next(&mut self) -> Option<Self::Item> {
671 self.access
672 .next_entry_seed(Seed(self.assistant.clone()), Seed(self.assistant.clone()))
673 .transpose()
674 }
675 fn size_hint(&self) -> (usize, Option<usize>) {
676 (self.access.size_hint().unwrap_or(0), None)
677 }
678 }
679
680 Ok(Object::Map(
681 MapAccessIterator {
682 assistant: self.0,
683 access,
684 marker: PhantomData,
685 }
686 .collect::<Result<_, _>>()?,
687 ))
688 }
689
690 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
691 where
692 A: de::EnumAccess<'de>,
693 {
694 let (variant, variant_access): (Object<'de>, _) =
696 data.variant_seed(Seed(self.0.clone()))?;
697
698 let name = Cow::Borrowed("UNKNOWN_ENUM");
699 let variant = Box::new(variant);
700
701 #[cfg(feature = "assistant-extra")]
707 let extra_hint = assistant::extra::enum_variant_hint();
708 #[cfg(not(feature = "assistant-extra"))]
709 let extra_hint = None;
710
711 match extra_hint.map_or_else(|| self.0.variant_hint(&variant), Ok)? {
713 VariantKind::Unit => variant_access
714 .unit_variant()
715 .map(|()| Object::UnitVariant { name, variant }),
716 VariantKind::Newtype => {
717 variant_access
718 .newtype_variant_seed(Seed(self.0))
719 .map(|value| Object::NewtypeVariant {
720 name,
721 variant,
722 value: Box::new(value),
723 })
724 }
725 VariantKind::Tuple(len) => {
726 variant_access
727 .tuple_variant(len, self)
728 .map(|fields| Object::TupleVariant {
729 name,
730 variant,
731 fields: Box::new(fields),
732 })
733 }
734 VariantKind::Struct(field_names) => {
735 let field_names = field_names
736 .iter()
737 .map(|name| name.as_ref().pipe(leak_str))
738 .collect::<Vec<_>>()
739 .pipe(leak_vec);
740 variant_access
741 .struct_variant(field_names, self)
742 .map(|fields| Object::StructVariant {
743 name,
744 variant,
745 fields: Box::new(fields),
746 })
747 }
748 }
749 }
750}
751
752fn leak_vec<T>(vec: Vec<T>) -> &'static [T] {
753 vec.pipe(Box::new).pipe(Box::leak)
754}
755
756impl<'de> de::IntoDeserializer<'de> for Object<'de> {
757 type Deserializer = Self;
758 fn into_deserializer(self) -> Self::Deserializer {
759 self
760 }
761}
762
763impl<'de> de::Deserializer<'de> for Object<'de> {
764 type Error = de::value::Error;
765 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
766 where
767 V: de::Visitor<'de>,
768 {
769 match self {
770 Object::Bool(bool) => visitor.visit_bool(bool),
771
772 Object::I8(i8) => visitor.visit_i8(i8),
773 Object::I16(i16) => visitor.visit_i16(i16),
774 Object::I32(i32) => visitor.visit_i32(i32),
775 Object::I64(i64) => visitor.visit_i64(i64),
776 Object::I128(i128) => visitor.visit_i128(i128),
777
778 Object::U8(u8) => visitor.visit_u8(u8),
779 Object::U16(u16) => visitor.visit_u16(u16),
780 Object::U32(u32) => visitor.visit_u32(u32),
781 Object::U64(u64) => visitor.visit_u64(u64),
782 Object::U128(u128) => visitor.visit_u128(u128),
783
784 Object::F32(f32) => visitor.visit_f32(f32),
785 Object::F64(f64) => visitor.visit_f64(f64),
786
787 Object::Char(char) => visitor.visit_char(char),
788 Object::String(cow) => match cow {
789 Cow::Borrowed(str) => visitor.visit_borrowed_str(str),
790 Cow::Owned(string) => visitor.visit_string(string),
791 },
792
793 Object::ByteArray(cow) => match cow {
794 Cow::Borrowed(slice) => visitor.visit_borrowed_bytes(slice),
795 Cow::Owned(vec) => visitor.visit_byte_buf(vec),
796 },
797
798 Object::Option(option) => match option {
799 Some(b) => visitor.visit_some(*b),
800 None => visitor.visit_none(),
801 },
802
803 Object::Unit => visitor.visit_unit(),
804
805 Object::UnitStruct { .. } => visitor.visit_unit(),
806 self_ @ Object::UnitVariant { .. } => visitor.visit_enum(EnumAccess(self_)),
807 Object::NewtypeStruct { name: _, value } => visitor.visit_newtype_struct(*value),
808 self_ @ Object::NewtypeVariant { .. } => visitor.visit_enum(EnumAccess(self_)),
809 Object::Seq(elements) => visitor.visit_seq(elements.into_deserializer()),
810 Object::Tuple(fields) => visitor.visit_seq(fields.into_deserializer()),
811 Object::TupleStruct { name: _, fields } => {
812 visitor.visit_seq(fields.into_deserializer())
813 }
814 self_ @ Object::TupleVariant { .. } => visitor.visit_enum(EnumAccess(self_)),
815 Object::Map(map) => visitor.visit_map(MapAccess::new(map)),
816 Object::Struct { name: _, fields } => visitor.visit_map(MapAccess::new(
817 fields
818 .into_iter()
819 .filter_map(|(k, v)| v.map(|v| (Object::String(k), v))),
820 )),
821 self_ @ Object::StructVariant { .. } => visitor.visit_enum(EnumAccess(self_)),
822
823 self_ @ Object::DualVariantKey { .. } => {
824 let is_human_readable = self_.is_human_readable();
825 let key = try_match!(Object::DualVariantKey { name, index } = self_).unwrap();
826 if is_human_readable {
827 visitor.visit_str(key.name.as_ref())
828 } else {
829 visitor.visit_u32(key.index)
830 }
831 }
832 Object::FieldMap(fields) => visitor.visit_map(MapAccess::new(
833 fields.into_iter().filter_map(|(k, v)| v.map(|v| (k, v))),
834 )),
835 }
836 }
837
838 forward_to_deserialize_any! {
839 bool i8 i16 i32 i64 u8 u16 u64 f32 f64 char
840 bytes byte_buf option unit unit_struct newtype_struct seq tuple
841 tuple_struct map struct enum identifier ignored_any
842 }
843
844 serde_if_integer128!(forward_to_deserialize_any! {
845 i128 u128
846 });
847
848 fn is_human_readable(&self) -> bool {
849 true
851 }
852
853 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
854 where
855 V: de::Visitor<'de>,
856 {
857 match self {
858 Object::DualVariantKey { index, .. } => visitor.visit_u32(index),
859 self_ => self_.deserialize_any(visitor),
860 }
861 }
862 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
863 where
864 V: de::Visitor<'de>,
865 {
866 match self {
867 Object::DualVariantKey { name, .. } => visitor.visit_str(name.as_ref()),
868 self_ => self_.deserialize_any(visitor),
869 }
870 }
871 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
872 where
873 V: de::Visitor<'de>,
874 {
875 match self {
876 Object::DualVariantKey { name, .. } => visitor.visit_string(name.to_string()),
877 self_ => self_.deserialize_any(visitor),
878 }
879 }
880}
881
882struct MapAccess<'de, I: Iterator<Item = (Object<'de>, Object<'de>)>> {
883 iter: I,
884 next_value: Option<Object<'de>>,
885}
886impl<'de, I: Iterator<Item = (Object<'de>, Object<'de>)>> MapAccess<'de, I> {
887 fn new(map: impl IntoIterator<Item = (Object<'de>, Object<'de>), IntoIter = I>) -> Self {
888 Self {
889 iter: map.into_iter(),
890 next_value: None,
891 }
892 }
893}
894impl<'de, I: Iterator<Item = (Object<'de>, Object<'de>)>> de::MapAccess<'de> for MapAccess<'de, I> {
895 type Error = de::value::Error;
896 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
897 where
898 K: de::DeserializeSeed<'de>,
899 {
900 self.iter
901 .next()
902 .map(|(k, v)| {
903 self.next_value = Some(v);
904 seed.deserialize(k)
905 })
906 .transpose()
907 }
908
909 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
910 where
911 V: de::DeserializeSeed<'de>,
912 {
913 seed.deserialize(
914 self.next_value
915 .take()
916 .expect("Called next_value_seed before next_key_seed."),
917 )
918 }
919
920 #[allow(clippy::type_complexity)]
921 fn next_entry_seed<K, V>(
922 &mut self,
923 kseed: K,
924 vseed: V,
925 ) -> Result<Option<(K::Value, V::Value)>, Self::Error>
926 where
927 K: de::DeserializeSeed<'de>,
928 V: de::DeserializeSeed<'de>,
929 {
930 assert!(self.next_value.is_none());
931 self.iter
932 .next()
933 .map(|(k, v)| {
934 kseed
935 .deserialize(k)
936 .and_then(|key| vseed.deserialize(v).map(|value| (key, value)))
937 })
938 .transpose()
939 }
940
941 fn size_hint(&self) -> Option<usize> {
942 if let (min, Some(max)) = self.iter.size_hint() {
943 if min == max {
944 return Some(min);
945 }
946 }
947 None
948 }
949}
950
951struct EnumAccess<'de>(Object<'de>);
952impl<'de> de::EnumAccess<'de> for EnumAccess<'de> {
953 type Error = <Object<'de> as de::Deserializer<'de>>::Error;
954 type Variant = VariantAccess<'de>;
955 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
956 where
957 V: de::DeserializeSeed<'de>,
958 {
959 match self.0 {
960 Object::UnitVariant { variant, .. } => {
961 (seed.deserialize(*variant)?, VariantAccess::Unit)
962 }
963 Object::NewtypeVariant { variant, value, .. } => {
964 (seed.deserialize(*variant)?, VariantAccess::Newtype(*value))
965 }
966 Object::TupleVariant {
967 variant, fields, ..
968 } => (seed.deserialize(*variant)?, VariantAccess::Tuple(*fields)),
969 Object::StructVariant {
970 variant, fields, ..
971 } => (seed.deserialize(*variant)?, VariantAccess::Struct(*fields)),
972 _ => {
973 return Err(de::Error::invalid_type(
974 de::Unexpected::Other("non-variant Object"),
975 &"enum variant",
976 ))
977 }
978 }
979 .pipe(Ok)
980 }
981}
982
983enum VariantAccess<'a> {
984 Unit,
985 Newtype(Object<'a>),
986 Tuple(Object<'a>),
987 Struct(Object<'a>),
988}
989impl<'de> de::VariantAccess<'de> for VariantAccess<'de> {
990 type Error = <Object<'de> as de::Deserializer<'de>>::Error;
991 fn unit_variant(self) -> Result<(), Self::Error> {
992 match self {
993 VariantAccess::Unit => Ok(()),
994 _ => Err(de::Error::invalid_type(self.unexp(), &"unit variant")),
995 }
996 }
997 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
998 where
999 T: de::DeserializeSeed<'de>,
1000 {
1001 match self {
1002 VariantAccess::Newtype(value) => seed.deserialize(value),
1003 _ => Err(de::Error::invalid_type(self.unexp(), &"newtype variant")),
1004 }
1005 }
1006 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1007 where
1008 V: de::Visitor<'de>,
1009 {
1010 match self {
1011 VariantAccess::Tuple(fields) => fields.deserialize_any(visitor),
1013 _ => Err(de::Error::invalid_type(self.unexp(), &"tuple variant")),
1014 }
1015 }
1016 fn struct_variant<V>(
1017 self,
1018 fields: &'static [&'static str],
1019 visitor: V,
1020 ) -> Result<V::Value, Self::Error>
1021 where
1022 V: de::Visitor<'de>,
1023 {
1024 match self {
1025 VariantAccess::Struct(fields) => fields.deserialize_any(visitor),
1027 _ => Err(de::Error::invalid_type(self.unexp(), &"struct variant")),
1028 }
1029 }
1030}
1031impl<'de> VariantAccess<'de> {
1032 fn unexp(&self) -> de::Unexpected {
1033 match self {
1034 VariantAccess::Unit => de::Unexpected::UnitVariant,
1035 VariantAccess::Newtype(_) => de::Unexpected::NewtypeVariant,
1036 VariantAccess::Tuple(_) => de::Unexpected::TupleVariant,
1037 VariantAccess::Struct(_) => de::Unexpected::StructVariant,
1038 }
1039 }
1040}
1041
1042#[derive(Debug, Clone, Copy)]
1043struct NoEnumAssistant;
1044impl EnumAssistant for NoEnumAssistant {
1045 fn variant_hint<E: de::Error>(&self, _variant: &Object) -> Result<VariantKind, E> {
1046 Err(de::Error::custom(
1047 "Encountered enum variant with no EnumAssistant specified.",
1048 ))
1049 }
1050}