Skip to main content

reifydb_core/util/encoding/keycode/
deserializer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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 was RowNumber, now reserved
439			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		// Keycode encoding is descending: larger Duration → smaller bytes
668		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}