arc_slice/
serde.rs

1use alloc::{string::String, vec::Vec};
2use core::{cmp, fmt, marker::PhantomData, ops::Deref};
3
4use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
5
6use crate::{
7    buffer::{Deserializable, Slice},
8    layout::{ArcLayout, Layout, LayoutMut},
9    utils::try_as_bytes,
10    ArcSlice, ArcSliceMut,
11};
12
13const MAX_DESERIALIZE_SIZE: usize = 1 << 12;
14
15fn serialize_slice<S: Serialize + Slice + ?Sized, Ser: Serializer>(
16    slice: &S,
17    serializer: Ser,
18) -> Result<Ser::Ok, Ser::Error> {
19    match try_as_bytes(slice) {
20        Some(b) => serializer.serialize_bytes(b),
21        None => slice.serialize(serializer),
22    }
23}
24
25impl<S: Serialize + Slice + ?Sized, L: Layout> Serialize for ArcSlice<S, L> {
26    fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
27    where
28        Ser: Serializer,
29    {
30        serialize_slice(self.deref(), serializer)
31    }
32}
33
34impl<S: Serialize + Slice + ?Sized, L: LayoutMut, const UNIQUE: bool> Serialize
35    for ArcSliceMut<S, L, UNIQUE>
36{
37    fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
38    where
39        Ser: Serializer,
40    {
41        serialize_slice(self.deref(), serializer)
42    }
43}
44
45trait IntoArcSlice<S: Slice + ?Sized> {
46    fn from_slice(slice: &S) -> Self;
47    fn from_vec(vec: S::Vec) -> Self;
48    fn from_arc_slice_mut(slice: ArcSliceMut<S, ArcLayout<false, false>>) -> Self;
49}
50
51impl<S: Slice + ?Sized, L: Layout> IntoArcSlice<S> for ArcSlice<S, L> {
52    fn from_slice(slice: &S) -> Self {
53        ArcSlice::new_bytes(slice)
54    }
55    fn from_vec(vec: S::Vec) -> Self {
56        ArcSlice::new_byte_vec(vec)
57    }
58    fn from_arc_slice_mut(slice: ArcSliceMut<S, ArcLayout<false, false>>) -> Self {
59        slice.freeze()
60    }
61}
62
63impl<S: Slice + ?Sized, L: LayoutMut> IntoArcSlice<S> for ArcSliceMut<S, L> {
64    fn from_slice(slice: &S) -> Self {
65        ArcSliceMut::new_bytes(slice)
66    }
67    fn from_vec(vec: S::Vec) -> Self {
68        ArcSliceMut::new_byte_vec(vec)
69    }
70    fn from_arc_slice_mut(slice: ArcSliceMut<S, ArcLayout<false, false>>) -> Self {
71        slice.with_layout()
72    }
73}
74
75struct ArcSliceVisitor<S: Slice + ?Sized, T>(PhantomData<(S::Vec, T)>);
76
77impl<'de, S: Slice + Deserializable + ?Sized, T: IntoArcSlice<S>> de::Visitor<'de>
78    for ArcSliceVisitor<S, T>
79where
80    S::Item: for<'a> Deserialize<'a>,
81    S::TryFromSliceError: fmt::Display,
82{
83    type Value = T;
84
85    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
86        S::expecting(formatter)
87    }
88
89    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
90    where
91        E: de::Error,
92    {
93        S::deserialize_from_str(v).map(T::from_slice)
94    }
95
96    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
97    where
98        E: de::Error,
99    {
100        S::deserialize_from_string(v).map(T::from_vec)
101    }
102
103    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
104    where
105        E: de::Error,
106    {
107        S::deserialize_from_bytes(v).map(T::from_slice)
108    }
109
110    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
111    where
112        E: de::Error,
113    {
114        S::deserialize_from_byte_buf(v).map(T::from_vec)
115    }
116
117    fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
118    where
119        V: de::SeqAccess<'de>,
120    {
121        if !S::try_deserialize_from_seq() {
122            return Err(de::Error::invalid_type(de::Unexpected::Seq, &self));
123        }
124        let capacity = cmp::min(
125            seq.size_hint().unwrap_or(0),
126            MAX_DESERIALIZE_SIZE / core::mem::size_of::<S::Item>(),
127        );
128        let mut slice = ArcSliceMut::<[S::Item], ArcLayout<false, false>>::with_capacity(capacity);
129        while let Some(item) = seq.next_element()? {
130            slice.push(item);
131        }
132        Ok(T::from_arc_slice_mut(
133            ArcSliceMut::try_from_arc_slice_mut(slice)
134                .map_err(|(err, _)| de::Error::custom(err))?,
135        ))
136    }
137}
138
139impl<'de, S: Slice + Deserializable + ?Sized, L: Layout> Deserialize<'de> for ArcSlice<S, L>
140where
141    S::Item: for<'a> Deserialize<'a>,
142    S::TryFromSliceError: fmt::Display,
143{
144    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
145    where
146        D: Deserializer<'de>,
147    {
148        S::deserialize(deserializer, ArcSliceVisitor::<S, Self>(PhantomData))
149    }
150}
151
152impl<'de, S: Slice + Deserializable + ?Sized, L: LayoutMut> Deserialize<'de> for ArcSliceMut<S, L>
153where
154    S::Item: for<'a> Deserialize<'a>,
155    S::TryFromSliceError: fmt::Display,
156{
157    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
158    where
159        D: Deserializer<'de>,
160    {
161        S::deserialize(deserializer, ArcSliceVisitor::<S, Self>(PhantomData))
162    }
163}
164
165#[cfg(feature = "inlined")]
166const _: () = {
167    use crate::inlined::SmallArcSlice;
168
169    impl<S: Serialize + Slice<Item = u8> + ?Sized, L: Layout> Serialize for SmallArcSlice<S, L> {
170        fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
171        where
172            Ser: Serializer,
173        {
174            serialize_slice(self.deref(), serializer)
175        }
176    }
177
178    impl<S: Slice<Item = u8> + ?Sized, L: Layout> IntoArcSlice<S> for SmallArcSlice<S, L> {
179        fn from_slice(slice: &S) -> Self {
180            SmallArcSlice::from_slice(slice)
181        }
182        fn from_vec(vec: S::Vec) -> Self {
183            ArcSlice::<S, L>::from_vec(vec).into()
184        }
185        fn from_arc_slice_mut(slice: ArcSliceMut<S, ArcLayout<false, false>>) -> Self {
186            slice.freeze().into()
187        }
188    }
189
190    impl<'de, S: Slice<Item = u8> + Deserializable + ?Sized, L: LayoutMut> Deserialize<'de>
191        for SmallArcSlice<S, L>
192    where
193        S::TryFromSliceError: fmt::Display,
194    {
195        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
196        where
197            D: Deserializer<'de>,
198        {
199            S::deserialize(deserializer, ArcSliceVisitor::<S, Self>(PhantomData))
200        }
201    }
202};