facet_msgpack/
deserialize.rs1use crate::constants::*;
2use crate::errors::Error as DecodeError;
3
4use facet_core::{Def, Facet, Type, UserType};
5use facet_reflect::{HeapValue, Wip};
6use log::trace;
7
8pub fn from_slice<'input: 'facet, 'facet, T: Facet<'facet>>(
32 msgpack: &'input [u8],
33) -> Result<T, DecodeError<'static>> {
34 from_slice_value(msgpack, Wip::alloc::<T>()?)?
35 .materialize::<T>()
36 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
37}
38
39pub fn from_slice_value<'facet, 'shape>(
79 msgpack: &[u8],
80 wip: Wip<'facet, 'shape>,
81) -> Result<HeapValue<'facet, 'shape>, DecodeError<'shape>> {
82 let mut decoder = Decoder::new(msgpack);
83 decoder
84 .deserialize_value(wip)?
85 .build()
86 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
87}
88
89struct Decoder<'input> {
90 input: &'input [u8],
91 offset: usize,
92}
93
94impl<'input, 'shape> Decoder<'input> {
95 fn new(input: &'input [u8]) -> Self {
96 Decoder { input, offset: 0 }
97 }
98
99 fn decode_u8(&mut self) -> Result<u8, DecodeError<'static>> {
102 if self.offset >= self.input.len() {
103 return Err(DecodeError::InsufficientData);
104 }
105 let value = self.input[self.offset];
106 self.offset += 1;
107 Ok(value)
108 }
109
110 fn decode_u16(&mut self) -> Result<u16, DecodeError<'static>> {
113 if self.offset + 2 > self.input.len() {
114 return Err(DecodeError::InsufficientData);
115 }
116 let value =
117 u16::from_be_bytes(self.input[self.offset..self.offset + 2].try_into().unwrap());
118 self.offset += 2;
119 Ok(value)
120 }
121
122 fn decode_u32(&mut self) -> Result<u32, DecodeError<'static>> {
125 if self.offset + 4 > self.input.len() {
126 return Err(DecodeError::InsufficientData);
127 }
128 let value =
129 u32::from_be_bytes(self.input[self.offset..self.offset + 4].try_into().unwrap());
130 self.offset += 4;
131 Ok(value)
132 }
133
134 fn decode_u64(&mut self) -> Result<u64, DecodeError<'static>> {
144 match self.decode_u8()? {
145 MSGPACK_UINT8 => Ok(self.decode_u8()? as u64),
146 MSGPACK_UINT16 => Ok(self.decode_u16()? as u64),
147 MSGPACK_UINT32 => Ok(self.decode_u32()? as u64),
148 MSGPACK_UINT64 => {
149 if self.offset + 8 > self.input.len() {
150 return Err(DecodeError::InsufficientData);
151 }
152 let value = u64::from_be_bytes(
153 self.input[self.offset..self.offset + 8].try_into().unwrap(),
154 );
155 self.offset += 8;
156 Ok(value)
157 }
158 prefix @ MSGPACK_POSFIXINT_MIN..=MSGPACK_POSFIXINT_MAX => Ok(prefix as u64),
159 _ => Err(DecodeError::UnexpectedType),
160 }
161 }
162
163 fn decode_string(&mut self) -> Result<String, DecodeError<'static>> {
172 let prefix = self.decode_u8()?;
173
174 let len = match prefix {
175 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => (prefix & 0x1f) as usize,
176 MSGPACK_STR8 => self.decode_u8()? as usize,
177 MSGPACK_STR16 => self.decode_u16()? as usize,
178 MSGPACK_STR32 => self.decode_u32()? as usize,
179 _ => return Err(DecodeError::UnexpectedType),
180 };
181
182 if self.offset + len > self.input.len() {
183 return Err(DecodeError::InsufficientData);
184 }
185
186 let value = String::from_utf8(self.input[self.offset..self.offset + len].to_vec())
187 .map_err(|_| DecodeError::InvalidData)?;
188 self.offset += len;
189 Ok(value)
190 }
191
192 fn decode_map_len(&mut self) -> Result<usize, DecodeError<'static>> {
200 let prefix = self.decode_u8()?;
201
202 match prefix {
203 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => Ok((prefix & 0x0f) as usize),
204 MSGPACK_MAP16 => Ok(self.decode_u16()? as usize),
205 MSGPACK_MAP32 => Ok(self.decode_u32()? as usize),
206 _ => Err(DecodeError::UnexpectedType),
207 }
208 }
209
210 #[allow(dead_code)]
218 fn decode_array_len(&mut self) -> Result<usize, DecodeError<'static>> {
219 let prefix = self.decode_u8()?;
220
221 match prefix {
222 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => Ok((prefix & 0x0f) as usize),
223 MSGPACK_ARRAY16 => Ok(self.decode_u16()? as usize),
224 MSGPACK_ARRAY32 => Ok(self.decode_u32()? as usize),
225 _ => Err(DecodeError::UnexpectedType),
226 }
227 }
228
229 fn decode_bool(&mut self) -> Result<bool, DecodeError<'static>> {
236 match self.decode_u8()? {
237 MSGPACK_TRUE => Ok(true),
238 MSGPACK_FALSE => Ok(false),
239 _ => Err(DecodeError::UnexpectedType),
240 }
241 }
242
243 #[allow(dead_code)]
249 fn decode_nil(&mut self) -> Result<(), DecodeError<'static>> {
250 match self.decode_u8()? {
251 MSGPACK_NIL => Ok(()),
252 _ => Err(DecodeError::UnexpectedType),
253 }
254 }
255
256 #[allow(dead_code)]
259 fn peek_nil(&mut self) -> Result<bool, DecodeError<'static>> {
260 if self.offset >= self.input.len() {
261 return Err(DecodeError::InsufficientData);
262 }
263 Ok(self.input[self.offset] == MSGPACK_NIL)
264 }
265
266 fn peek_string(&mut self) -> Result<bool, DecodeError<'static>> {
269 if self.offset >= self.input.len() {
270 return Err(DecodeError::InsufficientData);
271 }
272 let prefix = self.input[self.offset];
273 Ok((MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX).contains(&prefix)
274 || prefix == MSGPACK_STR8
275 || prefix == MSGPACK_STR16
276 || prefix == MSGPACK_STR32)
277 }
278
279 fn skip_value(&mut self) -> Result<(), DecodeError<'static>> {
282 let prefix = self.decode_u8()?;
283
284 match prefix {
285 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => {
287 let len = (prefix & 0x1f) as usize;
288 if self.offset + len > self.input.len() {
289 return Err(DecodeError::InsufficientData);
290 }
291 self.offset += len;
292 Ok(())
293 }
294 MSGPACK_STR8 => {
295 let len = self.decode_u8()? as usize;
296 if self.offset + len > self.input.len() {
297 return Err(DecodeError::InsufficientData);
298 }
299 self.offset += len;
300 Ok(())
301 }
302 MSGPACK_STR16 => {
303 let len = self.decode_u16()? as usize;
304 if self.offset + len > self.input.len() {
305 return Err(DecodeError::InsufficientData);
306 }
307 self.offset += len;
308 Ok(())
309 }
310 MSGPACK_STR32 => {
311 let len = self.decode_u32()? as usize;
312 if self.offset + len > self.input.len() {
313 return Err(DecodeError::InsufficientData);
314 }
315 self.offset += len;
316 Ok(())
317 }
318
319 MSGPACK_UINT8 => {
321 self.offset += 1;
322 Ok(())
323 }
324 MSGPACK_UINT16 => {
325 self.offset += 2;
326 Ok(())
327 }
328 MSGPACK_UINT32 => {
329 self.offset += 4;
330 Ok(())
331 }
332 MSGPACK_UINT64 => {
333 self.offset += 8;
334 Ok(())
335 }
336 MSGPACK_INT8 => {
337 self.offset += 1;
338 Ok(())
339 }
340 MSGPACK_INT16 => {
341 self.offset += 2;
342 Ok(())
343 }
344 MSGPACK_INT32 => {
345 self.offset += 4;
346 Ok(())
347 }
348 MSGPACK_INT64 => {
349 self.offset += 8;
350 Ok(())
351 }
352 MSGPACK_NIL | MSGPACK_TRUE | MSGPACK_FALSE => Ok(()),
356
357 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => {
359 let len = (prefix & 0x0f) as usize;
360 for _ in 0..len {
361 self.skip_value()?; self.skip_value()?; }
364 Ok(())
365 }
366 MSGPACK_MAP16 => {
367 let len = self.decode_u16()? as usize;
368 for _ in 0..len {
369 self.skip_value()?; self.skip_value()?; }
372 Ok(())
373 }
374 MSGPACK_MAP32 => {
375 let len = self.decode_u32()? as usize;
376 for _ in 0..len {
377 self.skip_value()?; self.skip_value()?; }
380 Ok(())
381 }
382
383 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => {
385 let len = (prefix & 0x0f) as usize;
386 for _ in 0..len {
387 self.skip_value()?;
388 }
389 Ok(())
390 }
391 MSGPACK_ARRAY16 => {
392 let len = self.decode_u16()? as usize;
393 for _ in 0..len {
394 self.skip_value()?;
395 }
396 Ok(())
397 }
398 MSGPACK_ARRAY32 => {
399 let len = self.decode_u32()? as usize;
400 for _ in 0..len {
401 self.skip_value()?;
402 }
403 Ok(())
404 }
405
406 _ => Err(DecodeError::UnexpectedType),
407 }
408 }
409
410 fn deserialize_value<'facet>(
411 &mut self,
412 mut wip: Wip<'facet, 'shape>,
413 ) -> Result<Wip<'facet, 'shape>, DecodeError<'shape>> {
414 let shape = wip.shape();
415 trace!("Deserializing {:?}", shape);
416
417 match &shape.ty {
419 Type::User(UserType::Struct(struct_type)) => {
420 trace!("Deserializing struct");
421 let map_len = self.decode_map_len()?;
422
423 let mut seen_fields = vec![false; struct_type.fields.len()];
425
426 let mut wip = wip;
427 for _ in 0..map_len {
428 let key = self.decode_string()?;
429 match wip.field_index(&key) {
430 Some(index) => {
431 seen_fields[index] = true;
432 wip = self
433 .deserialize_value(wip.field(index).unwrap())?
434 .pop()
435 .unwrap();
436 }
437 None => {
438 self.skip_value()?;
440 trace!("Skipping unknown field: {}", key);
441 }
442 }
443 }
444
445 for (i, &seen) in seen_fields.iter().enumerate() {
447 if !seen {
448 let field = &struct_type.fields[i];
449 if field.flags.contains(facet_core::FieldFlags::DEFAULT) {
450 let field_wip = wip.field(i).map_err(DecodeError::ReflectError)?;
452
453 wip = field_wip
457 .put_default()
458 .map_err(DecodeError::ReflectError)?
459 .pop()
460 .map_err(DecodeError::ReflectError)?;
461 } else {
462 return Err(DecodeError::MissingField(field.name.to_string()));
464 }
465 }
466 }
467
468 return Ok(wip);
469 }
470 Type::Sequence(facet_core::SequenceType::Tuple(tuple_type)) => {
471 trace!("Deserializing tuple");
472 let array_len = self.decode_array_len()?;
473 let field_count = tuple_type.fields.len();
474
475 if array_len != field_count {
476 return Err(DecodeError::InvalidData);
477 }
478
479 let mut tuple_wip = wip.begin_pushback().map_err(DecodeError::ReflectError)?;
481
482 for _ in 0..field_count {
483 let element_wip = tuple_wip.push().map_err(DecodeError::ReflectError)?;
485
486 let element_wip = self.deserialize_value(element_wip)?;
488
489 tuple_wip = element_wip.pop().map_err(DecodeError::ReflectError)?;
491 }
492
493 return Ok(tuple_wip);
494 }
495 Type::User(UserType::Enum(enum_type)) => {
496 trace!("Deserializing enum");
497
498 if self.peek_string()? {
500 let variant_name = self.decode_string()?;
501 for (idx, variant) in enum_type.variants.iter().enumerate() {
502 if variant.name == variant_name {
503 return wip.variant(idx).map_err(DecodeError::ReflectError);
504 }
505 }
506 return Err(DecodeError::InvalidEnum(format!(
507 "Unknown variant: {}",
508 variant_name
509 )));
510 }
511
512 let map_len = self.decode_map_len()?;
514 if map_len != 1 {
515 return Err(DecodeError::InvalidData);
516 }
517
518 let variant_name = self.decode_string()?;
519
520 for (idx, variant) in enum_type.variants.iter().enumerate() {
521 if variant.name == variant_name {
522 match &variant.data.kind {
523 facet_core::StructKind::Unit => {
525 self.skip_value()?;
527 return wip.variant(idx).map_err(DecodeError::ReflectError);
528 }
529
530 facet_core::StructKind::Tuple => {
532 let array_len = self.decode_array_len()?;
533 let field_count = variant.data.fields.len();
534
535 if array_len != field_count {
536 return Err(DecodeError::InvalidData);
537 }
538
539 let _ = wip.variant(idx).map_err(DecodeError::ReflectError)?;
541
542 return Err(DecodeError::NotImplemented(
544 "Enum tuple variants not yet fully implemented".to_string(),
545 ));
546 }
547
548 facet_core::StructKind::Struct => {
550 let map_len = self.decode_map_len()?;
551 let mut enum_wip =
553 wip.variant(idx).map_err(DecodeError::ReflectError)?;
554
555 for _ in 0..map_len {
557 let field_name = self.decode_string()?;
558 match enum_wip.field_index(&field_name) {
559 Some(field_idx) => {
560 let field_wip = enum_wip
561 .field(field_idx)
562 .map_err(DecodeError::ReflectError)?;
563 let field_wip = self.deserialize_value(field_wip)?;
564 enum_wip = field_wip
565 .pop()
566 .map_err(DecodeError::ReflectError)?;
567 }
568 None => {
569 self.skip_value()?;
571 trace!(
572 "Skipping unknown field in enum: {}",
573 field_name
574 );
575 }
576 }
577 }
578
579 return Ok(enum_wip);
580 }
581
582 _ => {
584 return Err(DecodeError::UnsupportedType(format!(
585 "Unsupported enum variant kind: {:?}",
586 variant.data.kind
587 )));
588 }
589 }
590 }
591 }
592
593 return Err(DecodeError::InvalidEnum(format!(
594 "Unknown variant: {}",
595 variant_name
596 )));
597 }
598 _ => {}
599 }
600
601 if let Def::Scalar(_) = shape.def {
603 trace!("Deserializing scalar");
604 if shape.is_type::<String>() {
605 let s = self.decode_string()?;
606 wip = wip.put(s).map_err(DecodeError::ReflectError)?;
607 } else if shape.is_type::<u64>() {
608 let n = self.decode_u64()?;
609 wip = wip.put(n).map_err(DecodeError::ReflectError)?;
610 } else if shape.is_type::<u32>() {
611 let n = self.decode_u64()?;
612 if n > u32::MAX as u64 {
613 return Err(DecodeError::IntegerOverflow);
614 }
615 wip = wip.put(n as u32).map_err(DecodeError::ReflectError)?;
616 } else if shape.is_type::<u16>() {
617 let n = self.decode_u64()?;
618 if n > u16::MAX as u64 {
619 return Err(DecodeError::IntegerOverflow);
620 }
621 wip = wip.put(n as u16).map_err(DecodeError::ReflectError)?;
622 } else if shape.is_type::<u8>() {
623 let n = self.decode_u64()?;
624 if n > u8::MAX as u64 {
625 return Err(DecodeError::IntegerOverflow);
626 }
627 wip = wip.put(n as u8).map_err(DecodeError::ReflectError)?;
628 } else if shape.is_type::<i64>() {
629 let n = self.decode_u64()?;
631 if n > i64::MAX as u64 {
632 return Err(DecodeError::IntegerOverflow);
633 }
634 wip = wip.put(n as i64).map_err(DecodeError::ReflectError)?;
635 } else if shape.is_type::<i32>() {
636 let n = self.decode_u64()?;
637 if n > i32::MAX as u64 {
638 return Err(DecodeError::IntegerOverflow);
639 }
640 wip = wip.put(n as i32).map_err(DecodeError::ReflectError)?;
641 } else if shape.is_type::<i16>() {
642 let n = self.decode_u64()?;
643 if n > i16::MAX as u64 {
644 return Err(DecodeError::IntegerOverflow);
645 }
646 wip = wip.put(n as i16).map_err(DecodeError::ReflectError)?;
647 } else if shape.is_type::<i8>() {
648 let n = self.decode_u64()?;
649 if n > i8::MAX as u64 {
650 return Err(DecodeError::IntegerOverflow);
651 }
652 wip = wip.put(n as i8).map_err(DecodeError::ReflectError)?;
653 } else if shape.is_type::<f64>() {
654 return Err(DecodeError::NotImplemented(
656 "f64 deserialization not yet implemented".to_string(),
657 ));
658 } else if shape.is_type::<f32>() {
659 return Err(DecodeError::NotImplemented(
661 "f32 deserialization not yet implemented".to_string(),
662 ));
663 } else if shape.is_type::<bool>() {
664 let b = self.decode_bool()?;
665 wip = wip.put(b).map_err(DecodeError::ReflectError)?;
666 } else {
667 return Err(DecodeError::UnsupportedType(format!("{}", shape)));
668 }
669 } else if let Def::Map(_map_def) = shape.def {
670 trace!("Deserializing map");
671 let map_len = self.decode_map_len()?;
672 let mut map_wip = wip.begin_map_insert().map_err(DecodeError::ReflectError)?;
673
674 for _ in 0..map_len {
675 let key_wip = map_wip.push_map_key().map_err(DecodeError::ReflectError)?;
677 let key_wip = self.deserialize_value(key_wip)?;
678
679 let value_wip = key_wip
680 .push_map_value()
681 .map_err(DecodeError::ReflectError)?;
682 let map_wip_next = self.deserialize_value(value_wip)?;
683
684 map_wip = map_wip_next.pop().map_err(DecodeError::ReflectError)?;
685 }
686
687 wip = map_wip;
688 } else if let Def::List(_list_def) = shape.def {
689 trace!("Deserializing list");
690 let array_len = self.decode_array_len()?;
691 let mut list_wip = wip.begin_pushback().map_err(DecodeError::ReflectError)?;
692
693 for _ in 0..array_len {
694 let item_wip = list_wip.push().map_err(DecodeError::ReflectError)?;
695 list_wip = self
696 .deserialize_value(item_wip)?
697 .pop()
698 .map_err(DecodeError::ReflectError)?;
699 }
700
701 wip = list_wip;
702 } else if let Def::Option(_option_def) = shape.def {
703 trace!("Deserializing option");
704 if self.peek_nil()? {
706 self.decode_nil()?;
708 wip = wip.put_default().map_err(DecodeError::ReflectError)?;
710 } else {
711 let some_wip = wip.push_some().map_err(DecodeError::ReflectError)?;
713 let some_wip = self.deserialize_value(some_wip)?;
714 wip = some_wip.pop().map_err(DecodeError::ReflectError)?;
715 }
716 } else {
717 return Err(DecodeError::UnsupportedShape(format!("{:?}", shape)));
718 }
719
720 Ok(wip)
721 }
722}