facet_msgpack/
deserialize.rs

1use 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
8/// Deserializes MessagePack-encoded data into a type that implements `Facet`.
9///
10/// # Example
11/// ```
12/// use facet::Facet;
13/// use facet_msgpack::from_slice;
14///
15/// #[derive(Debug, Facet, PartialEq)]
16/// struct User {
17///     id: u64,
18///     username: String,
19/// }
20///
21/// // MessagePack binary data (equivalent to {"id": 42, "username": "user123"})
22/// let msgpack_data = [
23///     0x82, 0xa2, 0x69, 0x64, 0x2a, 0xa8, 0x75, 0x73,
24///     0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0xa7, 0x75,
25///     0x73, 0x65, 0x72, 0x31, 0x32, 0x33
26/// ];
27///
28/// let user: User = from_slice(&msgpack_data).unwrap();
29/// assert_eq!(user, User { id: 42, username: "user123".to_string() });
30/// ```
31pub 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
39/// Deserializes MessagePack-encoded data into a Facet value.
40///
41/// This function takes a MessagePack byte array and populates a Wip object
42/// according to the shape description, returning an Opaque value.
43///
44/// # Example
45///
46/// ```
47/// use facet::Facet;
48/// use facet_msgpack::from_slice;
49///
50/// #[derive(Debug, Facet, PartialEq)]
51/// struct User {
52///     id: u64,
53///     username: String,
54/// }
55///
56/// // MessagePack binary data (equivalent to {"id": 42, "username": "user123"})
57/// let msgpack_data = [
58///     0x82, 0xa2, 0x69, 0x64, 0x2a, 0xa8, 0x75, 0x73,
59///     0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0xa7, 0x75,
60///     0x73, 0x65, 0x72, 0x31, 0x32, 0x33
61/// ];
62///
63/// let user: User = from_slice(&msgpack_data).unwrap();
64/// assert_eq!(user, User { id: 42, username: "user123".to_string() });
65/// ```
66///
67/// # Parameters
68/// * `wip` - A Wip object that will be filled with deserialized data
69/// * `msgpack` - A byte slice containing MessagePack-encoded data
70///
71/// # Returns
72/// * `Ok(Opaque)` containing the deserialized data if successful
73/// * `Err(DecodeError)` if an error occurred during deserialization
74///
75/// # MessagePack Format
76/// This implementation follows the MessagePack specification:
77/// <https://github.com/msgpack/msgpack/blob/master/spec.md>
78pub 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    /// Decodes a single byte from the input.
100    /// This is a low-level method used by other decoders.
101    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    /// Decodes a 16-bit unsigned integer in big-endian byte order.
111    /// This is a low-level method used by other decoders.
112    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    /// Decodes a 32-bit unsigned integer in big-endian byte order.
123    /// This is a low-level method used by other decoders.
124    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    /// Decodes a MessagePack-encoded unsigned 64-bit integer.
135    /// Handles the following MessagePack types:
136    /// - positive fixint (0x00 - 0x7f): single-byte positive integer
137    /// - uint8 (0xcc): 8-bit unsigned integer
138    /// - uint16 (0xcd): 16-bit unsigned integer (big-endian)
139    /// - uint32 (0xce): 32-bit unsigned integer (big-endian)
140    /// - uint64 (0xcf): 64-bit unsigned integer (big-endian)
141    ///
142    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#int-format-family>
143    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    /// Decodes a MessagePack-encoded string.
164    /// Handles the following MessagePack types:
165    /// - fixstr (0xa0 - 0xbf): string up to 31 bytes
166    /// - str8 (0xd9): string up to 255 bytes
167    /// - str16 (0xda): string up to 65535 bytes
168    /// - str32 (0xdb): string up to 4294967295 bytes
169    ///
170    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str>
171    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    /// Decodes a MessagePack-encoded map length.
193    /// Handles the following MessagePack types:
194    /// - fixmap (0x80 - 0x8f): map with up to 15 elements
195    /// - map16 (0xde): map with up to 65535 elements
196    /// - map32 (0xdf): map with up to 4294967295 elements
197    ///
198    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#formats-map>
199    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    /// Decodes a MessagePack-encoded array length.
211    /// Handles the following MessagePack types:
212    /// - fixarray (0x90 - 0x9f): array with up to 15 elements
213    /// - array16 (0xdc): array with up to 65535 elements
214    /// - array32 (0xdd): array with up to 4294967295 elements
215    ///
216    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#formats-array>
217    #[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    /// Decodes a MessagePack-encoded boolean value.
230    /// Handles the following MessagePack types:
231    /// - true (0xc3): boolean true
232    /// - false (0xc2): boolean false
233    ///
234    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#formats-bool>
235    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    /// Decodes a MessagePack-encoded nil value.
244    /// Handles the following MessagePack types:
245    /// - nil (0xc0): nil/null value
246    ///
247    /// Ref: <https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil>
248    #[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    /// Peeks at the next byte to check if it's a nil value without advancing the offset.
257    /// Returns true if the next value is nil, false otherwise.
258    #[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    /// Peeks at the next byte to check if it's a string value without advancing the offset.
267    /// Returns true if the next value is a string, false otherwise.
268    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    /// Skips a MessagePack value of any type.
280    /// This is used when encountering unknown field names in a struct.
281    fn skip_value(&mut self) -> Result<(), DecodeError<'static>> {
282        let prefix = self.decode_u8()?;
283
284        match prefix {
285            // String formats
286            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            // Integer formats
320            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            // Fixed integers are already handled by decode_u8
353
354            // Boolean and nil
355            MSGPACK_NIL | MSGPACK_TRUE | MSGPACK_FALSE => Ok(()),
356
357            // Map format
358            prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => {
359                let len = (prefix & 0x0f) as usize;
360                for _ in 0..len {
361                    self.skip_value()?; // Skip key
362                    self.skip_value()?; // Skip value
363                }
364                Ok(())
365            }
366            MSGPACK_MAP16 => {
367                let len = self.decode_u16()? as usize;
368                for _ in 0..len {
369                    self.skip_value()?; // Skip key
370                    self.skip_value()?; // Skip value
371                }
372                Ok(())
373            }
374            MSGPACK_MAP32 => {
375                let len = self.decode_u32()? as usize;
376                for _ in 0..len {
377                    self.skip_value()?; // Skip key
378                    self.skip_value()?; // Skip value
379                }
380                Ok(())
381            }
382
383            // Array format
384            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        // First check the type system (Type)
418        match &shape.ty {
419            Type::User(UserType::Struct(struct_type)) => {
420                trace!("Deserializing struct");
421                let map_len = self.decode_map_len()?;
422
423                // Track which fields we've seen so we can handle defaults for the rest
424                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                            // Skip unknown field value
439                            self.skip_value()?;
440                            trace!("Skipping unknown field: {}", key);
441                        }
442                    }
443                }
444
445                // Handle defaults for fields that weren't seen in the input
446                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                            // Field has default attribute, so we should apply the default
451                            let field_wip = wip.field(i).map_err(DecodeError::ReflectError)?;
452
453                            // Whether there's a custom default function or not, we just use put_default()
454                            // the Wip.put_default() API in the facet system will handle calling the
455                            // appropriate default function set in the #[facet(default = ...)] attribute
456                            wip = field_wip
457                                .put_default()
458                                .map_err(DecodeError::ReflectError)?
459                                .pop()
460                                .map_err(DecodeError::ReflectError)?;
461                        } else {
462                            // Non-default field was missing
463                            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                // For tuples, we need to use begin_pushback for the new API
480                let mut tuple_wip = wip.begin_pushback().map_err(DecodeError::ReflectError)?;
481
482                for _ in 0..field_count {
483                    // Push a new element
484                    let element_wip = tuple_wip.push().map_err(DecodeError::ReflectError)?;
485
486                    // Deserialize the element value
487                    let element_wip = self.deserialize_value(element_wip)?;
488
489                    // Pop back up to the tuple level
490                    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                // Check if it's a unit variant which is represented as a string
499                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                // Otherwise it's represented as a map with single entry where key is the variant name
513                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                            // Handle unit variant
524                            facet_core::StructKind::Unit => {
525                                // Need to skip any value that might be present
526                                self.skip_value()?;
527                                return wip.variant(idx).map_err(DecodeError::ReflectError);
528                            }
529
530                            // Handle tuple variant
531                            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                                // First select the variant - not used since we return immediately
540                                let _ = wip.variant(idx).map_err(DecodeError::ReflectError)?;
541
542                                // Temporarily using a not-implemented error while we figure out the correct approach
543                                return Err(DecodeError::NotImplemented(
544                                    "Enum tuple variants not yet fully implemented".to_string(),
545                                ));
546                            }
547
548                            // Handle struct variant
549                            facet_core::StructKind::Struct => {
550                                let map_len = self.decode_map_len()?;
551                                // First select the variant
552                                let mut enum_wip =
553                                    wip.variant(idx).map_err(DecodeError::ReflectError)?;
554
555                                // Handle fields as a normal struct
556                                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                                            // Skip unknown field
570                                            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                            // Handle other kinds that might be added in the future
583                            _ => {
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        // Then check the def system (Def)
602        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                // TODO: implement proper signed int decoding including negative values
630                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                // TODO: Implement proper f64 decoding from MessagePack format
655                return Err(DecodeError::NotImplemented(
656                    "f64 deserialization not yet implemented".to_string(),
657                ));
658            } else if shape.is_type::<f32>() {
659                // TODO: Implement proper f32 decoding from MessagePack format
660                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                // Each map entry has a key and value
676                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            // Check if we have a null/nil value
705            if self.peek_nil()? {
706                // Consume the nil value
707                self.decode_nil()?;
708                // Initialize None option
709                wip = wip.put_default().map_err(DecodeError::ReflectError)?;
710            } else {
711                // Value is present - initialize a Some option
712                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}