voidmc_codec/primitives/
fixed_length.rs1use crate::{Decode, DecodeError, Encode};
2
3pub fn encode_fixed_length_vec<T: Encode>(
6 vec: &[T],
7 expected_len: usize,
8 buf: &mut Vec<u8>,
9) -> Result<(), String> {
10 if vec.len() != expected_len {
11 return Err(format!(
12 "Fixed-length vector length mismatch: expected {}, got {}",
13 expected_len,
14 vec.len()
15 ));
16 }
17 for item in vec {
18 item.encode(buf);
19 }
20 Ok(())
21}
22
23pub fn encode_fixed_length_vec_u8(
25 vec: &[u8],
26 expected_len: usize,
27 buf: &mut Vec<u8>,
28) -> Result<(), String> {
29 if vec.len() != expected_len {
30 return Err(format!(
31 "Fixed-length vector length mismatch: expected {}, got {}",
32 expected_len,
33 vec.len()
34 ));
35 }
36 buf.extend_from_slice(vec);
37 Ok(())
38}
39
40pub fn decode_fixed_length_vec<T: Decode>(
41 len: usize,
42 buf: &mut &[u8],
43) -> Result<Vec<T>, DecodeError> {
44 let mut vec = Vec::with_capacity(len);
45 for _ in 0..len {
46 vec.push(T::decode(buf)?);
47 }
48 Ok(vec)
49}
50
51pub fn decode_fixed_length_vec_u8(len: usize, buf: &mut &[u8]) -> Result<Vec<u8>, DecodeError> {
53 if buf.len() < len {
54 eprintln!("Buffer too small: expected {}, got {}", len, buf.len());
55 return Err(DecodeError::UnexpectedEof);
56 }
57 let (data, rest) = buf.split_at(len);
58 *buf = rest;
59 Ok(data.to_vec())
60}
61pub fn encode_remaining_vec_u8(vec: &[u8], buf: &mut Vec<u8>) {
63 buf.extend_from_slice(vec);
64}
65
66pub fn decode_remaining_vec_u8(buf: &mut &[u8]) -> Result<Vec<u8>, DecodeError> {
68 let remaining = buf.to_vec();
69 *buf = &[];
70 Ok(remaining)
71}