@@ -4,11 +4,12 @@ use std::{
4
4
ops:: Deref ,
5
5
} ;
6
6
7
- use bytes:: { BufMut , Bytes , BytesMut } ;
7
+ use bytes:: Bytes ;
8
8
use compound:: NbtCompound ;
9
9
use deserializer:: ReadAdaptor ;
10
10
use serde:: { de, ser} ;
11
11
use serde:: { Deserialize , Deserializer } ;
12
+ use serializer:: WriteAdaptor ;
12
13
use tag:: NbtTag ;
13
14
use thiserror:: Error ;
14
15
@@ -49,6 +50,8 @@ pub enum Error {
49
50
Incomplete ( io:: Error ) ,
50
51
#[ error( "Negative list length {0}" ) ]
51
52
NegativeLength ( i32 ) ,
53
+ #[ error( "Length too large {0}" ) ]
54
+ LargeLength ( usize ) ,
52
55
}
53
56
54
57
impl ser:: Error for Error {
@@ -111,11 +114,15 @@ impl Nbt {
111
114
}
112
115
113
116
pub fn write ( & self ) -> Bytes {
114
- let mut bytes = BytesMut :: new ( ) ;
115
- bytes. put_u8 ( COMPOUND_ID ) ;
116
- bytes. put ( NbtTag :: String ( self . name . to_string ( ) ) . serialize_data ( ) ) ;
117
- bytes. put ( self . root_tag . serialize_content ( ) ) ;
118
- bytes. freeze ( )
117
+ let mut bytes = Vec :: new ( ) ;
118
+ let mut writer = WriteAdaptor :: new ( & mut bytes) ;
119
+ writer. write_u8_be ( COMPOUND_ID ) . unwrap ( ) ;
120
+ NbtTag :: String ( self . name . to_string ( ) )
121
+ . serialize_data ( & mut writer)
122
+ . unwrap ( ) ;
123
+ self . root_tag . serialize_content ( & mut writer) . unwrap ( ) ;
124
+
125
+ bytes. into ( )
119
126
}
120
127
121
128
pub fn write_to_writer < W : Write > ( & self , mut writer : W ) -> Result < ( ) , io:: Error > {
@@ -125,10 +132,13 @@ impl Nbt {
125
132
126
133
/// Writes NBT tag, without name of root compound.
127
134
pub fn write_unnamed ( & self ) -> Bytes {
128
- let mut bytes = BytesMut :: new ( ) ;
129
- bytes. put_u8 ( COMPOUND_ID ) ;
130
- bytes. put ( self . root_tag . serialize_content ( ) ) ;
131
- bytes. freeze ( )
135
+ let mut bytes = Vec :: new ( ) ;
136
+ let mut writer = WriteAdaptor :: new ( & mut bytes) ;
137
+
138
+ writer. write_u8_be ( COMPOUND_ID ) . unwrap ( ) ;
139
+ self . root_tag . serialize_content ( & mut writer) . unwrap ( ) ;
140
+
141
+ bytes. into ( )
132
142
}
133
143
134
144
pub fn write_unnamed_to_writer < W : Write > ( & self , mut writer : W ) -> Result < ( ) , io:: Error > {
@@ -169,7 +179,7 @@ impl AsMut<NbtCompound> for Nbt {
169
179
170
180
pub fn get_nbt_string < R : Read > ( bytes : & mut ReadAdaptor < R > ) -> Result < String , Error > {
171
181
let len = bytes. get_u16_be ( ) ? as usize ;
172
- let string_bytes = bytes. read_to_bytes ( len) ?;
182
+ let string_bytes = bytes. read_boxed_slice ( len) ?;
173
183
let string = cesu8:: from_java_cesu8 ( & string_bytes) . map_err ( |_| Error :: Cesu8DecodingError ) ?;
174
184
Ok ( string. to_string ( ) )
175
185
}
@@ -204,6 +214,7 @@ impl_array!(BytesArray, "byte");
204
214
205
215
#[ cfg( test) ]
206
216
mod test {
217
+ use std:: io:: Read ;
207
218
use std:: sync:: LazyLock ;
208
219
209
220
use flate2:: read:: GzDecoder ;
@@ -212,6 +223,7 @@ mod test {
212
223
use pumpkin_world:: world_info:: { DataPacks , LevelData , WorldGenSettings , WorldVersion } ;
213
224
214
225
use crate :: deserializer:: from_bytes;
226
+ use crate :: serializer:: to_bytes;
215
227
use crate :: BytesArray ;
216
228
use crate :: IntArray ;
217
229
use crate :: LongArray ;
@@ -237,8 +249,10 @@ mod test {
237
249
float : 1.00 ,
238
250
string : "Hello test" . to_string ( ) ,
239
251
} ;
240
- let bytes = to_bytes_unnamed ( & test) . unwrap ( ) ;
241
- let recreated_struct: Test = from_bytes_unnamed ( & mut & bytes[ ..] ) . unwrap ( ) ;
252
+
253
+ let mut bytes = Vec :: new ( ) ;
254
+ to_bytes_unnamed ( & test, & mut bytes) . unwrap ( ) ;
255
+ let recreated_struct: Test = from_bytes_unnamed ( & bytes[ ..] ) . unwrap ( ) ;
242
256
243
257
assert_eq ! ( test, recreated_struct) ;
244
258
}
@@ -260,8 +274,10 @@ mod test {
260
274
int_array : vec ! [ 13 , 1321 , 2 ] ,
261
275
long_array : vec ! [ 1 , 0 , 200301 , 1 ] ,
262
276
} ;
263
- let bytes = to_bytes_unnamed ( & test) . unwrap ( ) ;
264
- let recreated_struct: TestArray = from_bytes_unnamed ( & mut & bytes[ ..] ) . unwrap ( ) ;
277
+
278
+ let mut bytes = Vec :: new ( ) ;
279
+ to_bytes_unnamed ( & test, & mut bytes) . unwrap ( ) ;
280
+ let recreated_struct: TestArray = from_bytes_unnamed ( & bytes[ ..] ) . unwrap ( ) ;
265
281
266
282
assert_eq ! ( test, recreated_struct) ;
267
283
}
@@ -316,13 +332,40 @@ mod test {
316
332
} ) ;
317
333
318
334
#[ test]
319
- fn test_serialize_deserialize_level_dat ( ) {
335
+ fn test_deserialize_level_dat ( ) {
320
336
let raw_compressed_nbt = include_bytes ! ( "../assets/level.dat" ) ;
321
337
assert ! ( !raw_compressed_nbt. is_empty( ) ) ;
322
338
323
339
let decoder = GzDecoder :: new ( & raw_compressed_nbt[ ..] ) ;
324
- let level_dat: LevelDat = from_bytes ( decoder) . unwrap ( ) ;
340
+ let level_dat: LevelDat = from_bytes ( decoder) . expect ( "Failed to decode from file" ) ;
325
341
326
342
assert_eq ! ( level_dat, * LEVEL_DAT ) ;
327
343
}
344
+
345
+ #[ test]
346
+ fn test_serialize_level_dat ( ) {
347
+ let raw_compressed_nbt = include_bytes ! ( "../assets/level.dat" ) ;
348
+ assert ! ( !raw_compressed_nbt. is_empty( ) ) ;
349
+
350
+ let mut decoder = GzDecoder :: new ( & raw_compressed_nbt[ ..] ) ;
351
+ let mut raw_bytes = Vec :: new ( ) ;
352
+ decoder. read_to_end ( & mut raw_bytes) . unwrap ( ) ;
353
+
354
+ let mut serialized = Vec :: new ( ) ;
355
+ to_bytes ( & * LEVEL_DAT , "" . to_string ( ) , & mut serialized) . expect ( "Failed to encode to bytes" ) ;
356
+ raw_bytes
357
+ . iter ( )
358
+ . zip ( serialized. iter ( ) )
359
+ . enumerate ( )
360
+ . for_each ( |( index, ( expected_byte, serialized_byte) ) | {
361
+ if expected_byte != serialized_byte {
362
+ panic ! ( "{} vs {} ({})" , expected_byte, serialized_byte, index) ;
363
+ }
364
+ } ) ;
365
+
366
+ let level_dat_again: LevelDat =
367
+ from_bytes ( & serialized[ ..] ) . expect ( "Failed to decode from bytes" ) ;
368
+
369
+ assert_eq ! ( level_dat_again, * LEVEL_DAT ) ;
370
+ }
328
371
}
0 commit comments