From 371f764d32d0463881d27e8d1124c5a26c8d37bc Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 21 Oct 2022 10:11:18 -0700 Subject: [PATCH] Implement Deserializer for TaggedValue and &TaggedValue --- src/value/tagged.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/value/tagged.rs b/src/value/tagged.rs index 74593630..7c2f88ae 100644 --- a/src/value/tagged.rs +++ b/src/value/tagged.rs @@ -5,6 +5,7 @@ use serde::de::value::{BorrowedStrDeserializer, StrDeserializer}; use serde::de::{ Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error as _, VariantAccess, Visitor, }; +use serde::forward_to_deserialize_any; use serde::ser::{Serialize, SerializeMap, Serializer}; use std::cmp::Ordering; use std::fmt::{self, Debug, Display}; @@ -213,6 +214,31 @@ impl<'de> Deserialize<'de> for TaggedValue { } } +impl<'de> Deserializer<'de> for TaggedValue { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_enum(self) + } + + fn deserialize_ignored_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + drop(self); + visitor.visit_unit() + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes + byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct + map struct enum identifier + } +} + impl<'de> EnumAccess<'de> for TaggedValue { type Error = Error; type Variant = Value; @@ -268,6 +294,30 @@ impl<'de> VariantAccess<'de> for Value { } } +impl<'de> Deserializer<'de> for &'de TaggedValue { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_enum(self) + } + + fn deserialize_ignored_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_unit() + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes + byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct + map struct enum identifier + } +} + impl<'de> EnumAccess<'de> for &'de TaggedValue { type Error = Error; type Variant = &'de Value;