use crate::BorshSerialize;
use crate::__private::maybestd::vec::Vec;
use crate::io::{ErrorKind, Result, Write};
pub(super) const DEFAULT_SERIALIZER_CAPACITY: usize = 1024;
pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
where
T: BorshSerialize + ?Sized,
{
let mut result = Vec::with_capacity(DEFAULT_SERIALIZER_CAPACITY);
value.serialize(&mut result)?;
Ok(result)
}
pub fn to_writer<T, W: Write>(mut writer: W, value: &T) -> Result<()>
where
T: BorshSerialize + ?Sized,
{
value.serialize(&mut writer)
}
pub fn object_length<T>(value: &T) -> Result<usize>
where
T: BorshSerialize + ?Sized,
{
struct LengthWriter {
len: usize,
}
impl Write for LengthWriter {
#[inline]
fn write(&mut self, buf: &[u8]) -> Result<usize> {
let res = self.len.checked_add(buf.len());
self.len = match res {
Some(res) => res,
None => {
return Err(ErrorKind::OutOfMemory.into());
}
};
Ok(buf.len())
}
#[inline]
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
let mut w = LengthWriter { len: 0 };
value.serialize(&mut w)?;
Ok(w.len)
}