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