From dd092dce95b6c7fb0234f20b52d601ba880b5ce4 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 13 Apr 2017 16:53:27 -0700 Subject: [PATCH] Allow using IgnoredAny as a visitor --- serde/src/de/ignored_any.rs | 194 ++++++++++++++++++------------------ 1 file changed, 99 insertions(+), 95 deletions(-) diff --git a/serde/src/de/ignored_any.rs b/serde/src/de/ignored_any.rs index dff76273..fb8aaf10 100644 --- a/serde/src/de/ignored_any.rs +++ b/serde/src/de/ignored_any.rs @@ -7,106 +7,110 @@ use de::{Deserialize, Deserializer, Visitor, SeqVisitor, MapVisitor, Error}; #[derive(Copy, Clone, Debug, Default)] pub struct IgnoredAny; +impl<'de> Visitor<'de> for IgnoredAny { + type Value = IgnoredAny; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("anything at all") + } + + #[inline] + fn visit_bool(self, x: bool) -> Result { + let _ = x; + Ok(IgnoredAny) + } + + #[inline] + fn visit_i64(self, x: i64) -> Result { + let _ = x; + Ok(IgnoredAny) + } + + #[inline] + fn visit_u64(self, x: u64) -> Result { + let _ = x; + Ok(IgnoredAny) + } + + #[inline] + fn visit_f64(self, x: f64) -> Result { + let _ = x; + Ok(IgnoredAny) + } + + #[inline] + fn visit_str(self, s: &str) -> Result + where + E: Error, + { + let _ = s; + Ok(IgnoredAny) + } + + #[inline] + fn visit_none(self) -> Result { + Ok(IgnoredAny) + } + + #[inline] + fn visit_some(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + IgnoredAny::deserialize(deserializer) + } + + #[inline] + fn visit_newtype_struct(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + IgnoredAny::deserialize(deserializer) + } + + #[inline] + fn visit_unit(self) -> Result { + Ok(IgnoredAny) + } + + #[inline] + fn visit_seq(self, mut visitor: V) -> Result + where + V: SeqVisitor<'de>, + { + while let Some(IgnoredAny) = try!(visitor.visit()) { + // Gobble + } + Ok(IgnoredAny) + } + + #[inline] + fn visit_map(self, mut visitor: V) -> Result + where + V: MapVisitor<'de>, + { + while let Some((IgnoredAny, IgnoredAny)) = try!(visitor.visit()) { + // Gobble + } + Ok(IgnoredAny) + } + + #[inline] + fn visit_bytes(self, bytes: &[u8]) -> Result + where + E: Error, + { + let _ = bytes; + Ok(IgnoredAny) + } +} + impl<'de> Deserialize<'de> for IgnoredAny { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - struct IgnoredAnyVisitor; - - impl<'de> Visitor<'de> for IgnoredAnyVisitor { - type Value = IgnoredAny; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("anything at all") - } - - #[inline] - fn visit_bool(self, _: bool) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_i64(self, _: i64) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_u64(self, _: u64) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_f64(self, _: f64) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_str(self, _: &str) -> Result - where - E: Error, - { - Ok(IgnoredAny) - } - - #[inline] - fn visit_none(self) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_some(self, deserializer: D) -> Result - where - D: Deserializer<'de>, - { - IgnoredAny::deserialize(deserializer) - } - - #[inline] - fn visit_newtype_struct(self, deserializer: D) -> Result - where - D: Deserializer<'de>, - { - IgnoredAny::deserialize(deserializer) - } - - #[inline] - fn visit_unit(self) -> Result { - Ok(IgnoredAny) - } - - #[inline] - fn visit_seq(self, mut visitor: V) -> Result - where - V: SeqVisitor<'de>, - { - while let Some(_) = try!(visitor.visit::()) { - // Gobble - } - Ok(IgnoredAny) - } - - #[inline] - fn visit_map(self, mut visitor: V) -> Result - where - V: MapVisitor<'de>, - { - while let Some((_, _)) = try!(visitor.visit::()) { - // Gobble - } - Ok(IgnoredAny) - } - - #[inline] - fn visit_bytes(self, _: &[u8]) -> Result - where - E: Error, - { - Ok(IgnoredAny) - } - } - - deserializer.deserialize_ignored_any(IgnoredAnyVisitor) + deserializer.deserialize_ignored_any(IgnoredAny) } }