binary_codec/
utils.rs

1use crate::{
2    DeserializationError, SerializationError, SerializerConfig,
3    dyn_int::{read_dynint, write_dynint},
4};
5
6pub fn ensure_size<T: Clone>(
7    config: &SerializerConfig<T>,
8    bytes: &[u8],
9    required: usize,
10) -> Result<bool, DeserializationError> {
11    if config.pos + required > bytes.len() {
12        return Err(DeserializationError::NotEnoughBytes(
13            config.pos + required - bytes.len(),
14        ));
15    }
16    Ok(config.pos + required == bytes.len())
17}
18
19pub fn slice<'a, T: Clone>(
20    config: &mut SerializerConfig<T>,
21    bytes: &'a [u8],
22    length: usize,
23    increment: bool,
24) -> Result<&'a [u8], DeserializationError> {
25    ensure_size(config, bytes, length)?;
26    let slice = &bytes[config.pos..config.pos + length];
27    if increment {
28        config.pos += length;
29    }
30    Ok(slice)
31}
32
33pub fn get_read_size<'a, T: Clone>(
34    bytes: &'a [u8],
35    size_key: Option<&str>,
36    config: &mut SerializerConfig<T>,
37) -> Result<usize, DeserializationError> {
38    let size = if let Some(size_key) = size_key {
39        if size_key == "__dynamic" {
40            return read_dynint(bytes, config).map(|v| v as usize);
41        }
42
43        config
44            .get_length(size_key)
45            .unwrap_or(bytes.len() - config.pos)
46    } else {
47        bytes.len() - config.pos
48    };
49
50    ensure_size(config, bytes, size)?;
51    Ok(size)
52}
53
54pub fn write_size<T: Clone>(
55    size: usize,
56    size_key: Option<&str>,
57    buffer: &mut Vec<u8>,
58    config: &mut SerializerConfig<T>,
59) -> Result<(), SerializationError> {
60    if let Some(size_key) = size_key {
61        if size_key == "__dynamic" {
62            return write_dynint(size as u128, buffer, config);
63        }
64
65        if let Some(expected) = config.get_length(size_key) {
66            if expected != size {
67                return Err(SerializationError::UnexpectedLength(expected, size));
68            }
69        }
70    }
71
72    Ok(())
73}