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};