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, 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		// Keycode encoding is descending: larger Duration → smaller bytes
683		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}