1use 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}