use std::marker::PhantomData;
use serde::de::{self, Deserialize, Deserializer, IntoDeserializer};
macro_rules! check_duplicate {
($key:expr => $var:ident) => ({
if $var.is_some() {
return Err(::serde::de::Error::duplicate_field($key));
}
});
($var:ident) => (
check_duplicate!(stringify!($var) => $var);
);
}
pub fn deserialize<'de, T, S, E>(from: S) -> Result<T, E>
where T: Deserialize<'de>,
S: IntoDeserializer<'de, E>,
E: de::Error
{
let deserializer = IntoDeserializer::into_deserializer(from);
T::deserialize(deserializer)
}
pub struct NoopIntoDeserializer<'de, D: Deserializer<'de>> {
deserializer: D,
_marker: PhantomData<&'de ()>,
}
impl<'de, D: Deserializer<'de>> NoopIntoDeserializer<'de, D> {
#[inline(always)]
pub fn new(deserializer: D) -> Self {
NoopIntoDeserializer {
deserializer,
_marker: PhantomData,
}
}
}
impl<'de, D> IntoDeserializer<'de, D::Error> for NoopIntoDeserializer<'de, D>
where D: Deserializer<'de>
{
type Deserializer = D;
fn into_deserializer(self) -> Self::Deserializer {
self.deserializer
}
}