1mod decode;
2mod encode;
3pub mod filler;
4pub mod zigzag;
5
6pub mod en {
7 pub use super::encode::*;
8}
9
10pub mod de {
11 pub use super::decode::*;
12}
13
14pub trait Flat<'b>: en::Encode + de::Decode<'b> {
15 fn flat(&self) -> Result<Vec<u8>, en::Error> {
16 encode(self)
17 }
18
19 fn unflat(bytes: &'b [u8]) -> Result<Self, de::Error> {
20 decode(bytes)
21 }
22}
23
24pub fn encode<T>(value: &T) -> Result<Vec<u8>, en::Error>
25where
26 T: en::Encode,
27{
28 let mut e = en::Encoder::new();
29
30 value.encode(&mut e)?;
31 e.encode(filler::Filler::FillerEnd)?;
32
33 Ok(e.buffer)
34}
35
36pub fn decode<'b, T>(bytes: &'b [u8]) -> Result<T, de::Error>
37where
38 T: de::Decode<'b>,
39{
40 let mut d = de::Decoder::new(bytes);
41
42 let value = d.decode()?;
43
44 d.decode::<filler::Filler>()?;
45
46 Ok(value)
47}