2016-10-10 09:08:22 -07:00
|
|
|
use ser::Stream;
|
2016-10-21 01:55:37 -07:00
|
|
|
use bytes::{TaggedBytes, Bytes};
|
2016-11-25 09:38:21 -08:00
|
|
|
use network::Magic;
|
|
|
|
use common::Command;
|
2016-10-10 09:08:22 -07:00
|
|
|
use serialization::serialize_payload;
|
2016-10-14 02:44:11 -07:00
|
|
|
use {Payload, MessageResult, MessageHeader};
|
2016-09-19 10:19:04 -07:00
|
|
|
|
2016-10-21 01:55:37 -07:00
|
|
|
pub fn to_raw_message(magic: Magic, command: Command, payload: &Bytes) -> Bytes {
|
|
|
|
let header = MessageHeader::for_data(magic, command, payload);
|
|
|
|
let mut stream = Stream::default();
|
|
|
|
stream.append(&header);
|
|
|
|
stream.append_slice(payload);
|
|
|
|
stream.out()
|
|
|
|
}
|
|
|
|
|
2016-10-10 09:08:22 -07:00
|
|
|
pub struct Message<T> {
|
|
|
|
bytes: TaggedBytes<T>,
|
2016-09-19 10:19:04 -07:00
|
|
|
}
|
|
|
|
|
2016-10-14 02:44:11 -07:00
|
|
|
impl<T> Message<T> where T: Payload {
|
2016-10-10 09:08:22 -07:00
|
|
|
pub fn new(magic: Magic, version: u32, payload: &T) -> MessageResult<Self> {
|
|
|
|
let serialized = try!(serialize_payload(payload, version));
|
2016-09-19 10:19:04 -07:00
|
|
|
|
2016-10-10 09:08:22 -07:00
|
|
|
let message = Message {
|
2016-10-21 01:55:37 -07:00
|
|
|
bytes: TaggedBytes::new(to_raw_message(magic, T::command().into(), &serialized)),
|
2016-10-10 09:08:22 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
Ok(message)
|
2016-09-19 10:19:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-10 09:08:22 -07:00
|
|
|
impl<T> AsRef<[u8]> for Message<T> {
|
|
|
|
fn as_ref(&self) -> &[u8] {
|
|
|
|
self.bytes.as_ref()
|
2016-09-20 03:49:04 -07:00
|
|
|
}
|
2016-09-19 10:19:04 -07:00
|
|
|
}
|
2016-11-15 03:48:01 -08:00
|
|
|
|
|
|
|
impl<T> From<Message<T>> for Bytes {
|
|
|
|
fn from(m: Message<T>) -> Self {
|
|
|
|
m.bytes.into_raw()
|
|
|
|
}
|
|
|
|
}
|