flat_rs/
lib.rs

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}