azalea_buf/
lib.rs

1#![doc = include_str!("../README.md")]
2#![feature(min_specialization)]
3// this is necessary for thiserror backtraces
4#![feature(error_generic_member_access)]
5
6mod definitions;
7mod read;
8mod serializable_uuid;
9mod write;
10
11pub use azalea_buf_macros::*;
12pub use definitions::*;
13pub use read::{AzaleaRead, AzaleaReadLimited, AzaleaReadVar, BufReadError};
14pub use serializable_uuid::*;
15pub use write::{AzaleaWrite, AzaleaWriteVar};
16
17// const DEFAULT_NBT_QUOTA: u32 = 2097152;
18const MAX_STRING_LENGTH: u16 = 32767;
19// const MAX_COMPONENT_STRING_LENGTH: u32 = 262144;
20
21#[cfg(test)]
22mod tests {
23    use std::{collections::HashMap, io::Cursor};
24
25    use super::*;
26
27    #[test]
28    fn test_write_varint() {
29        let mut buf = Vec::new();
30        0.azalea_write_var(&mut buf).unwrap();
31        assert_eq!(buf, vec![0]);
32
33        let mut buf = Vec::new();
34        1.azalea_write_var(&mut buf).unwrap();
35        assert_eq!(buf, vec![1]);
36
37        let mut buf = Vec::new();
38        2.azalea_write_var(&mut buf).unwrap();
39        assert_eq!(buf, vec![2]);
40
41        let mut buf = Vec::new();
42        127.azalea_write_var(&mut buf).unwrap();
43        assert_eq!(buf, vec![127]);
44
45        let mut buf = Vec::new();
46        128.azalea_write_var(&mut buf).unwrap();
47        assert_eq!(buf, vec![128, 1]);
48
49        let mut buf = Vec::new();
50        255.azalea_write_var(&mut buf).unwrap();
51        assert_eq!(buf, vec![255, 1]);
52
53        let mut buf = Vec::new();
54        25565.azalea_write_var(&mut buf).unwrap();
55        assert_eq!(buf, vec![221, 199, 1]);
56
57        let mut buf = Vec::new();
58        2097151.azalea_write_var(&mut buf).unwrap();
59        assert_eq!(buf, vec![255, 255, 127]);
60
61        let mut buf = Vec::new();
62        2147483647.azalea_write_var(&mut buf).unwrap();
63        assert_eq!(buf, vec![255, 255, 255, 255, 7]);
64
65        let mut buf = Vec::new();
66        (-1).azalea_write_var(&mut buf).unwrap();
67        assert_eq!(buf, vec![255, 255, 255, 255, 15]);
68
69        let mut buf = Vec::new();
70        (-2147483648).azalea_write_var(&mut buf).unwrap();
71        assert_eq!(buf, vec![128, 128, 128, 128, 8]);
72    }
73
74    #[test]
75    fn test_read_varint() {
76        // let buf = &mut &vec![0][..];
77        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 0);
78        let buf = vec![0];
79        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 0);
80
81        // let buf = &mut &vec![1][..];
82        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 1);
83        let buf = vec![1];
84        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 1);
85
86        // let buf = &mut &vec![2][..];
87        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2);
88        let buf = vec![2];
89        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 2);
90
91        // let buf = &mut &vec![127][..];
92        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 127);
93        let buf = vec![127];
94        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 127);
95
96        // let buf = &mut &vec![128, 1][..];
97        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 128);
98        let buf = vec![128, 1];
99        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 128);
100
101        // let buf = &mut &vec![255, 1][..];
102        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 255);
103        let buf = vec![255, 1];
104        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 255);
105
106        // let buf = &mut &vec![221, 199, 1][..];
107        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 25565);
108        let buf = vec![221, 199, 1];
109        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 25565);
110
111        // let buf = &mut &vec![255, 255, 127][..];
112        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2097151);
113        let buf = vec![255, 255, 127];
114        assert_eq!(
115            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
116            2097151
117        );
118
119        // let buf = &mut &vec![255, 255, 255, 255, 7][..];
120        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2147483647);
121        let buf = vec![255, 255, 255, 255, 7];
122        assert_eq!(
123            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
124            2147483647
125        );
126
127        // let buf = &mut &vec![255, 255, 255, 255, 15][..];
128        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -1);
129        let buf = vec![255, 255, 255, 255, 15];
130        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), -1);
131
132        // let buf = &mut &vec![128, 128, 128, 128, 8][..];
133        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -2147483648);
134        let buf = vec![128, 128, 128, 128, 8];
135        assert_eq!(
136            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
137            -2147483648
138        );
139    }
140
141    #[test]
142    fn test_read_varint_longer() {
143        let buf = vec![138, 56, 0, 135, 56, 123];
144        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 7178);
145    }
146
147    #[test]
148    fn test_write_varlong() {
149        let mut buf = Vec::new();
150        0u64.azalea_write_var(&mut buf).unwrap();
151        assert_eq!(buf, vec![0]);
152
153        let mut buf = Vec::new();
154        1u64.azalea_write_var(&mut buf).unwrap();
155        assert_eq!(buf, vec![1]);
156
157        let mut buf = Vec::new();
158        9223372036854775807u64.azalea_write_var(&mut buf).unwrap();
159        assert_eq!(buf, vec![255, 255, 255, 255, 255, 255, 255, 255, 127]);
160    }
161
162    #[test]
163    fn test_list() {
164        let original_vec = vec!["a".to_string(), "bc".to_string(), "def".to_string()];
165
166        let mut buf = Vec::new();
167        original_vec.azalea_write(&mut buf).unwrap();
168
169        dbg!(&buf);
170
171        let result = Vec::<String>::azalea_read(&mut Cursor::new(&buf)).unwrap();
172        assert_eq!(result, original_vec);
173    }
174
175    #[test]
176    fn test_int_id_list() {
177        let mut buf = Vec::new();
178        vec![1, 2, 3].azalea_write_var(&mut buf).unwrap();
179
180        let result = Vec::<i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
181        assert_eq!(result, vec![1, 2, 3]);
182    }
183
184    #[test]
185    fn test_map() {
186        let original_map = HashMap::from([
187            ("a".to_string(), 1),
188            ("bc".to_string(), 23),
189            ("def".to_string(), 456),
190        ]);
191        let mut buf = Vec::new();
192        original_map.azalea_write_var(&mut buf).unwrap();
193
194        let result = HashMap::<String, i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
195
196        assert_eq!(result, original_map);
197    }
198
199    #[test]
200    fn test_long() {
201        let mut buf: Vec<u8> = Vec::new();
202        123456u64.azalea_write(&mut buf).unwrap();
203
204        assert_eq!(u64::azalea_read(&mut Cursor::new(&buf)).unwrap(), 123456);
205    }
206}