Skip to main content

ax_codec_core/
version.rs

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}