1use crate::{
2 BufferReader, BufferWriter, Decode, DecodeError, Encode, EncodeError, Validate, ValidateError,
3};
4
5pub fn encode_versioned<T: Encode, W: BufferWriter>(
6 version: u8,
7 value: &T,
8 writer: &mut W,
9) -> Result<(), EncodeError> {
10 version.encode(writer)?;
11 value.encode(writer)
12}
13
14pub fn decode_versioned<'a, T: Decode, R: BufferReader<'a>>(
15 min: u8,
16 max: u8,
17 reader: &mut R,
18) -> Result<(u8, T), DecodeError> {
19 let version = u8::decode(reader)?;
20 if version < min || version > max {
21 return Err(DecodeError::InvalidVersion);
22 }
23 let value = T::decode(reader)?;
24 Ok((version, value))
25}
26
27pub fn validate_versioned<'a, T: Validate<'a>, R: BufferReader<'a>>(
28 min: u8,
29 max: u8,
30 reader: &mut R,
31) -> Result<u8, ValidateError> {
32 let mut buf = [0u8; 1];
33 reader
34 .read_exact(&mut buf)
35 .map_err(|_| ValidateError::UnexpectedEOF)?;
36 let version = buf[0];
37 if version < min || version > max {
38 return Err(ValidateError::InvalidVersion);
39 }
40 T::validate(reader)?;
41 Ok(version)
42}