1pub use stellar_xdr::curr::*;
5
6pub type Result<T> = std::result::Result<T, Error>;
7
8pub 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
36pub 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}