stream.rs 759 B
Newer Older
use bytes::Bytes;
use ser::Stream;
use {Payload, Error, MessageResult};
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
pub fn serialize_payload<T>(t: &T, version: u32, flags: u32) -> MessageResult<Bytes> where T: Payload {
	let mut stream = PayloadStream::new(version, flags);
	try!(stream.append(t));
	Ok(stream.out())
}
Marek Kotewicz's avatar
Marek Kotewicz committed

pub struct PayloadStream {
	stream: Stream,
	version: u32,
}

impl PayloadStream {
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
	pub fn new(version: u32, flags: u32) -> Self {
Marek Kotewicz's avatar
Marek Kotewicz committed
		PayloadStream {
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
			stream: Stream::with_flags(flags),
Marek Kotewicz's avatar
Marek Kotewicz committed
			version: version,
		}
	}

	pub fn append<T>(&mut self, t: &T) -> MessageResult<()> where T: Payload {
		if T::version() > self.version {
Marek Kotewicz's avatar
Marek Kotewicz committed
			return Err(Error::InvalidVersion);
		}

		t.serialize_payload(&mut self.stream, self.version)
	}

	pub fn out(self) -> Bytes {
		self.stream.out()
Marek Kotewicz's avatar
Marek Kotewicz committed
	}
}