icu_provider/buf/
serde.rs1use crate::DryDataProvider;
15use crate::buf::BufferFormat;
16use crate::buf::BufferProvider;
17use crate::data_provider::DynamicDryDataProvider;
18use crate::prelude::*;
19use serde::de::Deserialize;
20use yoke::Yokeable;
21
22#[derive(Debug)]
24pub struct DeserializingBufferProvider<'a, P: ?Sized>(&'a P);
25
26pub trait AsDeserializingBufferProvider {
30 fn as_deserializing(&self) -> DeserializingBufferProvider<'_, Self>;
41}
42
43impl<P> AsDeserializingBufferProvider for P
44where
45 P: BufferProvider + ?Sized,
46{
47 fn as_deserializing(&self) -> DeserializingBufferProvider<'_, Self> {
58 DeserializingBufferProvider(self)
59 }
60}
61
62fn deserialize_impl<'data, M>(
63 #[allow(unused_variables)] bytes: &'data [u8],
65 buffer_format: BufferFormat,
66) -> Result<<M::DataStruct as Yokeable<'data>>::Output, DataError>
67where
68 M: DynamicDataMarker,
69 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
70{
71 match buffer_format {
72 #[cfg(feature = "deserialize_json")]
73 BufferFormat::Json => {
74 let mut d = serde_json::Deserializer::from_slice(bytes);
75 Ok(Deserialize::deserialize(&mut d)?)
76 }
77
78 #[cfg(feature = "deserialize_bincode_1")]
79 BufferFormat::Bincode1 => {
80 use bincode::Options;
81 let options = bincode::DefaultOptions::new()
82 .with_fixint_encoding()
83 .allow_trailing_bytes();
84 let mut d = bincode::de::Deserializer::from_slice(bytes, options);
85 Ok(Deserialize::deserialize(&mut d)?)
86 }
87
88 #[cfg(feature = "deserialize_postcard_1")]
89 BufferFormat::Postcard1 => {
90 let mut d = postcard::Deserializer::from_bytes(bytes);
91 Ok(Deserialize::deserialize(&mut d)?)
92 }
93
94 #[allow(unreachable_patterns)]
96 _ => {
97 buffer_format.check_available()?;
98 unreachable!()
99 }
100 }
101}
102
103impl DataPayload<BufferMarker> {
104 pub fn into_deserialized<M>(
138 self,
139 buffer_format: BufferFormat,
140 ) -> Result<DataPayload<M>, DataError>
141 where
142 M: DynamicDataMarker,
143 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
144 {
145 self.try_map_project(|bytes, _| deserialize_impl::<M>(bytes, buffer_format))
146 }
147}
148
149impl<P, M> DynamicDataProvider<M> for DeserializingBufferProvider<'_, P>
150where
151 M: DynamicDataMarker,
152 P: BufferProvider + ?Sized,
153 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
154{
155 fn load_data(
166 &self,
167 marker: DataMarkerInfo,
168 req: DataRequest,
169 ) -> Result<DataResponse<M>, DataError> {
170 let buffer_response = self.0.load_data(marker, req)?;
171 let buffer_format = buffer_response.metadata.buffer_format.ok_or_else(|| {
172 DataErrorKind::Deserialize
173 .with_str_context("BufferProvider didn't set BufferFormat")
174 .with_req(marker, req)
175 })?;
176 Ok(DataResponse {
177 metadata: buffer_response.metadata,
178 payload: buffer_response
179 .payload
180 .into_deserialized(buffer_format)
181 .map_err(|e| e.with_req(marker, req))?,
182 })
183 }
184}
185
186impl<P, M> DynamicDryDataProvider<M> for DeserializingBufferProvider<'_, P>
187where
188 M: DynamicDataMarker,
189 P: DynamicDryDataProvider<BufferMarker> + ?Sized,
190 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
191{
192 fn dry_load_data(
193 &self,
194 marker: DataMarkerInfo,
195 req: DataRequest,
196 ) -> Result<DataResponseMetadata, DataError> {
197 self.0.dry_load_data(marker, req)
198 }
199}
200
201impl<P, M> DataProvider<M> for DeserializingBufferProvider<'_, P>
202where
203 M: DataMarker,
204 P: DynamicDataProvider<BufferMarker> + ?Sized,
205 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
206{
207 fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
218 self.load_data(M::INFO, req)
219 }
220}
221
222impl<P, M> DryDataProvider<M> for DeserializingBufferProvider<'_, P>
223where
224 M: DataMarker,
225 P: DynamicDryDataProvider<BufferMarker> + ?Sized,
226 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
227{
228 fn dry_load(&self, req: DataRequest) -> Result<DataResponseMetadata, DataError> {
229 self.0.dry_load_data(M::INFO, req)
230 }
231}
232
233#[cfg(feature = "deserialize_json")]
234impl From<serde_json::error::Error> for DataError {
235 fn from(e: serde_json::error::Error) -> Self {
236 DataErrorKind::Deserialize
237 .with_str_context("serde_json")
238 .with_display_context(&e)
239 }
240}
241
242#[cfg(feature = "deserialize_bincode_1")]
243impl From<bincode::Error> for DataError {
244 fn from(e: bincode::Error) -> Self {
245 DataErrorKind::Deserialize
246 .with_str_context("bincode")
247 .with_display_context(&e)
248 }
249}
250
251#[cfg(feature = "deserialize_postcard_1")]
252impl From<postcard::Error> for DataError {
253 fn from(e: postcard::Error) -> Self {
254 DataErrorKind::Deserialize
255 .with_str_context("postcard")
256 .with_display_context(&e)
257 }
258}