infrarust_protocol/types/
arrays.rs

1use crate::types::traits::{ProtocolRead, ProtocolWrite};
2use crate::types::var_numbers::VarInt;
3use std::io::{self, Read, Write};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct ByteArray(pub Vec<u8>);
7
8impl ProtocolWrite for ByteArray {
9    fn write_to<W: Write>(&self, writer: &mut W) -> io::Result<usize> {
10        let len = VarInt(self.0.len() as i32);
11        let mut bytes_written = len.write_to(writer)?;
12        writer.write_all(&self.0)?;
13        bytes_written += self.0.len();
14        Ok(bytes_written)
15    }
16}
17
18impl ProtocolRead for ByteArray {
19    fn read_from<R: Read>(reader: &mut R) -> io::Result<(Self, usize)> {
20        let (VarInt(length), mut bytes_read) = VarInt::read_from(reader)?;
21        if length < 0 {
22            return Err(io::Error::new(
23                io::ErrorKind::InvalidData,
24                "ByteArray length cannot be negative",
25            ));
26        }
27        let mut buffer = vec![0u8; length as usize];
28        reader.read_exact(&mut buffer)?;
29        bytes_read += length as usize;
30        Ok((ByteArray(buffer), bytes_read))
31    }
32}
33
34#[derive(Debug, Clone, PartialEq, Eq)]
35pub struct PrefixedArray<T>(pub Vec<T>);
36
37impl<T: ProtocolRead + ProtocolWrite> ProtocolWrite for PrefixedArray<T> {
38    fn write_to<W: Write>(&self, writer: &mut W) -> io::Result<usize> {
39        let mut written = VarInt(self.0.len() as i32).write_to(writer)?;
40        for item in &self.0 {
41            written += item.write_to(writer)?;
42        }
43        Ok(written)
44    }
45}
46
47impl<T: ProtocolRead + ProtocolWrite> ProtocolRead for PrefixedArray<T> {
48    fn read_from<R: Read>(reader: &mut R) -> io::Result<(Self, usize)> {
49        let (VarInt(length), mut bytes_read) = VarInt::read_from(reader)?;
50        let mut items = Vec::with_capacity(length as usize);
51
52        for _ in 0..length {
53            let (item, n) = T::read_from(reader)?;
54            bytes_read += n;
55            items.push(item);
56        }
57
58        Ok((PrefixedArray(items), bytes_read))
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65    use crate::types::primitives::Int;
66    use std::io::Cursor;
67
68    #[test]
69    fn test_byte_array() {
70        let test_data = vec![1, 2, 3, 4, 5];
71        let byte_array = ByteArray(test_data.clone());
72
73        let mut buffer = Vec::new();
74        let written = byte_array.write_to(&mut buffer).unwrap();
75
76        let mut cursor = Cursor::new(buffer);
77        let (read_array, read) = ByteArray::read_from(&mut cursor).unwrap();
78
79        assert_eq!(written, read);
80        assert_eq!(byte_array.0, read_array.0);
81    }
82
83    #[test]
84    fn test_prefixed_array() {
85        let test_data = vec![Int(1), Int(2), Int(3)];
86        let array = PrefixedArray(test_data.clone());
87
88        let mut buffer = Vec::new();
89        let written = array.write_to(&mut buffer).unwrap();
90
91        let mut cursor = Cursor::new(buffer);
92        let (read_array, read) = PrefixedArray::<Int>::read_from(&mut cursor).unwrap();
93
94        assert_eq!(written, read);
95        assert_eq!(array.0, read_array.0);
96    }
97
98    #[test]
99    fn test_empty_arrays() {
100        // Test empty byte array
101        let empty_bytes = ByteArray(vec![]);
102        let mut buffer = Vec::new();
103        empty_bytes.write_to(&mut buffer).unwrap();
104
105        let mut cursor = Cursor::new(buffer);
106        let (read_bytes, _) = ByteArray::read_from(&mut cursor).unwrap();
107        assert!(read_bytes.0.is_empty());
108
109        // Test empty prefixed array
110        let empty_ints: PrefixedArray<Int> = PrefixedArray(vec![]);
111        let mut buffer = Vec::new();
112        empty_ints.write_to(&mut buffer).unwrap();
113
114        let mut cursor = Cursor::new(buffer);
115        let (read_ints, _) = PrefixedArray::<Int>::read_from(&mut cursor).unwrap();
116        assert!(read_ints.0.is_empty());
117    }
118}