vortex_buffer/
serde.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::marker::PhantomData;
5
6use serde_core::de::Visitor;
7use serde_core::{Deserialize, Deserializer, Serialize, Serializer};
8
9use crate::{Alignment, Buffer, BufferMut, ByteBuffer};
10
11impl<T> Serialize for Buffer<T>
12where
13    T: Serialize,
14{
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18    {
19        serializer.serialize_bytes(self.inner().as_ref())
20    }
21}
22
23struct BufferVisitor<T> {
24    _marker: PhantomData<T>,
25}
26
27impl<T> Default for BufferVisitor<T> {
28    fn default() -> Self {
29        Self {
30            _marker: PhantomData,
31        }
32    }
33}
34
35impl<'de, T> Visitor<'de> for BufferVisitor<T>
36where
37    T: Deserialize<'de>,
38{
39    type Value = Buffer<T>;
40
41    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
42        write!(formatter, "byte buffer")
43    }
44
45    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
46    where
47        E: serde_core::de::Error,
48    {
49        let bytes = ByteBuffer::copy_from_aligned(v, Alignment::of::<T>());
50        Ok(Buffer::from_byte_buffer(bytes))
51    }
52
53    fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
54    where
55        E: serde_core::de::Error,
56    {
57        let bytes = ByteBuffer::copy_from_aligned(v, Alignment::of::<T>());
58        Ok(Buffer::from_byte_buffer(bytes))
59    }
60
61    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
62    where
63        E: serde_core::de::Error,
64    {
65        let bytes = ByteBuffer::copy_from_aligned(v, Alignment::of::<T>());
66        Ok(Buffer::from_byte_buffer(bytes))
67    }
68
69    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
70    where
71        A: serde_core::de::SeqAccess<'de>,
72    {
73        let mut buffer = seq
74            .size_hint()
75            .map(|hint| BufferMut::<T>::with_capacity(hint))
76            .unwrap_or_default();
77
78        while let Some(e) = seq.next_element()? {
79            buffer.push(e);
80        }
81
82        Ok(buffer.freeze())
83    }
84}
85
86impl<'de, T> Deserialize<'de> for Buffer<T>
87where
88    T: Deserialize<'de>,
89{
90    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91    where
92        D: Deserializer<'de>,
93    {
94        deserializer.deserialize_byte_buf(BufferVisitor::<T>::default())
95    }
96}