aldrin_core/
serialized_value.rs1#[cfg(test)]
2mod test;
3
4use crate::error::{DeserializeError, SerializeError};
5use crate::generic_value::Value;
6#[cfg(feature = "introspection")]
7use crate::introspection::{BuiltInType, Introspectable, Layout, LexicalId, References};
8use crate::value::ValueKind;
9use crate::value_deserializer::{Deserialize, Deserializer};
10use crate::value_serializer::{AsSerializeArg, Serialize, Serializer};
11use bytes::BytesMut;
12use std::borrow::Borrow;
13use std::fmt;
14use std::mem;
15use std::ops::Deref;
16
17#[derive(Clone, Eq)]
18pub struct SerializedValue {
19 buf: BytesMut,
20}
21
22impl SerializedValue {
23 pub fn empty() -> Self {
28 Self {
29 buf: BytesMut::new(),
30 }
31 }
32
33 pub fn serialize<T: Serialize + ?Sized>(value: &T) -> Result<Self, SerializeError> {
34 let mut buf = BytesMut::zeroed(9);
36 let serializer = Serializer::new(&mut buf, 0)?;
37 value.serialize(serializer)?;
38 Ok(Self { buf })
39 }
40
41 pub fn take(&mut self) -> Self {
42 mem::take(self)
43 }
44
45 pub(crate) fn from_bytes_mut(buf: BytesMut) -> Self {
46 debug_assert!(buf.len() >= 10);
49
50 Self { buf }
51 }
52
53 pub(crate) fn into_bytes_mut(self) -> BytesMut {
54 self.buf
55 }
56}
57
58impl Default for SerializedValue {
59 fn default() -> Self {
60 Self::empty()
61 }
62}
63
64impl Deref for SerializedValue {
65 type Target = SerializedValueSlice;
66
67 fn deref(&self) -> &SerializedValueSlice {
68 SerializedValueSlice::new(&self.buf[9..])
70 }
71}
72
73impl fmt::Debug for SerializedValue {
76 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77 f.debug_struct("SerializedValue")
78 .field("buf", &&*self.buf)
79 .finish()
80 }
81}
82
83impl AsRef<SerializedValueSlice> for SerializedValue {
84 fn as_ref(&self) -> &SerializedValueSlice {
85 self
86 }
87}
88
89impl Borrow<SerializedValueSlice> for SerializedValue {
90 fn borrow(&self) -> &SerializedValueSlice {
91 self
92 }
93}
94
95impl AsRef<[u8]> for SerializedValue {
96 fn as_ref(&self) -> &[u8] {
97 self
98 }
99}
100
101impl PartialEq for SerializedValue {
102 fn eq(&self, other: &Self) -> bool {
103 ***self == ***other
104 }
105}
106
107impl PartialEq<SerializedValueSlice> for SerializedValue {
108 fn eq(&self, other: &SerializedValueSlice) -> bool {
109 ***self == **other
110 }
111}
112
113impl PartialEq<[u8]> for SerializedValue {
114 fn eq(&self, other: &[u8]) -> bool {
115 ***self == *other
116 }
117}
118
119impl PartialEq<SerializedValue> for [u8] {
120 fn eq(&self, other: &SerializedValue) -> bool {
121 *self == ***other
122 }
123}
124
125impl Serialize for SerializedValue {
126 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
127 (**self).serialize(serializer)
128 }
129}
130
131impl Deserialize for SerializedValue {
132 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
133 deserializer
134 .split_off_serialized_value()
135 .map(ToOwned::to_owned)
136 }
137}
138
139impl AsSerializeArg for SerializedValue {
140 type SerializeArg<'a> = &'a SerializedValueSlice;
141
142 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
143 where
144 Self: 'a,
145 {
146 self
147 }
148}
149
150#[cfg(feature = "introspection")]
151impl Introspectable for SerializedValue {
152 fn layout() -> Layout {
153 BuiltInType::Value.into()
154 }
155
156 fn lexical_id() -> LexicalId {
157 LexicalId::VALUE
158 }
159
160 fn add_references(_references: &mut References) {}
161}
162
163#[cfg(feature = "fuzzing")]
164impl<'a> arbitrary::Arbitrary<'a> for SerializedValue {
165 fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
166 let len = u.arbitrary_len::<u8>()?;
167 let bytes = u.bytes(len)?;
168 if bytes.len() >= 10 {
169 Ok(Self::from_bytes_mut(bytes.into()))
170 } else {
171 Err(arbitrary::Error::NotEnoughData)
172 }
173 }
174}
175
176#[derive(Debug, PartialEq, Eq)]
177#[repr(transparent)]
178pub struct SerializedValueSlice([u8]);
179
180impl SerializedValueSlice {
181 pub(crate) fn new<T: AsRef<[u8]> + ?Sized>(buf: &T) -> &Self {
182 let self_ptr = buf.as_ref() as *const [u8] as *const Self;
183 unsafe { &*self_ptr }
185 }
186
187 pub fn kind(&self) -> Result<ValueKind, DeserializeError> {
188 let mut buf = &self.0;
189 let deserializer = Deserializer::new(&mut buf, 0)?;
190 deserializer.peek_value_kind()
191 }
192
193 pub fn deserialize<T: Deserialize>(&self) -> Result<T, DeserializeError> {
194 let mut buf = &self.0;
195 let deserializer = Deserializer::new(&mut buf, 0)?;
196
197 let res = T::deserialize(deserializer);
198
199 if res.is_ok() && !buf.is_empty() {
200 return Err(DeserializeError::TrailingData);
201 }
202
203 res
204 }
205
206 pub fn deserialize_as_value(&self) -> Result<Value, DeserializeError> {
207 self.deserialize()
208 }
209}
210
211impl Deref for SerializedValueSlice {
212 type Target = [u8];
213
214 fn deref(&self) -> &[u8] {
215 &self.0
216 }
217}
218
219impl AsRef<[u8]> for SerializedValueSlice {
220 fn as_ref(&self) -> &[u8] {
221 self
222 }
223}
224
225impl ToOwned for SerializedValueSlice {
226 type Owned = SerializedValue;
227
228 fn to_owned(&self) -> SerializedValue {
229 SerializedValue::serialize(self).unwrap()
230 }
231}
232
233impl PartialEq<SerializedValue> for SerializedValueSlice {
234 fn eq(&self, other: &SerializedValue) -> bool {
235 **self == ***other
236 }
237}
238
239impl PartialEq<[u8]> for SerializedValueSlice {
240 fn eq(&self, other: &[u8]) -> bool {
241 **self == *other
242 }
243}
244
245impl PartialEq<SerializedValueSlice> for [u8] {
246 fn eq(&self, other: &SerializedValueSlice) -> bool {
247 *self == **other
248 }
249}
250
251impl Serialize for SerializedValueSlice {
252 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
253 serializer.copy_from_serialized_value(self);
254 Ok(())
255 }
256}
257
258impl AsSerializeArg for SerializedValueSlice {
259 type SerializeArg<'a> = &'a Self;
260
261 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
262 where
263 Self: 'a,
264 {
265 self
266 }
267}
268
269#[cfg(feature = "introspection")]
270impl Introspectable for SerializedValueSlice {
271 fn layout() -> Layout {
272 BuiltInType::Value.into()
273 }
274
275 fn lexical_id() -> LexicalId {
276 LexicalId::VALUE
277 }
278
279 fn add_references(_references: &mut References) {}
280}