messagepack_serde/value/
value_.rs1use super::number::Number;
2use alloc::vec::Vec;
3use messagepack_core::extension::ExtensionRef;
4use serde::{de::Visitor, ser::SerializeMap};
5
6#[derive(Debug, Clone, PartialEq, PartialOrd)]
8pub enum ValueRef<'a> {
9 Nil,
11 Bool(bool),
13 Bin(&'a [u8]),
15 Extension(ExtensionRef<'a>),
17 Number(Number),
19 String(&'a str),
21 Array(Vec<ValueRef<'a>>),
23 Map(Vec<(ValueRef<'a>, ValueRef<'a>)>),
25}
26
27impl ValueRef<'_> {
28 pub fn is_nil(&self) -> bool {
30 matches!(self, ValueRef::Nil)
31 }
32
33 pub fn as_bool(&self) -> Option<bool> {
35 match self {
36 ValueRef::Bool(v) => Some(*v),
37 _ => None,
38 }
39 }
40
41 pub fn as_bin(&self) -> Option<&[u8]> {
43 match self {
44 ValueRef::Bin(v) => Some(*v),
45 _ => None,
46 }
47 }
48
49 pub fn as_extension(&self) -> Option<&ExtensionRef<'_>> {
51 match self {
52 ValueRef::Extension(v) => Some(v),
53 _ => None,
54 }
55 }
56
57 pub fn as_number(&self) -> Option<Number> {
59 match self {
60 ValueRef::Number(v) => Some(*v),
61 _ => None,
62 }
63 }
64
65 pub fn as_string(&self) -> Option<&str> {
67 match self {
68 ValueRef::String(v) => Some(*v),
69 _ => None,
70 }
71 }
72
73 pub fn as_array(&self) -> Option<&[ValueRef<'_>]> {
75 match self {
76 ValueRef::Array(v) => Some(v),
77 _ => None,
78 }
79 }
80
81 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}