reader.rs 862 B
Newer Older
Marek Kotewicz's avatar
Marek Kotewicz committed
use ser::Reader;
Marek Kotewicz's avatar
Marek Kotewicz committed

Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
pub fn deserialize_payload<T>(buffer: &[u8], version: u32, flags: u32) -> Result<T, Error> where T: Payload {
	let mut reader = PayloadReader::new(buffer, version, flags);
Marek Kotewicz's avatar
Marek Kotewicz committed
	let result = try!(reader.read());
	if !reader.is_finished() {
		return Err(Error::Deserialize);
	}

	Ok(result)
}

pub struct PayloadReader<T> {
	reader: Reader<T>,
Marek Kotewicz's avatar
Marek Kotewicz committed
	version: u32,
}

impl<'a> PayloadReader<&'a [u8]> {
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
	pub fn new(buffer: &'a [u8], version: u32, flags: u32) -> Self {
Marek Kotewicz's avatar
Marek Kotewicz committed
		PayloadReader {
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
			reader: Reader::new(buffer, flags),
Marek Kotewicz's avatar
Marek Kotewicz committed
			version: version,
		}
	}

	pub fn read<T>(&mut self) -> Result<T, Error> where T: Payload {
		if T::version() > self.version {
			return Err(Error::InvalidVersion);
		}

Marek Kotewicz's avatar
Marek Kotewicz committed
		T::deserialize_payload(&mut self.reader, self.version)
	}

	pub fn is_finished(&mut self) -> bool {
Marek Kotewicz's avatar
Marek Kotewicz committed
		self.reader.is_finished()
	}
}