From 4bba342e424ca245a61b33d68cc48fe33224d60a Mon Sep 17 00:00:00 2001 From: David Rajchenbach-Teller Date: Tue, 23 Feb 2016 21:43:50 +0100 Subject: [PATCH] Resolves #183 - Serialize and Deserialize for PhantomData --- serde/src/de/impls.rs | 28 ++++++++++++++++++++++++++++ serde/src/ser/impls.rs | 12 ++++++++++++ 2 files changed, 40 insertions(+) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 2a8fc00f..0608a363 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -315,6 +315,34 @@ impl Deserialize for Option where T: Deserialize { /////////////////////////////////////////////////////////////////////////////// +/// A visitor that produces a `PhantomData`. +pub struct PhantomDataVisitor { + marker: PhantomData, +} + +impl< + T: Deserialize, +> Visitor for PhantomDataVisitor { + type Value = PhantomData; + + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(PhantomData) + } +} + +impl Deserialize for PhantomData where T: Deserialize { + fn deserialize(deserializer: &mut D) -> Result, D::Error> + where D: Deserializer, + { + deserializer.visit_unit(PhantomDataVisitor {marker: PhantomData}) + } +} + +/////////////////////////////////////////////////////////////////////////////// + macro_rules! seq_impl { ( $ty:ty, diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 6c33dddb..70db3b65 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -22,6 +22,7 @@ use std::ops; use std::path; use std::rc::Rc; use std::sync::Arc; +use std::marker::PhantomData; #[cfg(feature = "nightly")] use core::nonzero::{NonZero, Zeroable}; @@ -119,6 +120,17 @@ impl SeqVisitor for Option where T: Serialize { /////////////////////////////////////////////////////////////////////////////// +impl Serialize for PhantomData { + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.visit_unit() + } +} + +/////////////////////////////////////////////////////////////////////////////// + /// A `serde::Visitor` for sequence iterators. /// /// # Examples