1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
use crate::serializable::*;
use std::io::{BufWriter, Error, Write};

pub struct Serializer<T: Write>(BufWriter<T>);

impl<W: Write> Serializer<W> {
    pub fn new(w: W) -> Self {
        Serializer(BufWriter::new(w))
    }

    pub fn serialize<T: Serializable>(&mut self, value: T) -> Result<usize, SerializeError> {
        self.0.write(&value.serialize()?).or(Err(SerializeError::FailedToWrite))
    }

    pub fn get_ref(&self) -> &W {
        self.0.get_ref()
    }

    pub fn flush(&mut self) -> Result<(), Error> {
        self.0.flush()
    }
}