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}