reifydb_core/util/encoding/keycode/
deserializer.rs1use 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}