reifydb_core/util/encoding/keycode/
deserializer.rs

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