1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//! Traits for XDR serialization and deserialization.
use crate::error::Result;
pub use crate::xdr_generated::*;

pub trait XDRSerialize {
    fn write_xdr(&self, out: &mut Vec<u8>) -> Result<u64>;

    fn xdr_bytes(&self) -> Result<Vec<u8>> {
        let mut out = Vec::new();
        self.write_xdr(&mut out)?;
        Ok(out)
    }

    fn xdr_base64(&self) -> Result<String> {
        let bytes = self.xdr_bytes()?;
        let encoded = base64::encode(bytes);
        Ok(encoded)
    }
}

pub trait XDRDeserialize: Sized {
    fn from_xdr_bytes(buffer: &[u8]) -> Result<(Self, u64)>;
    fn from_xdr_base64(encoded: &str) -> Result<Self> {
        let decoded = base64::decode(encoded)?;
        let (res, _) = Self::from_xdr_bytes(&decoded)?;
        Ok(res)
    }
}