icu_provider/buf/
serde.rs1use crate::buf::BufferFormat;
15use crate::buf::BufferProvider;
16use crate::data_provider::DynamicDryDataProvider;
17use crate::prelude::*;
18use crate::DryDataProvider;
19use serde::de::Deserialize;
20use yoke::Yokeable;
21
22#[derive(Debug)]
24pub struct DeserializingBufferProvider<'a, P: ?Sized>(&'a P);
25
26pub trait AsDeserializingBufferProvider {
28 fn as_deserializing(&self) -> DeserializingBufferProvider<Self>;
37}
38
39impl<P> AsDeserializingBufferProvider for P
40where
41 P: BufferProvider + ?Sized,
42{
43 fn as_deserializing(&self) -> DeserializingBufferProvider<Self> {
52 DeserializingBufferProvider(self)
53 }
54}
55
56fn deserialize_impl<'data, M>(
57 #[allow(unused_variables)] bytes: &'data [u8],
59 buffer_format: BufferFormat,
60) -> Result<<M::DataStruct as Yokeable<'data>>::Output, DataError>
61where
62 M: DynamicDataMarker,
63 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
64{
65 match buffer_format {
66 #[cfg(feature = "deserialize_json")]
67 BufferFormat::Json => {
68 let mut d = serde_json::Deserializer::from_slice(bytes);
69 Ok(Deserialize::deserialize(&mut d)?)
70 }
71
72 #[cfg(feature = "deserialize_bincode_1")]
73 BufferFormat::Bincode1 => {
74 use bincode::Options;
75 let options = bincode::DefaultOptions::new()
76 .with_fixint_encoding()
77 .allow_trailing_bytes();
78 let mut d = bincode::de::Deserializer::from_slice(bytes, options);
79 Ok(Deserialize::deserialize(&mut d)?)
80 }
81
82 #[cfg(feature = "deserialize_postcard_1")]
83 BufferFormat::Postcard1 => {
84 let mut d = postcard::Deserializer::from_bytes(bytes);
85 Ok(Deserialize::deserialize(&mut d)?)
86 }
87
88 #[allow(unreachable_patterns)]
90 _ => {
91 buffer_format.check_available()?;
92 unreachable!()
93 }
94 }
95}
96
97impl DataPayload<BufferMarker> {
98 pub fn into_deserialized<M>(
130 self,
131 buffer_format: BufferFormat,
132 ) -> Result<DataPayload<M>, DataError>
133 where
134 M: DynamicDataMarker,
135 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
136 {
137 self.try_map_project(|bytes, _| deserialize_impl::<M>(bytes, buffer_format))
138 }
139}
140
141impl<P, M> DynamicDataProvider<M> for DeserializingBufferProvider<'_, P>
142where
143 M: DynamicDataMarker,
144 P: BufferProvider + ?Sized,
145 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
146{
147 fn load_data(
156 &self,
157 marker: DataMarkerInfo,
158 req: DataRequest,
159 ) -> Result<DataResponse<M>, DataError> {
160 let buffer_response = self.0.load_data(marker, req)?;
161 let buffer_format = buffer_response.metadata.buffer_format.ok_or_else(|| {
162 DataErrorKind::Deserialize
163 .with_str_context("BufferProvider didn't set BufferFormat")
164 .with_req(marker, req)
165 })?;
166 Ok(DataResponse {
167 metadata: buffer_response.metadata,
168 payload: buffer_response
169 .payload
170 .into_deserialized(buffer_format)
171 .map_err(|e| e.with_req(marker, req))?,
172 })
173 }
174}
175
176impl<P, M> DynamicDryDataProvider<M> for DeserializingBufferProvider<'_, P>
177where
178 M: DynamicDataMarker,
179 P: DynamicDryDataProvider<BufferMarker> + ?Sized,
180 for<'de> <M::DataStruct as Yokeable<'de>>::Output: serde::de::Deserialize<'de>,
181{
182 fn dry_load_data(
183 &self,
184 marker: DataMarkerInfo,
185 req: DataRequest,
186 ) -> Result<DataResponseMetadata, DataError> {
187 self.0.dry_load_data(marker, req)
188 }
189}
190
191impl<P, M> DataProvider<M> for DeserializingBufferProvider<'_, P>
192where
193 M: DataMarker,
194 P: DynamicDataProvider<BufferMarker> + ?Sized,
195 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
196{
197 fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
206 self.load_data(M::INFO, req)
207 }
208}
209
210impl<P, M> DryDataProvider<M> for DeserializingBufferProvider<'_, P>
211where
212 M: DataMarker,
213 P: DynamicDryDataProvider<BufferMarker> + ?Sized,
214 for<'de> <M::DataStruct as Yokeable<'de>>::Output: Deserialize<'de>,
215{
216 fn dry_load(&self, req: DataRequest) -> Result<DataResponseMetadata, DataError> {
217 self.0.dry_load_data(M::INFO, req)
218 }
219}
220
221#[cfg(feature = "deserialize_json")]
222impl From<serde_json::error::Error> for crate::DataError {
223 fn from(e: serde_json::error::Error) -> Self {
224 DataErrorKind::Deserialize
225 .with_str_context("serde_json")
226 .with_display_context(&e)
227 }
228}
229
230#[cfg(feature = "deserialize_bincode_1")]
231impl From<bincode::Error> for crate::DataError {
232 fn from(e: bincode::Error) -> Self {
233 DataErrorKind::Deserialize
234 .with_str_context("bincode")
235 .with_display_context(&e)
236 }
237}
238
239#[cfg(feature = "deserialize_postcard_1")]
240impl From<postcard::Error> for crate::DataError {
241 fn from(e: postcard::Error) -> Self {
242 DataErrorKind::Deserialize
243 .with_str_context("postcard")
244 .with_display_context(&e)
245 }
246}