Skip to main content

voidmc_codec/primitives/
fixed_length.rs

1use crate::{Decode, DecodeError, Encode};
2
3/// Helper functions for encoding/decoding fixed-length vectors
4/// These functions do not encode a length prefix since it's known from context
5pub 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
23/// Optimized encoding for Vec<u8> - just extends the buffer directly
24pub 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
51/// Optimized decoding for Vec<u8> - just copy_from_slice without decode overhead
52pub 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}
61/// Encode remaining bytes - for Vec<u8> at end of packet
62pub fn encode_remaining_vec_u8(vec: &[u8], buf: &mut Vec<u8>) {
63    buf.extend_from_slice(vec);
64}
65
66/// Decode remaining bytes - consumes all remaining buffer
67pub fn decode_remaining_vec_u8(buf: &mut &[u8]) -> Result<Vec<u8>, DecodeError> {
68    let remaining = buf.to_vec();
69    *buf = &[];
70    Ok(remaining)
71}