1use num_bigint::{BigInt, Sign};
5use reifydb_type::{
6 Result,
7 error::{Error, TypeError},
8 value::{
9 Value,
10 blob::Blob,
11 date::Date,
12 datetime::DateTime,
13 decimal::Decimal,
14 dictionary::DictionaryEntryId,
15 duration::Duration,
16 identity::IdentityId,
17 int::Int,
18 ordered_f32::OrderedF32,
19 ordered_f64::OrderedF64,
20 row_number::RowNumber,
21 time::Time,
22 r#type::Type,
23 uint::Uint,
24 uuid::{Uuid4, Uuid7},
25 },
26};
27use uuid::Uuid;
28
29use super::{catalog, deserialize};
30use crate::interface::catalog::{id::IndexId, schema::SchemaId};
31
32pub struct KeyDeserializer<'a> {
33 buffer: &'a [u8],
34 position: usize,
35}
36
37impl<'a> KeyDeserializer<'a> {
38 pub fn from_bytes(buffer: &'a [u8]) -> Self {
39 Self {
40 buffer,
41 position: 0,
42 }
43 }
44
45 pub fn remaining(&self) -> usize {
46 self.buffer.len().saturating_sub(self.position)
47 }
48
49 pub fn is_empty(&self) -> bool {
50 self.remaining() == 0
51 }
52
53 pub fn position(&self) -> usize {
54 self.position
55 }
56
57 fn read_exact(&mut self, count: usize) -> Result<&'a [u8]> {
58 if self.remaining() < count {
59 return Err(Error::from(TypeError::SerdeKeycode {
60 message: format!(
61 "unexpected end of key at position {}: need {} bytes, have {}",
62 self.position,
63 count,
64 self.remaining()
65 ),
66 }));
67 }
68 let start = self.position;
69 self.position += count;
70 Ok(&self.buffer[start..self.position])
71 }
72
73 pub fn read_bool(&mut self) -> Result<bool> {
74 let bytes = self.read_exact(1)?;
75 Ok(deserialize::<bool>(bytes)?)
76 }
77
78 pub fn read_f32(&mut self) -> Result<f32> {
79 let bytes = self.read_exact(4)?;
80 Ok(deserialize::<f32>(bytes)?)
81 }
82
83 pub fn read_f64(&mut self) -> Result<f64> {
84 let bytes = self.read_exact(8)?;
85 Ok(deserialize::<f64>(bytes)?)
86 }
87
88 pub fn read_i8(&mut self) -> Result<i8> {
89 let bytes = self.read_exact(1)?;
90 Ok(deserialize::<i8>(bytes)?)
91 }
92
93 pub fn read_i16(&mut self) -> Result<i16> {
94 let bytes = self.read_exact(2)?;
95 Ok(deserialize::<i16>(bytes)?)
96 }
97
98 pub fn read_i32(&mut self) -> Result<i32> {
99 let bytes = self.read_exact(4)?;
100 Ok(deserialize::<i32>(bytes)?)
101 }
102
103 pub fn read_i64(&mut self) -> Result<i64> {
104 let bytes = self.read_exact(8)?;
105 Ok(deserialize::<i64>(bytes)?)
106 }
107
108 pub fn read_i128(&mut self) -> Result<i128> {
109 let bytes = self.read_exact(16)?;
110 Ok(deserialize::<i128>(bytes)?)
111 }
112
113 pub fn read_u8(&mut self) -> Result<u8> {
114 let bytes = self.read_exact(1)?;
115 Ok(deserialize::<u8>(bytes)?)
116 }
117
118 pub fn read_u16(&mut self) -> Result<u16> {
119 let bytes = self.read_exact(2)?;
120 Ok(deserialize::<u16>(bytes)?)
121 }
122
123 pub fn read_u32(&mut self) -> Result<u32> {
124 let bytes = self.read_exact(4)?;
125 Ok(deserialize::<u32>(bytes)?)
126 }
127
128 pub fn read_u64(&mut self) -> Result<u64> {
129 let bytes = self.read_exact(8)?;
130 Ok(deserialize::<u64>(bytes)?)
131 }
132
133 pub fn read_u128(&mut self) -> Result<u128> {
134 let bytes = self.read_exact(16)?;
135 Ok(deserialize::<u128>(bytes)?)
136 }
137
138 pub fn read_bytes(&mut self) -> Result<Vec<u8>> {
139 let mut result = Vec::new();
140 loop {
141 if self.remaining() < 1 {
142 return Err(Error::from(TypeError::SerdeKeycode {
143 message: format!(
144 "unexpected end of key at position {}: bytes not terminated",
145 self.position
146 ),
147 }));
148 }
149 let byte = self.buffer[self.position];
150 self.position += 1;
151
152 if byte == 0xff {
153 if self.remaining() < 1 {
154 return Err(Error::from(TypeError::SerdeKeycode {
155 message: format!(
156 "unexpected end of key at position {}: incomplete escape sequence",
157 self.position
158 ),
159 }));
160 }
161 let next_byte = self.buffer[self.position];
162 self.position += 1;
163
164 if next_byte == 0x00 {
165 result.push(0xff);
166 } else if next_byte == 0xff {
167 break;
168 } else {
169 return Err(Error::from(TypeError::SerdeKeycode {
170 message: format!(
171 "invalid escape sequence at position {}: 0xff 0x{:02x}",
172 self.position - 1,
173 next_byte
174 ),
175 }));
176 }
177 } else {
178 result.push(byte);
179 }
180 }
181 Ok(result)
182 }
183
184 pub fn read_str(&mut self) -> Result<String> {
185 let bytes = self.read_bytes()?;
186 String::from_utf8(bytes).map_err(|e| {
187 Error::from(TypeError::SerdeKeycode {
188 message: format!("invalid UTF-8 in key at position {}: {}", self.position, e),
189 })
190 })
191 }
192
193 pub fn read_schema_id(&mut self) -> Result<SchemaId> {
194 let bytes = self.read_exact(9)?;
195 catalog::deserialize_schema_id(bytes)
196 }
197
198 pub fn read_index_id(&mut self) -> Result<IndexId> {
199 let bytes = self.read_exact(9)?;
200 catalog::deserialize_index_id(bytes)
201 }
202
203 pub fn read_date(&mut self) -> Result<Date> {
204 let days = self.read_i32()?;
205 Date::from_days_since_epoch(days).ok_or_else(|| {
206 Error::from(TypeError::SerdeKeycode {
207 message: format!(
208 "invalid date at position {}: {} days since epoch",
209 self.position, days
210 ),
211 })
212 })
213 }
214
215 pub fn read_datetime(&mut self) -> Result<DateTime> {
216 let nanos = self.read_u64()?;
217 Ok(DateTime::from_nanos(nanos))
218 }
219
220 pub fn read_time(&mut self) -> Result<Time> {
221 let nanos = self.read_u64()?;
222 Time::from_nanos_since_midnight(nanos).ok_or_else(|| {
223 Error::from(TypeError::SerdeKeycode {
224 message: format!(
225 "invalid time at position {}: {} nanos since midnight",
226 self.position, nanos
227 ),
228 })
229 })
230 }
231
232 pub fn read_duration(&mut self) -> Result<Duration> {
233 let months = self.read_i32()?;
234 let days = self.read_i32()?;
235 let nanos = self.read_i64()?;
236 Ok(Duration::new(months, days, nanos)?)
237 }
238
239 pub fn read_row_number(&mut self) -> Result<RowNumber> {
240 let value = self.read_u64()?;
241 Ok(RowNumber(value))
242 }
243
244 pub fn read_identity_id(&mut self) -> Result<IdentityId> {
245 let bytes = self.read_bytes()?;
246 let uuid = Uuid::from_slice(&bytes).map_err(|e| {
247 Error::from(TypeError::SerdeKeycode {
248 message: format!("invalid IdentityId at position {}: {}", self.position, e),
249 })
250 })?;
251 Ok(IdentityId::from(Uuid7::from(uuid)))
252 }
253
254 pub fn read_uuid4(&mut self) -> Result<Uuid4> {
255 let bytes = self.read_bytes()?;
256 let uuid = Uuid::from_slice(&bytes).map_err(|e| {
257 Error::from(TypeError::SerdeKeycode {
258 message: format!("invalid Uuid4 at position {}: {}", self.position, e),
259 })
260 })?;
261 Ok(Uuid4::from(uuid))
262 }
263
264 pub fn read_uuid7(&mut self) -> Result<Uuid7> {
265 let bytes = self.read_bytes()?;
266 let uuid = Uuid::from_slice(&bytes).map_err(|e| {
267 Error::from(TypeError::SerdeKeycode {
268 message: format!("invalid Uuid7 at position {}: {}", self.position, e),
269 })
270 })?;
271 Ok(Uuid7::from(uuid))
272 }
273
274 pub fn read_blob(&mut self) -> Result<Blob> {
275 let bytes = self.read_bytes()?;
276 Ok(Blob::from(bytes))
277 }
278
279 pub fn read_int(&mut self) -> Result<Int> {
280 let sign = self.read_exact(1)?[0];
281 let len = self.read_u32()? as usize;
282 let bytes = self.read_exact(len)?;
283
284 let sign = match sign {
285 0 => Sign::Minus,
286 _ => Sign::Plus,
287 };
288
289 Ok(Int(BigInt::from_bytes_be(sign, bytes)))
290 }
291
292 pub fn read_uint(&mut self) -> Result<Uint> {
293 let len = self.read_u32()? as usize;
294 let bytes = self.read_exact(len)?;
295 Ok(Uint(BigInt::from_bytes_be(Sign::Plus, bytes)))
296 }
297
298 pub fn read_decimal(&mut self) -> Result<Decimal> {
299 let s = self.read_str()?;
300 s.parse::<Decimal>().map_err(|e| {
301 Error::from(TypeError::SerdeKeycode {
302 message: format!("invalid Decimal at position {}: {}", self.position, e),
303 })
304 })
305 }
306
307 pub fn read_value(&mut self) -> Result<Value> {
308 if self.remaining() < 1 {
309 return Err(Error::from(TypeError::SerdeKeycode {
310 message: format!(
311 "unexpected end of key at position {}: cannot read value type",
312 self.position
313 ),
314 }));
315 }
316
317 let type_marker = self.buffer[self.position];
318 self.position += 1;
319
320 match type_marker {
321 0x00 => {
322 if self.remaining() < 1 {
323 return Ok(Value::none());
324 }
325 let inner_marker = self.buffer[self.position];
326 self.position += 1;
327 let inner = match inner_marker {
328 0x01 => Type::Boolean,
329 0x02 => Type::Float4,
330 0x03 => Type::Float8,
331 0x04 => Type::Int1,
332 0x05 => Type::Int2,
333 0x06 => Type::Int4,
334 0x07 => Type::Int8,
335 0x08 => Type::Int16,
336 0x09 => Type::Utf8,
337 0x0a => Type::Uint1,
338 0x0b => Type::Uint2,
339 0x0c => Type::Uint4,
340 0x0d => Type::Uint8,
341 0x0e => Type::Uint16,
342 0x0f => Type::Date,
343 0x10 => Type::DateTime,
344 0x11 => Type::Time,
345 0x12 => Type::Duration,
346 0x14 => Type::IdentityId,
347 0x15 => Type::Uuid4,
348 0x16 => Type::Uuid7,
349 0x17 => Type::Blob,
350 0x18 => Type::Int,
351 0x19 => Type::Uint,
352 0x1a => Type::Decimal,
353 0x1b => Type::DictionaryId,
354 _ => Type::Any,
355 };
356 Ok(Value::none_of(inner))
357 }
358 0x01 => {
359 let b = self.read_bool()?;
360 Ok(Value::Boolean(b))
361 }
362 0x02 => {
363 let f = self.read_f32()?;
364 Ok(Value::Float4(OrderedF32::try_from(f).map_err(|e| {
365 Error::from(TypeError::SerdeKeycode {
366 message: format!("invalid f32 at position {}: {}", self.position, e),
367 })
368 })?))
369 }
370 0x03 => {
371 let f = self.read_f64()?;
372 Ok(Value::Float8(OrderedF64::try_from(f).map_err(|e| {
373 Error::from(TypeError::SerdeKeycode {
374 message: format!("invalid f64 at position {}: {}", self.position, e),
375 })
376 })?))
377 }
378 0x04 => {
379 let i = self.read_i8()?;
380 Ok(Value::Int1(i))
381 }
382 0x05 => {
383 let i = self.read_i16()?;
384 Ok(Value::Int2(i))
385 }
386 0x06 => {
387 let i = self.read_i32()?;
388 Ok(Value::Int4(i))
389 }
390 0x07 => {
391 let i = self.read_i64()?;
392 Ok(Value::Int8(i))
393 }
394 0x08 => {
395 let i = self.read_i128()?;
396 Ok(Value::Int16(i))
397 }
398 0x09 => {
399 let s = self.read_str()?;
400 Ok(Value::Utf8(s))
401 }
402 0x0a => {
403 let u = self.read_u8()?;
404 Ok(Value::Uint1(u))
405 }
406 0x0b => {
407 let u = self.read_u16()?;
408 Ok(Value::Uint2(u))
409 }
410 0x0c => {
411 let u = self.read_u32()?;
412 Ok(Value::Uint4(u))
413 }
414 0x0d => {
415 let u = self.read_u64()?;
416 Ok(Value::Uint8(u))
417 }
418 0x0e => {
419 let u = self.read_u128()?;
420 Ok(Value::Uint16(u))
421 }
422 0x0f => {
423 let d = self.read_date()?;
424 Ok(Value::Date(d))
425 }
426 0x10 => {
427 let dt = self.read_datetime()?;
428 Ok(Value::DateTime(dt))
429 }
430 0x11 => {
431 let t = self.read_time()?;
432 Ok(Value::Time(t))
433 }
434 0x12 => {
435 let i = self.read_duration()?;
436 Ok(Value::Duration(i))
437 }
438 0x13 => panic!("Type code 0x13 (RowNumber) is no longer supported"),
440 0x14 => {
441 let id = self.read_identity_id()?;
442 Ok(Value::IdentityId(id))
443 }
444 0x15 => {
445 let u = self.read_uuid4()?;
446 Ok(Value::Uuid4(u))
447 }
448 0x16 => {
449 let u = self.read_uuid7()?;
450 Ok(Value::Uuid7(u))
451 }
452 0x17 => {
453 let b = self.read_blob()?;
454 Ok(Value::Blob(b))
455 }
456 0x18 => {
457 let i = self.read_int()?;
458 Ok(Value::Int(i))
459 }
460 0x19 => {
461 let u = self.read_uint()?;
462 Ok(Value::Uint(u))
463 }
464 0x1a => {
465 let d = self.read_decimal()?;
466 Ok(Value::Decimal(d))
467 }
468 0x1b => {
469 let sub = self.read_exact(1)?[0];
470 match sub {
471 0x00 => Ok(Value::DictionaryId(DictionaryEntryId::U1(self.read_u8()?))),
472 0x01 => Ok(Value::DictionaryId(DictionaryEntryId::U2(self.read_u16()?))),
473 0x02 => Ok(Value::DictionaryId(DictionaryEntryId::U4(self.read_u32()?))),
474 0x03 => Ok(Value::DictionaryId(DictionaryEntryId::U8(self.read_u64()?))),
475 0x04 => Ok(Value::DictionaryId(DictionaryEntryId::U16(self.read_u128()?))),
476 _ => Err(Error::from(TypeError::SerdeKeycode {
477 message: format!(
478 "unknown DictionaryEntryId sub-marker 0x{:02x} at position {}",
479 sub,
480 self.position - 1
481 ),
482 })),
483 }
484 }
485 _ => Err(Error::from(TypeError::SerdeKeycode {
486 message: format!(
487 "unknown value type marker 0x{:02x} at position {}",
488 type_marker,
489 self.position - 1
490 ),
491 })),
492 }
493 }
494
495 pub fn read_raw(&mut self, count: usize) -> Result<&'a [u8]> {
496 self.read_exact(count)
497 }
498}
499
500#[cfg(test)]
501pub mod tests {
502 use std::f64::consts::E;
503
504 use reifydb_type::value::{
505 date::Date, datetime::DateTime, duration::Duration, row_number::RowNumber, time::Time,
506 };
507
508 use crate::{
509 interface::catalog::{id::IndexId, schema::SchemaId},
510 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
511 };
512
513 #[test]
514 fn test_read_bool() {
515 let mut ser = KeySerializer::new();
516 ser.extend_bool(true).extend_bool(false);
517 let bytes = ser.finish();
518
519 let mut de = KeyDeserializer::from_bytes(&bytes);
520 assert_eq!(de.read_bool().unwrap(), true);
521 assert_eq!(de.read_bool().unwrap(), false);
522 assert!(de.is_empty());
523 }
524
525 #[test]
526 fn test_read_integers() {
527 let mut ser = KeySerializer::new();
528 ser.extend_i8(-42i8).extend_i16(-1000i16).extend_i32(100000i32).extend_i64(-1000000000i64);
529 let bytes = ser.finish();
530
531 let mut de = KeyDeserializer::from_bytes(&bytes);
532 assert_eq!(de.read_i8().unwrap(), -42);
533 assert_eq!(de.read_i16().unwrap(), -1000);
534 assert_eq!(de.read_i32().unwrap(), 100000);
535 assert_eq!(de.read_i64().unwrap(), -1000000000);
536 assert!(de.is_empty());
537 }
538
539 #[test]
540 fn test_read_unsigned() {
541 let mut ser = KeySerializer::new();
542 ser.extend_u8(255u8).extend_u16(65535u16).extend_u32(4294967295u32).extend_u64(18446744073709551615u64);
543 let bytes = ser.finish();
544
545 let mut de = KeyDeserializer::from_bytes(&bytes);
546 assert_eq!(de.read_u8().unwrap(), 255);
547 assert_eq!(de.read_u16().unwrap(), 65535);
548 assert_eq!(de.read_u32().unwrap(), 4294967295);
549 assert_eq!(de.read_u64().unwrap(), 18446744073709551615);
550 assert!(de.is_empty());
551 }
552
553 #[test]
554 fn test_read_floats() {
555 let mut ser = KeySerializer::new();
556 ser.extend_f32(3.14).extend_f64(E);
557 let bytes = ser.finish();
558
559 let mut de = KeyDeserializer::from_bytes(&bytes);
560 assert!((de.read_f32().unwrap() - 3.14).abs() < 0.001);
561 assert!((de.read_f64().unwrap() - E).abs() < 0.000001);
562 assert!(de.is_empty());
563 }
564
565 #[test]
566 fn test_read_bytes() {
567 let mut ser = KeySerializer::new();
568 ser.extend_bytes(b"hello").extend_bytes(&[0x01, 0xff, 0x02]);
569 let bytes = ser.finish();
570
571 let mut de = KeyDeserializer::from_bytes(&bytes);
572 assert_eq!(de.read_bytes().unwrap(), b"hello");
573 assert_eq!(de.read_bytes().unwrap(), vec![0x01, 0xff, 0x02]);
574 assert!(de.is_empty());
575 }
576
577 #[test]
578 fn test_read_str() {
579 let mut ser = KeySerializer::new();
580 ser.extend_str("hello world").extend_str("👋");
581 let bytes = ser.finish();
582
583 let mut de = KeyDeserializer::from_bytes(&bytes);
584 assert_eq!(de.read_str().unwrap(), "hello world");
585 assert_eq!(de.read_str().unwrap(), "👋");
586 assert!(de.is_empty());
587 }
588
589 #[test]
590 fn test_read_date() {
591 let mut ser = KeySerializer::new();
592 let date = Date::from_ymd(2024, 1, 1).unwrap();
593 ser.extend_date(&date);
594 let bytes = ser.finish();
595
596 let mut de = KeyDeserializer::from_bytes(&bytes);
597 assert_eq!(de.read_date().unwrap(), date);
598 assert!(de.is_empty());
599 }
600
601 #[test]
602 fn test_read_datetime() {
603 let mut ser = KeySerializer::new();
604 let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 30, 45).unwrap();
605 ser.extend_datetime(&datetime);
606 let bytes = ser.finish();
607
608 let mut de = KeyDeserializer::from_bytes(&bytes);
609 assert_eq!(de.read_datetime().unwrap(), datetime);
610 assert!(de.is_empty());
611 }
612
613 #[test]
614 fn test_read_time() {
615 let mut ser = KeySerializer::new();
616 let time = Time::from_hms(12, 30, 45).unwrap();
617 ser.extend_time(&time);
618 let bytes = ser.finish();
619
620 let mut de = KeyDeserializer::from_bytes(&bytes);
621 assert_eq!(de.read_time().unwrap(), time);
622 assert!(de.is_empty());
623 }
624
625 #[test]
626 fn test_read_duration() {
627 let mut ser = KeySerializer::new();
628 let duration = Duration::from_nanoseconds(1000000).unwrap();
629 ser.extend_duration(&duration);
630 let bytes = ser.finish();
631
632 let mut de = KeyDeserializer::from_bytes(&bytes);
633 assert_eq!(de.read_duration().unwrap(), duration);
634 assert!(de.is_empty());
635 }
636
637 #[test]
638 fn test_keycode_roundtrip_with_months_and_days() {
639 let mut ser = KeySerializer::new();
640 let duration = Duration::new(12, 5, 1_000_000_000).unwrap();
641 ser.extend_duration(&duration);
642 let bytes = ser.finish();
643
644 let mut de = KeyDeserializer::from_bytes(&bytes);
645 assert_eq!(de.read_duration().unwrap(), duration);
646 assert!(de.is_empty());
647 }
648
649 #[test]
650 fn test_keycode_different_durations_produce_different_keys() {
651 let d1 = Duration::new(12, 0, 0).unwrap();
652 let d2 = Duration::zero();
653
654 let mut s1 = KeySerializer::new();
655 s1.extend_duration(&d1);
656 let b1 = s1.finish();
657
658 let mut s2 = KeySerializer::new();
659 s2.extend_duration(&d2);
660 let b2 = s2.finish();
661
662 assert_ne!(b1, b2);
663 }
664
665 #[test]
666 fn test_keycode_duration_ordering_preserved() {
667 let durations = vec![
669 Duration::new(0, 0, 0).unwrap(),
670 Duration::new(0, 0, 1_000_000_000).unwrap(),
671 Duration::new(0, 1, 0).unwrap(),
672 Duration::new(1, 0, 0).unwrap(),
673 Duration::new(12, 30, 0).unwrap(),
674 ];
675
676 let keys: Vec<Vec<u8>> = durations
677 .iter()
678 .map(|d| {
679 let mut ser = KeySerializer::new();
680 ser.extend_duration(d);
681 ser.finish()
682 })
683 .collect();
684
685 for i in 0..keys.len() - 1 {
686 assert!(
687 keys[i] > keys[i + 1],
688 "Key ordering broken: {:?} key should be > {:?} key (descending encoding)",
689 durations[i],
690 durations[i + 1]
691 );
692 }
693 }
694
695 #[test]
696 fn test_read_row_number() {
697 let mut ser = KeySerializer::new();
698 let row = RowNumber(42);
699 ser.extend_row_number(&row);
700 let bytes = ser.finish();
701
702 let mut de = KeyDeserializer::from_bytes(&bytes);
703 assert_eq!(de.read_row_number().unwrap(), row);
704 assert!(de.is_empty());
705 }
706
707 #[test]
708 fn test_read_schema_id() {
709 let mut ser = KeySerializer::new();
710 let primitive = SchemaId::table(42);
711 ser.extend_schema_id(primitive);
712 let bytes = ser.finish();
713
714 let mut de = KeyDeserializer::from_bytes(&bytes);
715 assert_eq!(de.read_schema_id().unwrap(), primitive);
716 assert!(de.is_empty());
717 }
718
719 #[test]
720 fn test_read_index_id() {
721 let mut ser = KeySerializer::new();
722 let index = IndexId::primary(999);
723 ser.extend_index_id(index);
724 let bytes = ser.finish();
725
726 let mut de = KeyDeserializer::from_bytes(&bytes);
727 assert_eq!(de.read_index_id().unwrap(), index);
728 assert!(de.is_empty());
729 }
730
731 #[test]
732 fn test_position_tracking() {
733 let mut ser = KeySerializer::new();
734 ser.extend_u8(1u8).extend_u16(2u16).extend_u32(3u32);
735 let bytes = ser.finish();
736
737 let mut de = KeyDeserializer::from_bytes(&bytes);
738 assert_eq!(de.position(), 0);
739 assert_eq!(de.remaining(), 7);
740
741 de.read_u8().unwrap();
742 assert_eq!(de.position(), 1);
743 assert_eq!(de.remaining(), 6);
744
745 de.read_u16().unwrap();
746 assert_eq!(de.position(), 3);
747 assert_eq!(de.remaining(), 4);
748
749 de.read_u32().unwrap();
750 assert_eq!(de.position(), 7);
751 assert_eq!(de.remaining(), 0);
752 assert!(de.is_empty());
753 }
754
755 #[test]
756 fn test_error_on_insufficient_bytes() {
757 let bytes = vec![0x00, 0x01];
758 let mut de = KeyDeserializer::from_bytes(&bytes);
759 assert!(de.read_u32().is_err());
760 }
761
762 #[test]
763 fn test_chaining() {
764 let mut ser = KeySerializer::new();
765 ser.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
766 let bytes = ser.finish();
767
768 let mut de = KeyDeserializer::from_bytes(&bytes);
769 assert_eq!(de.read_bool().unwrap(), true);
770 assert_eq!(de.read_i32().unwrap(), 42);
771 assert_eq!(de.read_str().unwrap(), "test");
772 assert_eq!(de.read_u64().unwrap(), 1000);
773 assert!(de.is_empty());
774 }
775}