pub use xdrs::cxs::decode as decode_xdr;
pub use xdrs::{
ReadError, ReadResult, ReadXDR, ReadXDROwned, WriteError, WriteResult,
WriteXDR, read_xdr, write_xdr,
};
#[cfg(not(feature = "alloc"))]
use crate::internal::mu_buf::MUBuf;
pub const SCRATCH_MAX: usize = 4096;
#[cfg(feature = "alloc")]
pub type ScratchBuf = alloc::vec::Vec<u8>;
#[cfg(not(feature = "alloc"))]
pub type ScratchBuf = MUBuf<SCRATCH_MAX>;
#[cfg(feature = "alloc")]
pub fn new_scratch() -> ScratchBuf {
alloc::vec::Vec::with_capacity(SCRATCH_MAX)
}
#[cfg(not(feature = "alloc"))]
pub fn new_scratch() -> ScratchBuf {
MUBuf::new()
}
pub fn encode_scratch<T>(buf: &mut ScratchBuf, x: &T) -> WriteResult<()>
where
T: WriteXDR + ?Sized,
{
#[cfg(feature = "alloc")]
{
buf.clear();
let mut writer =
xdrs::cxs::buf_writer::BufWriter::from(core::mem::take(buf));
let result = x.write_xdr(&mut writer);
*buf = writer.into();
result
}
#[cfg(not(feature = "alloc"))]
{
buf.clear();
let written = xdrs::cxs::encode_into(x, buf.spare_capacity_mut())?;
unsafe {
buf.set_len(written);
}
Ok(())
}
}
#[cfg(feature = "alloc")]
pub fn encode_xdr<T>(x: &T) -> WriteResult<ScratchBuf>
where
T: WriteXDR + ?Sized,
{
let mut buf = new_scratch();
encode_scratch(&mut buf, x)?;
Ok(buf)
}