buffoon 0.5.0

Simple Protocol Buffers implementation
Documentation
use std::io::{self, Write};
use output_stream::OutputStreamBackend;
use wire_type::WireType::*;
use {Message, OutputStream};

pub struct OutputWriter<'a, W:'a> {
    curr: usize,
    nested: &'a [usize],
    writer: &'a mut W
}

impl<'a, W: Write> OutputWriter<'a, W> {
    pub fn new(nested: &'a [usize], writer: &'a mut W) -> OutputWriter<'a, W> {
        OutputWriter {
            curr: 0,
            nested: nested,
            writer: writer
        }
    }
}

impl<'a, W: Write> OutputStreamBackend for OutputWriter<'a, W> {
    fn write_bytes(&mut self, bytes: &[u8]) -> io::Result<()> {
        try!(self.writer.write(bytes));
        Ok(())
    }
}

impl<'a, W: Write> OutputStream for OutputWriter<'a, W> {
    fn write_message_field<M: Message>(&mut self, field: usize, msg: &M) -> io::Result<()> {
        if self.curr >= self.nested.len() {
            return invalid_serializer();
        }

        let size = self.nested[self.curr];
        self.curr += 1;

        if size > 0 {
            try!(self.write_head(field, LengthDelimited));
            try!(self.write_usize(size));

            try!(msg.serialize(self));
        };

        Ok(())
    }
}

fn invalid_serializer<T>() -> io::Result<T> {
    Err(io::Error::new(io::ErrorKind::Other, "invalid serializer for current message"))
}