xref: /webrtc/util/src/marshal/mod.rs (revision 7ceeeeb0)
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