1use std::io::{Cursor, Write};
16
17use crate::{EncodeError, MAX_ARRAY_LENGTH};
18
19pub trait Encode {
21 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError>;
23
24 fn encode_to_vec(&self) -> Result<Vec<u8>, EncodeError> {
26 let buffer = Vec::new();
27 let mut cursor = Cursor::new(buffer);
28
29 self.encode(&mut cursor)?;
30
31 Ok(cursor.into_inner())
32 }
33}
34
35impl Encode for u8 {
36 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
37 Ok(writer.write(&[*self])?)
38 }
39}
40
41impl Encode for bool {
42 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
43 (*self as u8).encode(writer)
44 }
45}
46
47impl<const N: usize> Encode for [u8; N] {
48 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
49 writer.write_all(self)?;
50
51 Ok(N)
52 }
53}
54
55impl Encode for u32 {
56 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
57 let bytes = self.to_be_bytes();
58 bytes.encode(writer)
59 }
60}
61
62impl Encode for usize {
63 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
64 let value = u32::try_from(*self).map_err(|_| EncodeError::OutsideU32Range(*self))?;
65
66 value.encode(writer)
67 }
68}
69
70impl<T: Encode> Encode for [T] {
71 fn encode(&self, writer: &mut impl Write) -> Result<usize, EncodeError> {
72 let length = self.len();
73
74 if length > MAX_ARRAY_LENGTH {
75 Err(EncodeError::ArrayTooBig(length))
76 } else {
77 let mut ret = length.encode(writer)?;
78
79 for value in self {
80 ret += value.encode(writer)?;
81 }
82
83 Ok(ret)
84 }
85 }
86}