use std::fmt::Debug;
use std::usize;
use bytes::{Buf, BufMut, IntoBuf};
use DecodeError;
use EncodeError;
use encoding::*;
pub trait Message: Debug + Send + Sync {
#[doc(hidden)]
fn encode_raw<B>(&self, buf: &mut B) where B: BufMut, Self: Sized;
#[doc(hidden)]
fn merge_field<B>(&mut self, buf: &mut B) -> Result<(), DecodeError> where B: Buf, Self: Sized;
fn encoded_len(&self) -> usize;
fn encode<B>(&self, buf: &mut B) -> Result<(), EncodeError> where B: BufMut, Self: Sized {
let required = self.encoded_len();
let remaining = buf.remaining_mut();
if required > buf.remaining_mut() {
return Err(EncodeError::new(required, remaining));
}
self.encode_raw(buf);
Ok(())
}
fn encode_length_delimited<B>(&self, buf: &mut B) -> Result<(), EncodeError> where B: BufMut, Self: Sized {
let len = self.encoded_len();
let required = len + encoded_len_varint(len as u64);
let remaining = buf.remaining_mut();
if required > remaining {
return Err(EncodeError::new(required, remaining))
}
encode_varint(len as u64, buf);
self.encode_raw(buf);
Ok(())
}
fn decode<B>(buf: B) -> Result<Self, DecodeError> where B: IntoBuf, Self: Default {
let mut message = Self::default();
Self::merge(&mut message, &mut buf.into_buf()).map(|_| message)
}
fn decode_length_delimited<B>(buf: B) -> Result<Self, DecodeError> where B: IntoBuf, Self: Default {
let mut message = Self::default();
message.merge_length_delimited(buf)?;
Ok(message)
}
fn merge<B>(&mut self, buf: B) -> Result<(), DecodeError> where B: IntoBuf, Self: Sized {
let mut buf = buf.into_buf();
while buf.has_remaining() {
self.merge_field(&mut buf)?;
}
Ok(())
}
fn merge_length_delimited<B>(&mut self, buf: B) -> Result<(), DecodeError> where B: IntoBuf, Self: Sized {
message::merge(WireType::LengthDelimited, self, &mut buf.into_buf())
}
fn clear(&mut self);
}
impl <M> Message for Box<M> where M: Message {
fn encode_raw<B>(&self, buf: &mut B) where B: BufMut {
(**self).encode_raw(buf)
}
fn merge_field<B>(&mut self, buf: &mut B) -> Result<(), DecodeError> where B: Buf {
(**self).merge_field(buf)
}
fn encoded_len(&self) -> usize {
(**self).encoded_len()
}
fn clear(&mut self) {
(**self).clear()
}
}