Skip to main content

reifydb_codec/key/
deserializer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use num_bigint::{BigInt, Sign};
5use reifydb_value::{
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		uint::Uint,
23		uuid::{Uuid4, Uuid7},
24	},
25};
26use uuid::Uuid;
27
28use super::{CONTAINER_END, decode_u128_varint, deserialize};
29use crate::tag::{TypeTag, ValueKind};
30
31pub struct KeyDeserializer<'a> {
32	buffer: &'a [u8],
33	position: usize,
34}
35
36impl<'a> KeyDeserializer<'a> {
37	pub fn from_bytes(buffer: &'a [u8]) -> Self {
38		Self {
39			buffer,
40			position: 0,
41		}
42	}
43
44	pub fn remaining(&self) -> usize {
45		self.buffer.len().saturating_sub(self.position)
46	}
47
48	pub fn is_empty(&self) -> bool {
49		self.remaining() == 0
50	}
51
52	pub fn position(&self) -> usize {
53		self.position
54	}
55
56	pub fn remaining_bytes(&self) -> &'a [u8] {
57		&self.buffer[self.position..]
58	}
59
60	fn read_exact(&mut self, count: usize) -> Result<&'a [u8]> {
61		if self.remaining() < count {
62			return Err(Error::from(TypeError::SerdeKeycode {
63				message: format!(
64					"unexpected end of key at position {}: need {} bytes, have {}",
65					self.position,
66					count,
67					self.remaining()
68				),
69			}));
70		}
71		let start = self.position;
72		self.position += count;
73		Ok(&self.buffer[start..self.position])
74	}
75
76	pub fn read_bool(&mut self) -> Result<bool> {
77		let bytes = self.read_exact(1)?;
78		deserialize::<bool>(bytes)
79	}
80
81	pub fn read_f32(&mut self) -> Result<f32> {
82		let bytes = self.read_exact(4)?;
83		deserialize::<f32>(bytes)
84	}
85
86	pub fn read_f64(&mut self) -> Result<f64> {
87		let bytes = self.read_exact(8)?;
88		deserialize::<f64>(bytes)
89	}
90
91	pub fn read_i8(&mut self) -> Result<i8> {
92		let bytes = self.read_exact(1)?;
93		deserialize::<i8>(bytes)
94	}
95
96	pub fn read_i16(&mut self) -> Result<i16> {
97		let bytes = self.read_exact(2)?;
98		deserialize::<i16>(bytes)
99	}
100
101	pub fn read_i32(&mut self) -> Result<i32> {
102		let bytes = self.read_exact(4)?;
103		deserialize::<i32>(bytes)
104	}
105
106	pub fn read_i64(&mut self) -> Result<i64> {
107		let bytes = self.read_exact(8)?;
108		deserialize::<i64>(bytes)
109	}
110
111	pub fn read_i128(&mut self) -> Result<i128> {
112		let bytes = self.read_exact(16)?;
113		deserialize::<i128>(bytes)
114	}
115
116	pub fn read_u8(&mut self) -> Result<u8> {
117		let bytes = self.read_exact(1)?;
118		deserialize::<u8>(bytes)
119	}
120
121	pub fn read_u16(&mut self) -> Result<u16> {
122		let bytes = self.read_exact(2)?;
123		deserialize::<u16>(bytes)
124	}
125
126	pub fn read_u32(&mut self) -> Result<u32> {
127		let bytes = self.read_exact(4)?;
128		deserialize::<u32>(bytes)
129	}
130
131	pub fn read_u64(&mut self) -> Result<u64> {
132		let bytes = self.read_exact(8)?;
133		deserialize::<u64>(bytes)
134	}
135
136	pub fn read_u128(&mut self) -> Result<u128> {
137		let bytes = self.read_exact(16)?;
138		deserialize::<u128>(bytes)
139	}
140
141	pub fn read_u128_varint(&mut self) -> Result<u128> {
142		let mut slice = &self.buffer[self.position..];
143		let u = decode_u128_varint(&mut slice)?;
144		self.position = self.buffer.len() - slice.len();
145		Ok(u)
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_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	fn at_container_end(&mut self) -> Result<bool> {
308		if self.remaining() < 1 {
309			return Err(Error::from(TypeError::SerdeKeycode {
310				message: format!(
311					"unexpected end of key at position {}: container not terminated",
312					self.position
313				),
314			}));
315		}
316		if self.buffer[self.position] == CONTAINER_END {
317			self.position += 1;
318			return Ok(true);
319		}
320		Ok(false)
321	}
322
323	fn read_container_items(&mut self) -> Result<Vec<Value>> {
324		let mut items = Vec::new();
325		while !self.at_container_end()? {
326			items.push(self.read_value()?);
327		}
328		Ok(items)
329	}
330
331	fn read_record_fields(&mut self) -> Result<Vec<(String, Value)>> {
332		let mut fields = Vec::new();
333		while !self.at_container_end()? {
334			let name = self.read_str()?;
335			fields.push((name, self.read_value()?));
336		}
337		Ok(fields)
338	}
339
340	pub fn read_value(&mut self) -> Result<Value> {
341		if self.remaining() < 1 {
342			return Err(Error::from(TypeError::SerdeKeycode {
343				message: format!(
344					"unexpected end of key at position {}: cannot read value type",
345					self.position
346				),
347			}));
348		}
349
350		let type_marker = self.buffer[self.position];
351		self.position += 1;
352
353		let kind = ValueKind::from_byte(type_marker).ok_or_else(|| {
354			Error::from(TypeError::SerdeKeycode {
355				message: format!(
356					"unknown value type marker 0x{:02x} at position {}",
357					type_marker,
358					self.position - 1
359				),
360			})
361		})?;
362
363		match kind {
364			ValueKind::None => {
365				if self.remaining() < 1 {
366					return Ok(Value::none());
367				}
368				let inner_marker = self.buffer[self.position];
369				self.position += 1;
370				let inner = TypeTag::from_byte(inner_marker)
371					.map_err(|e| {
372						Error::from(TypeError::SerdeKeycode {
373							message: format!(
374								"invalid none inner type byte 0x{:02x} at position {}: {}",
375								inner_marker,
376								self.position - 1,
377								e
378							),
379						})
380					})?
381					.to_type()
382					.map_err(|e| {
383						Error::from(TypeError::SerdeKeycode {
384							message: format!(
385								"invalid none inner type byte 0x{:02x} at position {}: {}",
386								inner_marker,
387								self.position - 1,
388								e
389							),
390						})
391					})?;
392				Ok(Value::none_of(inner))
393			}
394			ValueKind::Float4 => {
395				let f = self.read_f32()?;
396				Ok(Value::Float4(OrderedF32::try_from(f).map_err(|e| {
397					Error::from(TypeError::SerdeKeycode {
398						message: format!("invalid f32 at position {}: {}", self.position, e),
399					})
400				})?))
401			}
402			ValueKind::Float8 => {
403				let f = self.read_f64()?;
404				Ok(Value::Float8(OrderedF64::try_from(f).map_err(|e| {
405					Error::from(TypeError::SerdeKeycode {
406						message: format!("invalid f64 at position {}: {}", self.position, e),
407					})
408				})?))
409			}
410			ValueKind::Boolean => Ok(Value::Boolean(self.read_bool()?)),
411			ValueKind::Int1 => Ok(Value::Int1(self.read_i8()?)),
412			ValueKind::Int2 => Ok(Value::Int2(self.read_i16()?)),
413			ValueKind::Int4 => Ok(Value::Int4(self.read_i32()?)),
414			ValueKind::Int8 => Ok(Value::Int8(self.read_i64()?)),
415			ValueKind::Int16 => Ok(Value::Int16(self.read_i128()?)),
416			ValueKind::Utf8 => Ok(Value::Utf8(self.read_str()?)),
417			ValueKind::Uint1 => Ok(Value::Uint1(self.read_u8()?)),
418			ValueKind::Uint2 => Ok(Value::Uint2(self.read_u16()?)),
419			ValueKind::Uint4 => Ok(Value::Uint4(self.read_u32()?)),
420			ValueKind::Uint8 => Ok(Value::Uint8(self.read_u64()?)),
421			ValueKind::Uint16 => Ok(Value::Uint16(self.read_u128()?)),
422			ValueKind::Date => Ok(Value::Date(self.read_date()?)),
423			ValueKind::DateTime => Ok(Value::DateTime(self.read_datetime()?)),
424			ValueKind::Time => Ok(Value::Time(self.read_time()?)),
425			ValueKind::Duration => Ok(Value::Duration(self.read_duration()?)),
426			ValueKind::IdentityId => Ok(Value::IdentityId(self.read_identity_id()?)),
427			ValueKind::Uuid4 => Ok(Value::Uuid4(self.read_uuid4()?)),
428			ValueKind::Uuid7 => Ok(Value::Uuid7(self.read_uuid7()?)),
429			ValueKind::Blob => Ok(Value::Blob(self.read_blob()?)),
430			ValueKind::Int => Ok(Value::Int(self.read_int()?)),
431			ValueKind::Uint => Ok(Value::Uint(self.read_uint()?)),
432			ValueKind::Decimal => Ok(Value::Decimal(self.read_decimal()?)),
433			ValueKind::List => Ok(Value::List(self.read_container_items()?)),
434			ValueKind::Tuple => Ok(Value::Tuple(self.read_container_items()?)),
435			ValueKind::Record => Ok(Value::Record(self.read_record_fields()?)),
436			ValueKind::Any | ValueKind::Type => Err(Error::from(TypeError::SerdeKeycode {
437				message: format!(
438					"value kind {:?} cannot be deserialized from keys (position {})",
439					kind,
440					self.position - 1
441				),
442			})),
443			ValueKind::DictionaryId => {
444				let sub = self.read_exact(1)?[0];
445				match sub {
446					0x00 => Ok(Value::DictionaryId(DictionaryEntryId::U1(self.read_u8()?))),
447					0x01 => Ok(Value::DictionaryId(DictionaryEntryId::U2(self.read_u16()?))),
448					0x02 => Ok(Value::DictionaryId(DictionaryEntryId::U4(self.read_u32()?))),
449					0x03 => Ok(Value::DictionaryId(DictionaryEntryId::U8(self.read_u64()?))),
450					0x04 => Ok(Value::DictionaryId(DictionaryEntryId::U16(self.read_u128()?))),
451					_ => Err(Error::from(TypeError::SerdeKeycode {
452						message: format!(
453							"unknown DictionaryEntryId sub-marker 0x{:02x} at position {}",
454							sub,
455							self.position - 1
456						),
457					})),
458				}
459			}
460		}
461	}
462
463	pub fn read_raw(&mut self, count: usize) -> Result<&'a [u8]> {
464		self.read_exact(count)
465	}
466}