messagepack_serde/value/
value_.rs

1use super::number::Number;
2use alloc::vec::Vec;
3use messagepack_core::extension::ExtensionRef;
4use serde::{de::Visitor, ser::SerializeMap};
5
6/// Represents any messagepack value. `alloc` needed.
7#[derive(Debug, Clone, PartialEq, PartialOrd)]
8pub enum ValueRef<'a> {
9    /// Represents nil format
10    Nil,
11    /// Represents bool format family
12    Bool(bool),
13    /// Represents `bin 8`, `bin 16` and `bin 32`
14    Bin(&'a [u8]),
15    /// Represents ext format family
16    Extension(ExtensionRef<'a>),
17    /// Represents int format family and float format family
18    Number(Number),
19    /// Represents str format family
20    String(&'a str),
21    /// Represents array format family
22    Array(Vec<ValueRef<'a>>),
23    /// Represents map format family
24    Map(Vec<(ValueRef<'a>, ValueRef<'a>)>),
25}
26
27impl ValueRef<'_> {
28    /// Returns true if the `ValueRef` is nil
29    pub fn is_nil(&self) -> bool {
30        matches!(self, ValueRef::Nil)
31    }
32
33    /// If the `ValueRef` is boolean, returns contained value.
34    pub fn as_bool(&self) -> Option<bool> {
35        match self {
36            ValueRef::Bool(v) => Some(*v),
37            _ => None,
38        }
39    }
40
41    /// If the `ValueRef` is bin, returns contained value.
42    pub fn as_bin(&self) -> Option<&[u8]> {
43        match self {
44            ValueRef::Bin(v) => Some(*v),
45            _ => None,
46        }
47    }
48
49    /// If the `ValueRef` is ext, returns contained value.
50    pub fn as_extension(&self) -> Option<&ExtensionRef<'_>> {
51        match self {
52            ValueRef::Extension(v) => Some(v),
53            _ => None,
54        }
55    }
56
57    /// If the `ValueRef` is number, returns contained value.
58    pub fn as_number(&self) -> Option<Number> {
59        match self {
60            ValueRef::Number(v) => Some(*v),
61            _ => None,
62        }
63    }
64
65    /// If the `ValueRef` is str, returns contained value.
66    pub fn as_string(&self) -> Option<&str> {
67        match self {
68            ValueRef::String(v) => Some(*v),
69            _ => None,
70        }
71    }
72
73    /// If the `ValueRef` is array, returns contained value.
74    pub fn as_array(&self) -> Option<&[ValueRef<'_>]> {
75        match self {
76            ValueRef::Array(v) => Some(v),
77            _ => None,
78        }
79    }
80
81    /// If the `ValueRef` is map, returns contained value.
82    pub fn as_map(&self) -> Option<&[(ValueRef<'_>, ValueRef<'_>)]> {
83        match self {
84            ValueRef::Map(v) => Some(v),
85            _ => None,
86        }
87    }
88}
89
90impl serde::Serialize for ValueRef<'_> {
91    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
92    where
93        S: serde::Serializer,
94    {
95        match self {
96            ValueRef::Nil => serializer.serialize_none(),
97            ValueRef::Bool(v) => serializer.serialize_bool(*v),
98            ValueRef::Bin(items) => (*items).serialize(serializer),
99            ValueRef::Extension(extension_ref) => {
100                super::ext_ref::serialize(extension_ref, serializer)
101            }
102            ValueRef::Number(number) => number.serialize(serializer),
103            ValueRef::String(s) => serializer.serialize_str(s),
104            ValueRef::Array(value_refs) => (*value_refs).serialize(serializer),
105            ValueRef::Map(items) => {
106                let mut map = serializer.serialize_map(Some(items.len()))?;
107                for (k, v) in items.iter() {
108                    map.serialize_entry(k, v)?;
109                }
110                map.end()
111            }
112        }
113    }
114}
115
116impl<'de> serde::Deserialize<'de> for ValueRef<'de> {
117    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
118    where
119        D: serde::Deserializer<'de>,
120    {
121        struct ValueVisitor;
122        impl<'de> Visitor<'de> for ValueVisitor {
123            type Value = ValueRef<'de>;
124            fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
125                formatter.write_str("expect valid messagepack")
126            }
127
128            fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
129            where
130                E: serde::de::Error,
131            {
132                Ok(ValueRef::Bool(v))
133            }
134
135            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
136            where
137                E: serde::de::Error,
138            {
139                let n = Number::UnsignedInt(v);
140                Ok(ValueRef::Number(n))
141            }
142
143            fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
144            where
145                E: serde::de::Error,
146            {
147                let n = Number::SignedInt(v);
148                Ok(ValueRef::Number(n))
149            }
150
151            fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
152            where
153                E: serde::de::Error,
154            {
155                let n = Number::Float(v);
156                Ok(ValueRef::Number(n))
157            }
158
159            fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
160            where
161                E: serde::de::Error,
162            {
163                Ok(ValueRef::String(v))
164            }
165
166            fn visit_none<E>(self) -> Result<Self::Value, E>
167            where
168                E: serde::de::Error,
169            {
170                Ok(ValueRef::Nil)
171            }
172
173            fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
174            where
175                E: serde::de::Error,
176            {
177                Ok(ValueRef::Bin(v))
178            }
179
180            fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
181            where
182                D: serde::Deserializer<'de>,
183            {
184                let ext = super::ext_ref::deserialize(deserializer)?;
185                Ok(ValueRef::Extension(ext))
186            }
187
188            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
189            where
190                A: serde::de::SeqAccess<'de>,
191            {
192                let mut buf = Vec::new();
193
194                while let Some(v) = seq.next_element::<ValueRef>()? {
195                    buf.push(v);
196                }
197
198                Ok(ValueRef::Array(buf))
199            }
200
201            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
202            where
203                A: serde::de::MapAccess<'de>,
204            {
205                let mut buf = Vec::new();
206
207                while let Some(v) = map.next_entry()? {
208                    buf.push(v);
209                }
210
211                Ok(ValueRef::Map(buf))
212            }
213        }
214        deserializer.deserialize_any(ValueVisitor)
215    }
216}