1use std::io;
4
5use crate::errors::Result;
6
7pub trait Serialize {
8 fn to_writer<W: io::Write>(&self, _: &mut W) -> Result<()>;
9 fn write_len(&self) -> usize;
10
11 fn to_bytes(&self) -> Result<Vec<u8>> {
12 let mut buf = Vec::with_capacity(self.write_len());
13 self.to_writer(&mut buf)?;
14
15 Ok(buf)
16 }
17}
18
19impl<T: Serialize> Serialize for &T {
20 fn to_writer<W: io::Write>(&self, writer: &mut W) -> Result<()> {
21 (*self).to_writer(writer)
22 }
23 fn write_len(&self) -> usize {
24 (*self).write_len()
25 }
26}
27
28impl<T: Serialize> Serialize for &[T] {
29 fn to_writer<W: io::Write>(&self, writer: &mut W) -> Result<()> {
30 for x in self.iter() {
31 (*x).to_writer(writer)?;
32 }
33 Ok(())
34 }
35
36 fn write_len(&self) -> usize {
37 self.iter().map(|w| w.write_len()).sum()
38 }
39}
40
41impl<T: Serialize> Serialize for Vec<T> {
42 fn to_writer<W: io::Write>(&self, writer: &mut W) -> Result<()> {
43 for x in self.iter() {
44 (*x).to_writer(writer)?;
45 }
46 Ok(())
47 }
48
49 fn write_len(&self) -> usize {
50 self.iter().map(|w| w.write_len()).sum()
51 }
52}