infrarust_protocol/types/
arrays.rs1use 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 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 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}