pbcodec 0.0.8

An asynchronous encoder/decoder for Protocol Buffers
Documentation
use std::io::Write;
use byteorder::{ByteOrder, LittleEndian};

use Encode;
use future::encode::{EncodeLengthDelimited, EncodeVarint};
use future::write::WriteBytes;
use types;
use wire::types::{LengthDelimited, Varint};

impl<W: Write> Encode<W> for types::Bool {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        Varint(self.0 as u64).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        1
    }
}

impl<W: Write> Encode<W> for types::Uint32 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        Varint(u64::from(self.0)).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        Encode::<W>::encoded_size(&Varint(u64::from(self.0)))
    }
}

impl<W: Write> Encode<W> for types::Uint64 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        Varint(self.0).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        Encode::<W>::encoded_size(&Varint(self.0))
    }
}

impl<W: Write> Encode<W> for types::Int32 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        Varint(self.0 as u64).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        Encode::<W>::encoded_size(&Varint(self.0 as u64))
    }
}

impl<W: Write> Encode<W> for types::Int64 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        Varint(self.0 as u64).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        Encode::<W>::encoded_size(&Varint(self.0 as u64))
    }
}

impl<W: Write> Encode<W> for types::Sint32 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        let n = self.0 as u32;
        let n = (n << 1) | (n >> 31);
        Varint(u64::from(n)).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        let n = self.0 as u32;
        let n = (n << 1) | (n >> 31);
        Encode::<W>::encoded_size(&Varint(u64::from(n)))
    }
}

impl<W: Write> Encode<W> for types::Sint64 {
    type Future = EncodeVarint<W>;
    fn encode(self, writer: W) -> Self::Future {
        let n = self.0 as u64;
        let n = (n << 1) | (n >> 63);
        Varint(n).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        let n = self.0 as u64;
        let n = (n << 1) | (n >> 63);
        Encode::<W>::encoded_size(&Varint(n))
    }
}

impl<W: Write> Encode<W> for types::Fixed32 {
    type Future = WriteBytes<W, [u8; 4]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 4];
        LittleEndian::write_u32(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        4
    }
}

impl<W: Write> Encode<W> for types::Fixed64 {
    type Future = WriteBytes<W, [u8; 8]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 8];
        LittleEndian::write_u64(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        8
    }
}

impl<W: Write> Encode<W> for types::Sfixed32 {
    type Future = WriteBytes<W, [u8; 4]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 4];
        LittleEndian::write_i32(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        4
    }
}

impl<W: Write> Encode<W> for types::Sfixed64 {
    type Future = WriteBytes<W, [u8; 8]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 8];
        LittleEndian::write_i64(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        8
    }
}

impl<W: Write> Encode<W> for types::Float {
    type Future = WriteBytes<W, [u8; 4]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 4];
        LittleEndian::write_f32(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        4
    }
}

impl<W: Write> Encode<W> for types::Double {
    type Future = WriteBytes<W, [u8; 8]>;
    fn encode(self, writer: W) -> Self::Future {
        let mut bytes = [0; 8];
        LittleEndian::write_f64(&mut bytes, self.0);
        WriteBytes::new(writer, bytes)
    }
    fn encoded_size(&self) -> u64 {
        8
    }
}

impl<W: Write> Encode<W> for types::Bytes {
    type Future = EncodeLengthDelimited<W, Vec<u8>>;
    fn encode(self, writer: W) -> Self::Future {
        LengthDelimited(self.0).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        let size = self.0.len() as u64;
        Encode::<W>::encoded_size(&Varint(size)) + size
    }
}

impl<W: Write> Encode<W> for types::Str {
    type Future = EncodeLengthDelimited<W, Vec<u8>>;
    fn encode(self, writer: W) -> Self::Future {
        LengthDelimited(self.0.into_bytes()).encode(writer)
    }
    fn encoded_size(&self) -> u64 {
        let size = self.0.as_bytes().len() as u64;
        Encode::<W>::encoded_size(&Varint(size)) + size
    }
}