1use crate::Result;
2
3pub trait Encode {
5 fn encode(&self, buf: &mut Vec<u8>) -> Result<()>;
6}
7
8pub trait Decode: Sized {
10 fn decode(buf: &mut &[u8]) -> Result<Self>;
11}
12
13pub trait EncodedSize {
15 fn encoded_size(&self) -> usize;
16}
17
18impl<T: Encode + ?Sized> Encode for Box<T> {
27 fn encode(&self, buf: &mut Vec<u8>) -> Result<()> {
28 (**self).encode(buf)
29 }
30}
31
32impl<T: Decode> Decode for Box<T> {
33 fn decode(buf: &mut &[u8]) -> Result<Self> {
34 T::decode(buf).map(Box::new)
35 }
36}
37
38impl<T: EncodedSize + ?Sized> EncodedSize for Box<T> {
39 fn encoded_size(&self) -> usize {
40 (**self).encoded_size()
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47 use crate::Error;
48
49 struct DummyByte(u8);
51
52 impl Encode for DummyByte {
53 fn encode(&self, buf: &mut Vec<u8>) -> Result<()> {
54 buf.push(self.0);
55 Ok(())
56 }
57 }
58
59 impl Decode for DummyByte {
60 fn decode(buf: &mut &[u8]) -> Result<Self> {
61 if buf.is_empty() {
62 return Err(Error::BufferUnderflow {
63 needed: 1,
64 available: 0,
65 });
66 }
67 let value = buf[0];
68 *buf = &buf[1..];
69 Ok(DummyByte(value))
70 }
71 }
72
73 impl EncodedSize for DummyByte {
74 fn encoded_size(&self) -> usize {
75 1
76 }
77 }
78
79 #[test]
80 fn roundtrip() {
81 let original = DummyByte(42);
82 let mut buf = Vec::with_capacity(original.encoded_size());
83 original.encode(&mut buf).unwrap();
84 assert_eq!(buf.len(), original.encoded_size());
85
86 let mut cursor = buf.as_slice();
87 let decoded = DummyByte::decode(&mut cursor).unwrap();
88 assert_eq!(decoded.0, 42);
89 assert!(cursor.is_empty());
90 }
91
92 #[test]
93 fn decode_empty_buffer() {
94 let mut cursor: &[u8] = &[];
95 let result = DummyByte::decode(&mut cursor);
96 assert!(result.is_err());
97 }
98}