1 pub mod exact_size_buf; 2 3 use bytes::{Buf, Bytes, BytesMut}; 4 5 use crate::error::{Error, Result}; 6 7 pub trait MarshalSize { 8 fn marshal_size(&self) -> usize; 9 } 10 11 pub trait Marshal: MarshalSize { 12 fn marshal_to(&self, buf: &mut [u8]) -> Result<usize>; 13 14 fn marshal(&self) -> Result<Bytes> { 15 let l = self.marshal_size(); 16 let mut buf = BytesMut::with_capacity(l); 17 buf.resize(l, 0); 18 let n = self.marshal_to(&mut buf)?; 19 if n != l { 20 Err(Error::Other(format!( 21 "marshal_to output size {}, but expect {}", 22 n, l 23 ))) 24 } else { 25 Ok(buf.freeze()) 26 } 27 } 28 } 29 30 pub trait Unmarshal: MarshalSize { 31 fn unmarshal<B>(buf: &mut B) -> Result<Self> 32 where 33 Self: Sized, 34 B: Buf; 35 } 36