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}