#![deny(missing_docs)]
extern crate bytes;
extern crate nt_leb128 as leb128;
extern crate failure;
mod ext;
pub use self::ext::BufExt;
use bytes::{Buf, BytesMut, BufMut};
use leb128::write::LEB128Write;
use leb128::read::LEB128Read;
pub trait ClientMessage: Send {
fn encode(&self, buf: &mut BytesMut);
}
pub trait ServerMessage: Sized {
fn decode(buf: &mut Buf) -> Result<(Self, usize), failure::Error>;
}
impl ClientMessage for String {
fn encode(&self, buf: &mut BytesMut) {
buf.write_unsigned(self.len() as u64).unwrap();
buf.put_slice(self.as_bytes());
}
}
impl ServerMessage for String {
fn decode(mut buf: &mut Buf) -> Result<(Self, usize), failure::Error> {
let (len, bytes_read) = buf.read_unsigned()?;
let len = len as usize;
let mut strbuf = vec![0; len];
buf.copy_to_slice(&mut strbuf[..]);
Ok((String::from_utf8(strbuf)?, len + bytes_read))
}
}
impl ClientMessage for Vec<u8> {
fn encode(&self, buf: &mut BytesMut) {
buf.write_unsigned(self.len() as u64).unwrap();
buf.extend_from_slice(&self[..]);
}
}
impl<T> ClientMessage for Vec<T>
where T: ClientMessage
{
fn encode(&self, buf: &mut BytesMut) {
let mut bytes = BytesMut::new();
for item in self {
item.encode(&mut bytes);
}
buf.write_unsigned(bytes.len() as u64).unwrap();
buf.extend(bytes);
}
}
impl<T> ServerMessage for Vec<T>
where T: ServerMessage
{
fn decode(mut buf: &mut Buf) -> Result<(Self, usize), failure::Error> {
let mut bytes_read = 0;
let len = {
let (len, bytes) = buf.read_unsigned()?;
bytes_read += bytes;
len as usize
};
let mut vec = Vec::with_capacity(len as usize);
for i in 0..len {
let (t, bytes) = T::decode(buf)?;
bytes_read += bytes;
vec[i as usize] = t;
}
Ok((vec, bytes_read))
}
}
impl ServerMessage for Vec<u8> {
fn decode(mut buf: &mut Buf) -> Result<(Self, usize), failure::Error> {
let mut bytes_read = 0;
let len = {
let (len, bytes) = buf.read_unsigned()?;
bytes_read += bytes;
len as usize
};
let mut vec = vec![0; len];
for i in 0..len {
vec[i] = buf.read_u8()?;
bytes_read += 1;
}
Ok((vec, bytes_read))
}
}