Allow using IgnoredAny as a visitor

This commit is contained in:
David Tolnay
2017-04-13 16:53:27 -07:00
parent dfea7ec939
commit dd092dce95
+29 -25
View File
@@ -7,15 +7,7 @@ use de::{Deserialize, Deserializer, Visitor, SeqVisitor, MapVisitor, Error};
#[derive(Copy, Clone, Debug, Default)] #[derive(Copy, Clone, Debug, Default)]
pub struct IgnoredAny; pub struct IgnoredAny;
impl<'de> Deserialize<'de> for IgnoredAny { impl<'de> Visitor<'de> for IgnoredAny {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error>
where
D: Deserializer<'de>,
{
struct IgnoredAnyVisitor;
impl<'de> Visitor<'de> for IgnoredAnyVisitor {
type Value = IgnoredAny; type Value = IgnoredAny;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
@@ -23,40 +15,45 @@ impl<'de> Deserialize<'de> for IgnoredAny {
} }
#[inline] #[inline]
fn visit_bool<E>(self, _: bool) -> Result<IgnoredAny, E> { fn visit_bool<E>(self, x: bool) -> Result<Self::Value, E> {
let _ = x;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_i64<E>(self, _: i64) -> Result<IgnoredAny, E> { fn visit_i64<E>(self, x: i64) -> Result<Self::Value, E> {
let _ = x;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_u64<E>(self, _: u64) -> Result<IgnoredAny, E> { fn visit_u64<E>(self, x: u64) -> Result<Self::Value, E> {
let _ = x;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_f64<E>(self, _: f64) -> Result<IgnoredAny, E> { fn visit_f64<E>(self, x: f64) -> Result<Self::Value, E> {
let _ = x;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_str<E>(self, _: &str) -> Result<IgnoredAny, E> fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
where where
E: Error, E: Error,
{ {
let _ = s;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_none<E>(self) -> Result<IgnoredAny, E> { fn visit_none<E>(self) -> Result<Self::Value, E> {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_some<D>(self, deserializer: D) -> Result<IgnoredAny, D::Error> fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
@@ -64,7 +61,7 @@ impl<'de> Deserialize<'de> for IgnoredAny {
} }
#[inline] #[inline]
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<IgnoredAny, D::Error> fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
@@ -72,41 +69,48 @@ impl<'de> Deserialize<'de> for IgnoredAny {
} }
#[inline] #[inline]
fn visit_unit<E>(self) -> Result<IgnoredAny, E> { fn visit_unit<E>(self) -> Result<Self::Value, E> {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_seq<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where where
V: SeqVisitor<'de>, V: SeqVisitor<'de>,
{ {
while let Some(_) = try!(visitor.visit::<IgnoredAny>()) { while let Some(IgnoredAny) = try!(visitor.visit()) {
// Gobble // Gobble
} }
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_map<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error> fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where where
V: MapVisitor<'de>, V: MapVisitor<'de>,
{ {
while let Some((_, _)) = try!(visitor.visit::<IgnoredAny, IgnoredAny>()) { while let Some((IgnoredAny, IgnoredAny)) = try!(visitor.visit()) {
// Gobble // Gobble
} }
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_bytes<E>(self, _: &[u8]) -> Result<IgnoredAny, E> fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>
where where
E: Error, E: Error,
{ {
let _ = bytes;
Ok(IgnoredAny) Ok(IgnoredAny)
} }
} }
deserializer.deserialize_ignored_any(IgnoredAnyVisitor) impl<'de> Deserialize<'de> for IgnoredAny {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_ignored_any(IgnoredAny)
} }
} }