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> {
34 from_slice_value(Wip::alloc::<T>()?, msgpack)?
35 .materialize::<T>()
36 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
37}
38
39#[deprecated(since = "0.1.0", note = "Use from_slice instead")]
41pub fn from_str<'input: 'facet, 'facet, T: Facet<'facet>>(
42 msgpack: &'input [u8],
43) -> Result<T, DecodeError> {
44 from_slice(msgpack)
45}
46
47#[allow(clippy::needless_lifetimes)]
87pub fn from_slice_value<'mem>(
88 wip: Wip<'mem>,
89 msgpack: &'mem [u8],
90) -> Result<HeapValue<'mem>, DecodeError> {
91 let mut decoder = Decoder::new(msgpack);
92 decoder
93 .deserialize_value(wip)?
94 .build()
95 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
96}
97
98struct Decoder<'input> {
99 input: &'input [u8],
100 offset: usize,
101}
102
103impl<'input> Decoder<'input> {
104 fn new(input: &'input [u8]) -> Self {
105 Decoder { input, offset: 0 }
106 }
107
108 fn decode_u8(&mut self) -> Result<u8, DecodeError> {
111 if self.offset >= self.input.len() {
112 return Err(DecodeError::InsufficientData);
113 }
114 let value = self.input[self.offset];
115 self.offset += 1;
116 Ok(value)
117 }
118
119 fn decode_u16(&mut self) -> Result<u16, DecodeError> {
122 if self.offset + 2 > self.input.len() {
123 return Err(DecodeError::InsufficientData);
124 }
125 let value =
126 u16::from_be_bytes(self.input[self.offset..self.offset + 2].try_into().unwrap());
127 self.offset += 2;
128 Ok(value)
129 }
130
131 fn decode_u32(&mut self) -> Result<u32, DecodeError> {
134 if self.offset + 4 > self.input.len() {
135 return Err(DecodeError::InsufficientData);
136 }
137 let value =
138 u32::from_be_bytes(self.input[self.offset..self.offset + 4].try_into().unwrap());
139 self.offset += 4;
140 Ok(value)
141 }
142
143 fn decode_u64(&mut self) -> Result<u64, DecodeError> {
153 match self.decode_u8()? {
154 MSGPACK_UINT8 => Ok(self.decode_u8()? as u64),
155 MSGPACK_UINT16 => Ok(self.decode_u16()? as u64),
156 MSGPACK_UINT32 => Ok(self.decode_u32()? as u64),
157 MSGPACK_UINT64 => {
158 if self.offset + 8 > self.input.len() {
159 return Err(DecodeError::InsufficientData);
160 }
161 let value = u64::from_be_bytes(
162 self.input[self.offset..self.offset + 8].try_into().unwrap(),
163 );
164 self.offset += 8;
165 Ok(value)
166 }
167 prefix @ MSGPACK_POSFIXINT_MIN..=MSGPACK_POSFIXINT_MAX => Ok(prefix as u64),
168 _ => Err(DecodeError::UnexpectedType),
169 }
170 }
171
172 fn decode_string(&mut self) -> Result<String, DecodeError> {
181 let prefix = self.decode_u8()?;
182
183 let len = match prefix {
184 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => (prefix & 0x1f) as usize,
185 MSGPACK_STR8 => self.decode_u8()? as usize,
186 MSGPACK_STR16 => self.decode_u16()? as usize,
187 MSGPACK_STR32 => self.decode_u32()? as usize,
188 _ => return Err(DecodeError::UnexpectedType),
189 };
190
191 if self.offset + len > self.input.len() {
192 return Err(DecodeError::InsufficientData);
193 }
194
195 let value = String::from_utf8(self.input[self.offset..self.offset + len].to_vec())
196 .map_err(|_| DecodeError::InvalidData)?;
197 self.offset += len;
198 Ok(value)
199 }
200
201 fn decode_map_len(&mut self) -> Result<usize, DecodeError> {
209 let prefix = self.decode_u8()?;
210
211 match prefix {
212 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => Ok((prefix & 0x0f) as usize),
213 MSGPACK_MAP16 => Ok(self.decode_u16()? as usize),
214 MSGPACK_MAP32 => Ok(self.decode_u32()? as usize),
215 _ => Err(DecodeError::UnexpectedType),
216 }
217 }
218
219 #[allow(dead_code)]
227 fn decode_array_len(&mut self) -> Result<usize, DecodeError> {
228 let prefix = self.decode_u8()?;
229
230 match prefix {
231 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => Ok((prefix & 0x0f) as usize),
232 MSGPACK_ARRAY16 => Ok(self.decode_u16()? as usize),
233 MSGPACK_ARRAY32 => Ok(self.decode_u32()? as usize),
234 _ => Err(DecodeError::UnexpectedType),
235 }
236 }
237
238 fn decode_bool(&mut self) -> Result<bool, DecodeError> {
245 match self.decode_u8()? {
246 MSGPACK_TRUE => Ok(true),
247 MSGPACK_FALSE => Ok(false),
248 _ => Err(DecodeError::UnexpectedType),
249 }
250 }
251
252 #[allow(dead_code)]
258 fn decode_nil(&mut self) -> Result<(), DecodeError> {
259 match self.decode_u8()? {
260 MSGPACK_NIL => Ok(()),
261 _ => Err(DecodeError::UnexpectedType),
262 }
263 }
264
265 #[allow(dead_code)]
268 fn peek_nil(&mut self) -> Result<bool, DecodeError> {
269 if self.offset >= self.input.len() {
270 return Err(DecodeError::InsufficientData);
271 }
272 Ok(self.input[self.offset] == MSGPACK_NIL)
273 }
274
275 fn peek_string(&mut self) -> Result<bool, DecodeError> {
278 if self.offset >= self.input.len() {
279 return Err(DecodeError::InsufficientData);
280 }
281 let prefix = self.input[self.offset];
282 Ok((MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX).contains(&prefix)
283 || prefix == MSGPACK_STR8
284 || prefix == MSGPACK_STR16
285 || prefix == MSGPACK_STR32)
286 }
287
288 fn skip_value(&mut self) -> Result<(), DecodeError> {
291 let prefix = self.decode_u8()?;
292
293 match prefix {
294 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => {
296 let len = (prefix & 0x1f) as usize;
297 if self.offset + len > self.input.len() {
298 return Err(DecodeError::InsufficientData);
299 }
300 self.offset += len;
301 Ok(())
302 }
303 MSGPACK_STR8 => {
304 let len = self.decode_u8()? as usize;
305 if self.offset + len > self.input.len() {
306 return Err(DecodeError::InsufficientData);
307 }
308 self.offset += len;
309 Ok(())
310 }
311 MSGPACK_STR16 => {
312 let len = self.decode_u16()? as usize;
313 if self.offset + len > self.input.len() {
314 return Err(DecodeError::InsufficientData);
315 }
316 self.offset += len;
317 Ok(())
318 }
319 MSGPACK_STR32 => {
320 let len = self.decode_u32()? as usize;
321 if self.offset + len > self.input.len() {
322 return Err(DecodeError::InsufficientData);
323 }
324 self.offset += len;
325 Ok(())
326 }
327
328 MSGPACK_UINT8 => {
330 self.offset += 1;
331 Ok(())
332 }
333 MSGPACK_UINT16 => {
334 self.offset += 2;
335 Ok(())
336 }
337 MSGPACK_UINT32 => {
338 self.offset += 4;
339 Ok(())
340 }
341 MSGPACK_UINT64 => {
342 self.offset += 8;
343 Ok(())
344 }
345 MSGPACK_INT8 => {
346 self.offset += 1;
347 Ok(())
348 }
349 MSGPACK_INT16 => {
350 self.offset += 2;
351 Ok(())
352 }
353 MSGPACK_INT32 => {
354 self.offset += 4;
355 Ok(())
356 }
357 MSGPACK_INT64 => {
358 self.offset += 8;
359 Ok(())
360 }
361 MSGPACK_NIL | MSGPACK_TRUE | MSGPACK_FALSE => Ok(()),
365
366 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => {
368 let len = (prefix & 0x0f) as usize;
369 for _ in 0..len {
370 self.skip_value()?; self.skip_value()?; }
373 Ok(())
374 }
375 MSGPACK_MAP16 => {
376 let len = self.decode_u16()? as usize;
377 for _ in 0..len {
378 self.skip_value()?; self.skip_value()?; }
381 Ok(())
382 }
383 MSGPACK_MAP32 => {
384 let len = self.decode_u32()? as usize;
385 for _ in 0..len {
386 self.skip_value()?; self.skip_value()?; }
389 Ok(())
390 }
391
392 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => {
394 let len = (prefix & 0x0f) as usize;
395 for _ in 0..len {
396 self.skip_value()?;
397 }
398 Ok(())
399 }
400 MSGPACK_ARRAY16 => {
401 let len = self.decode_u16()? as usize;
402 for _ in 0..len {
403 self.skip_value()?;
404 }
405 Ok(())
406 }
407 MSGPACK_ARRAY32 => {
408 let len = self.decode_u32()? as usize;
409 for _ in 0..len {
410 self.skip_value()?;
411 }
412 Ok(())
413 }
414
415 _ => Err(DecodeError::UnexpectedType),
416 }
417 }
418
419 fn deserialize_value(&mut self, mut wip: Wip<'input>) -> Result<Wip<'input>, DecodeError> {
420 let shape = wip.shape();
421 trace!("Deserializing {:?}", shape);
422
423 match &shape.ty {
425 Type::User(UserType::Struct(struct_type)) => {
426 trace!("Deserializing struct");
427 let map_len = self.decode_map_len()?;
428
429 let mut seen_fields = vec![false; struct_type.fields.len()];
431
432 let mut wip = wip;
433 for _ in 0..map_len {
434 let key = self.decode_string()?;
435 match wip.field_index(&key) {
436 Some(index) => {
437 seen_fields[index] = true;
438 wip = self
439 .deserialize_value(wip.field(index).unwrap())?
440 .pop()
441 .unwrap();
442 }
443 None => {
444 self.skip_value()?;
446 trace!("Skipping unknown field: {}", key);
447 }
448 }
449 }
450
451 for (i, &seen) in seen_fields.iter().enumerate() {
453 if !seen {
454 let field = &struct_type.fields[i];
455 if field.flags.contains(facet_core::FieldFlags::DEFAULT) {
456 let field_wip = wip.field(i).map_err(DecodeError::ReflectError)?;
458
459 wip = field_wip
463 .put_default()
464 .map_err(DecodeError::ReflectError)?
465 .pop()
466 .map_err(DecodeError::ReflectError)?;
467 } else {
468 return Err(DecodeError::MissingField(field.name.to_string()));
470 }
471 }
472 }
473
474 return Ok(wip);
475 }
476 Type::Sequence(facet_core::SequenceType::Tuple(tuple_type)) => {
477 trace!("Deserializing tuple");
478 let array_len = self.decode_array_len()?;
479 let field_count = tuple_type.fields.len();
480
481 if array_len != field_count {
482 return Err(DecodeError::InvalidData);
483 }
484
485 let mut tuple_wip = wip.begin_pushback().map_err(DecodeError::ReflectError)?;
487
488 for _ in 0..field_count {
489 let element_wip = tuple_wip.push().map_err(DecodeError::ReflectError)?;
491
492 let element_wip = self.deserialize_value(element_wip)?;
494
495 tuple_wip = element_wip.pop().map_err(DecodeError::ReflectError)?;
497 }
498
499 return Ok(tuple_wip);
500 }
501 Type::User(UserType::Enum(enum_type)) => {
502 trace!("Deserializing enum");
503
504 if self.peek_string()? {
506 let variant_name = self.decode_string()?;
507 for (idx, variant) in enum_type.variants.iter().enumerate() {
508 if variant.name == variant_name {
509 return wip.variant(idx).map_err(DecodeError::ReflectError);
510 }
511 }
512 return Err(DecodeError::InvalidEnum(format!(
513 "Unknown variant: {}",
514 variant_name
515 )));
516 }
517
518 let map_len = self.decode_map_len()?;
520 if map_len != 1 {
521 return Err(DecodeError::InvalidData);
522 }
523
524 let variant_name = self.decode_string()?;
525
526 for (idx, variant) in enum_type.variants.iter().enumerate() {
527 if variant.name == variant_name {
528 match &variant.data.kind {
529 facet_core::StructKind::Unit => {
531 self.skip_value()?;
533 return wip.variant(idx).map_err(DecodeError::ReflectError);
534 }
535
536 facet_core::StructKind::Tuple => {
538 let array_len = self.decode_array_len()?;
539 let field_count = variant.data.fields.len();
540
541 if array_len != field_count {
542 return Err(DecodeError::InvalidData);
543 }
544
545 let _ = wip.variant(idx).map_err(DecodeError::ReflectError)?;
547
548 return Err(DecodeError::NotImplemented(
550 "Enum tuple variants not yet fully implemented".to_string(),
551 ));
552 }
553
554 facet_core::StructKind::Struct => {
556 let map_len = self.decode_map_len()?;
557 let mut enum_wip =
559 wip.variant(idx).map_err(DecodeError::ReflectError)?;
560
561 for _ in 0..map_len {
563 let field_name = self.decode_string()?;
564 match enum_wip.field_index(&field_name) {
565 Some(field_idx) => {
566 let field_wip = enum_wip
567 .field(field_idx)
568 .map_err(DecodeError::ReflectError)?;
569 let field_wip = self.deserialize_value(field_wip)?;
570 enum_wip = field_wip
571 .pop()
572 .map_err(DecodeError::ReflectError)?;
573 }
574 None => {
575 self.skip_value()?;
577 trace!(
578 "Skipping unknown field in enum: {}",
579 field_name
580 );
581 }
582 }
583 }
584
585 return Ok(enum_wip);
586 }
587
588 _ => {
590 return Err(DecodeError::UnsupportedType(format!(
591 "Unsupported enum variant kind: {:?}",
592 variant.data.kind
593 )));
594 }
595 }
596 }
597 }
598
599 return Err(DecodeError::InvalidEnum(format!(
600 "Unknown variant: {}",
601 variant_name
602 )));
603 }
604 _ => {}
605 }
606
607 if let Def::Scalar(_) = shape.def {
609 trace!("Deserializing scalar");
610 if shape.is_type::<String>() {
611 let s = self.decode_string()?;
612 wip = wip.put(s).map_err(DecodeError::ReflectError)?;
613 } else if shape.is_type::<u64>() {
614 let n = self.decode_u64()?;
615 wip = wip.put(n).map_err(DecodeError::ReflectError)?;
616 } else if shape.is_type::<u32>() {
617 let n = self.decode_u64()?;
618 if n > u32::MAX as u64 {
619 return Err(DecodeError::IntegerOverflow);
620 }
621 wip = wip.put(n as u32).map_err(DecodeError::ReflectError)?;
622 } else if shape.is_type::<u16>() {
623 let n = self.decode_u64()?;
624 if n > u16::MAX as u64 {
625 return Err(DecodeError::IntegerOverflow);
626 }
627 wip = wip.put(n as u16).map_err(DecodeError::ReflectError)?;
628 } else if shape.is_type::<u8>() {
629 let n = self.decode_u64()?;
630 if n > u8::MAX as u64 {
631 return Err(DecodeError::IntegerOverflow);
632 }
633 wip = wip.put(n as u8).map_err(DecodeError::ReflectError)?;
634 } else if shape.is_type::<i64>() {
635 let n = self.decode_u64()?;
637 if n > i64::MAX as u64 {
638 return Err(DecodeError::IntegerOverflow);
639 }
640 wip = wip.put(n as i64).map_err(DecodeError::ReflectError)?;
641 } else if shape.is_type::<i32>() {
642 let n = self.decode_u64()?;
643 if n > i32::MAX as u64 {
644 return Err(DecodeError::IntegerOverflow);
645 }
646 wip = wip.put(n as i32).map_err(DecodeError::ReflectError)?;
647 } else if shape.is_type::<i16>() {
648 let n = self.decode_u64()?;
649 if n > i16::MAX as u64 {
650 return Err(DecodeError::IntegerOverflow);
651 }
652 wip = wip.put(n as i16).map_err(DecodeError::ReflectError)?;
653 } else if shape.is_type::<i8>() {
654 let n = self.decode_u64()?;
655 if n > i8::MAX as u64 {
656 return Err(DecodeError::IntegerOverflow);
657 }
658 wip = wip.put(n as i8).map_err(DecodeError::ReflectError)?;
659 } else if shape.is_type::<f64>() {
660 return Err(DecodeError::NotImplemented(
662 "f64 deserialization not yet implemented".to_string(),
663 ));
664 } else if shape.is_type::<f32>() {
665 return Err(DecodeError::NotImplemented(
667 "f32 deserialization not yet implemented".to_string(),
668 ));
669 } else if shape.is_type::<bool>() {
670 let b = self.decode_bool()?;
671 wip = wip.put(b).map_err(DecodeError::ReflectError)?;
672 } else {
673 return Err(DecodeError::UnsupportedType(format!("{}", shape)));
674 }
675 } else if let Def::Map(_map_def) = shape.def {
676 trace!("Deserializing map");
677 let map_len = self.decode_map_len()?;
678 let mut map_wip = wip.begin_map_insert().map_err(DecodeError::ReflectError)?;
679
680 for _ in 0..map_len {
681 let key_wip = map_wip.push_map_key().map_err(DecodeError::ReflectError)?;
683 let key_wip = self.deserialize_value(key_wip)?;
684
685 let value_wip = key_wip
686 .push_map_value()
687 .map_err(DecodeError::ReflectError)?;
688 let map_wip_next = self.deserialize_value(value_wip)?;
689
690 map_wip = map_wip_next.pop().map_err(DecodeError::ReflectError)?;
691 }
692
693 wip = map_wip;
694 } else if let Def::List(_list_def) = shape.def {
695 trace!("Deserializing list");
696 let array_len = self.decode_array_len()?;
697 let mut list_wip = wip.begin_pushback().map_err(DecodeError::ReflectError)?;
698
699 for _ in 0..array_len {
700 let item_wip = list_wip.push().map_err(DecodeError::ReflectError)?;
701 list_wip = self
702 .deserialize_value(item_wip)?
703 .pop()
704 .map_err(DecodeError::ReflectError)?;
705 }
706
707 wip = list_wip;
708 } else if let Def::Option(_option_def) = shape.def {
709 trace!("Deserializing option");
710 if self.peek_nil()? {
712 self.decode_nil()?;
714 wip = wip.put_default().map_err(DecodeError::ReflectError)?;
716 } else {
717 let some_wip = wip.push_some().map_err(DecodeError::ReflectError)?;
719 let some_wip = self.deserialize_value(some_wip)?;
720 wip = some_wip.pop().map_err(DecodeError::ReflectError)?;
721 }
722 } else {
723 return Err(DecodeError::UnsupportedShape(format!("{:?}", shape)));
724 }
725
726 Ok(wip)
727 }
728}