stellar_base/
xdr.rs

1//! Traits for XDR serialization and deserialization.
2
3// Re-export types from stellar-xdr::curr for compatibility
4pub use stellar_xdr::curr::*;
5
6pub type Result<T> = std::result::Result<T, Error>;
7
8/// Provided for compatibility. Prefer using the `WriteXdr` trait with appropriate limits.
9pub trait XDRSerialize {
10    fn write_xdr(&self, out: &mut Vec<u8>) -> crate::error::Result<u64>;
11
12    fn xdr_bytes(&self) -> crate::error::Result<Vec<u8>> {
13        let mut out = Vec::new();
14        self.write_xdr(&mut out)?;
15        Ok(out)
16    }
17
18    fn xdr_base64(&self) -> crate::error::Result<String> {
19        let bytes = self.xdr_bytes()?;
20        let encoded = base64::Engine::encode(&base64::engine::general_purpose::STANDARD, bytes);
21        Ok(encoded)
22    }
23}
24
25impl<T: WriteXdr + ?Sized> XDRSerialize for T {
26    fn write_xdr(&self, out: &mut Vec<u8>) -> crate::error::Result<u64> {
27        use std::io::Cursor;
28        let mut w = Limited::new(Cursor::new(out), Limits::none());
29        self.write_xdr(&mut w)
30            .map_err(|_| crate::error::Error::XdrError)?;
31        let bytes_written = w.inner.position();
32        Ok(bytes_written)
33    }
34}
35
36/// Provided for compatibility. Prefer using the `ReadXdr` trait with appropriate limits.
37pub trait XDRDeserialize: Sized {
38    fn from_xdr_bytes(buffer: &[u8]) -> crate::error::Result<(Self, u64)>;
39    fn from_xdr_base64(encoded: &str) -> crate::error::Result<Self> {
40        let decoded = base64::Engine::decode(&base64::engine::general_purpose::STANDARD, encoded)?;
41        let (res, _) = Self::from_xdr_bytes(&decoded)?;
42        Ok(res)
43    }
44}
45
46impl<T: ReadXdr + Sized> XDRDeserialize for T {
47    fn from_xdr_bytes(buffer: &[u8]) -> crate::error::Result<(Self, u64)> {
48        use std::io::Cursor;
49        let mut r = Limited::new(Cursor::new(buffer), Limits::none());
50        let val = T::read_xdr(&mut r).map_err(|_| crate::error::Error::XdrError)?;
51        let bytes_read = r.inner.position();
52        Ok((val, bytes_read))
53    }
54}