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}