serde-xdr 0.6.0

XDR serialization and deserialization for Serde
Documentation
use {
    super::{
        super::super::errors::{CompatDeserializationError, Result},
        deserialize_enum_error, Deserializer,
    },
    byteorder::ReadBytesExt,
    serde::{
        de::{DeserializeSeed, VariantAccess, Visitor},
        Deserializer as _,
    },
};

pub struct VariantDeserializer<'a, 'r, R>
where
    'r: 'a,
    R: ReadBytesExt + 'r,
{
    enum_name: &'static str,
    variant_name: &'static str,
    deserializer: &'a mut Deserializer<'r, R>,
}

impl<'a, 'r, R> VariantDeserializer<'a, 'r, R>
where
    'r: 'a,
    R: ReadBytesExt + 'r,
{
    pub fn new(
        enum_name: &'static str,
        variant_name: &'static str,
        deserializer: &'a mut Deserializer<'r, R>,
    ) -> Self {
        VariantDeserializer {
            enum_name,
            variant_name,
            deserializer,
        }
    }
}

impl<'a, 'de, 'r, R> VariantAccess<'de> for VariantDeserializer<'a, 'r, R>
where
    'r: 'a,
    R: ReadBytesExt + 'r,
{
    type Error = CompatDeserializationError;

    fn unit_variant(self) -> Result<()> {
        Ok(())
    }

    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
    where
        T: DeserializeSeed<'de>,
    {
        seed.deserialize(&mut *self.deserializer).map_err(|error| {
            deserialize_enum_error(self.enum_name, self.variant_name, error)
                .into()
        })
    }

    fn tuple_variant<V>(self, length: usize, visitor: V) -> Result<V::Value>
    where
        V: Visitor<'de>,
    {
        self.deserializer
            .deserialize_tuple(length, visitor)
            .map_err(|error| {
                deserialize_enum_error(self.enum_name, self.variant_name, error)
                    .into()
            })
    }

    fn struct_variant<V>(
        self,
        fields: &'static [&'static str],
        visitor: V,
    ) -> Result<V::Value>
    where
        V: Visitor<'de>,
    {
        self.deserializer
            .deserialize_struct(self.variant_name, fields, visitor)
            .map_err(|error| {
                deserialize_enum_error(self.enum_name, self.variant_name, error)
                    .into()
            })
    }
}