messagepack_serde/value/
mod.rs

1//! Untyped value helpers for MessagePack.
2//!
3//! This module provides a dynamic representation of MessagePack data and
4//! utility adapters for extension types.
5//!
6//! # Examples
7//!
8//! Serialize a struct into [`Value`] and then deserialize it back. Both
9//! [`Value`] and [`ValueRef`] implement `serde::Deserializer`, so any
10//! `T: serde::Deserialize` can be decoded from them.
11//!
12//! ```rust
13//! # #[cfg(feature = "alloc")]
14//! # fn main() {
15//! use serde::{Deserialize, Serialize};
16//! use messagepack_serde::value::{to_value, Value};
17//!
18//! #[derive(Debug, Serialize, Deserialize, PartialEq)]
19//! struct User<'a> {
20//!     id: u64,
21//!     name: &'a str,
22//!     active: bool,
23//! }
24//!
25//! let original = User { id: 42, name: "alice", active: true };
26//!
27//! // Serialize Rust value to an owned MessagePack "Value" tree
28//! let v: Value = to_value(&original).unwrap();
29//!
30//! // Deserialize back from &Value
31//! let decoded = User::deserialize(&v).unwrap();
32//! assert_eq!(decoded, original);
33//! # }
34//! # #[cfg(not(feature = "alloc"))]
35//! # fn main() {}
36//! ```
37//!
38//! Borrowed decoding from [`ValueRef`]. This avoids copying strings and
39//! byte slices when possible.
40//!
41//! ```rust
42//! # #[cfg(feature = "alloc")]
43//! # fn main() {
44//! use serde::Deserialize;
45//! use messagepack_serde::value::ValueRef;
46//!
47//! // Borrowed primitives without allocation
48//! let s = <&str>::deserialize(&ValueRef::String("hello")).unwrap();
49//! assert_eq!(s, "hello");
50//!
51//! // Decode a tuple from a borrowed array
52//! let v = ValueRef::Array(vec![
53//!     ValueRef::from(1u64),
54//!     ValueRef::from("hello"),
55//!     ValueRef::from(false),
56//! ]);
57//! let tup = <(u64, &str, bool)>::deserialize(&v).unwrap();
58//! assert_eq!(tup, (1, "hello", false));
59//! # }
60//! # #[cfg(not(feature = "alloc"))]
61//! # fn main() {}
62//! ```
63
64#[cfg(feature = "alloc")]
65mod value_ref;
66#[cfg(feature = "alloc")]
67pub use value_ref::ValueRef;
68
69#[cfg(feature = "alloc")]
70mod value_owned;
71#[cfg(feature = "alloc")]
72pub use value_owned::Value;
73
74mod number;
75pub use number::Number;
76
77#[cfg(feature = "alloc")]
78mod de;
79
80#[cfg(feature = "alloc")]
81mod ser;
82#[cfg(feature = "alloc")]
83pub use ser::to_value;