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