sendstream_parser 0.2.2

Parser for BTRFS sendstreams
Documentation
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;

use crate::Data;
use crate::XattrData;
use crate::XattrName;

pub(crate) mod uid {
    use nix::unistd::Uid;

    use super::*;

    pub fn deserialize<'de, D>(d: D) -> Result<Uid, D::Error>
    where
        D: Deserializer<'de>,
    {
        u32::deserialize(d).map(Uid::from_raw)
    }

    pub fn serialize<S>(u: &Uid, s: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        u.as_raw().serialize(s)
    }
}

pub(crate) mod gid {
    use nix::unistd::Gid;

    use super::*;

    pub fn deserialize<'de, D>(d: D) -> Result<Gid, D::Error>
    where
        D: Deserializer<'de>,
    {
        u32::deserialize(d).map(Gid::from_raw)
    }

    pub fn serialize<S>(g: &Gid, s: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        g.as_raw().serialize(s)
    }
}

pub(crate) mod utf8 {
    use serde::ser::Error;

    use super::*;

    pub fn deserialize<'de, D, T>(d: D) -> Result<T, D::Error>
    where
        D: Deserializer<'de>,
        T: From<&'de [u8]>,
    {
        <&str>::deserialize(d).map(|s| s.as_bytes()).map(T::from)
    }

    pub fn serialize<S, T>(t: T, s: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
        T: AsRef<[u8]>,
    {
        std::str::from_utf8(t.as_ref())
            .map_err(|_| S::Error::custom("not utf8 string"))
            .and_then(|d| d.serialize(s))
    }
}

macro_rules! utf8_serde {
    ($t:ident) => {
        impl<'a, 'de> Deserialize<'de> for $t<'a>
        where
            'de: 'a,
        {
            fn deserialize<D>(d: D) -> Result<Self, D::Error>
            where
                D: Deserializer<'de>,
            {
                crate::ser::utf8::deserialize(d)
            }
        }

        impl<'a> Serialize for $t<'a> {
            fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
            where
                S: Serializer,
            {
                crate::ser::utf8::serialize(self, s)
            }
        }
    };
}

utf8_serde!(Data);
utf8_serde!(XattrName);
utf8_serde!(XattrData);