serde_persistent_deserializer/
lib.rs

1#![no_std]
2#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
3#![doc = include_str!("../README.md")]
4#![warn(
5    clippy::mod_module_files,
6    clippy::unwrap_used,
7    clippy::indexing_slicing,
8    missing_docs,
9    rust_2018_idioms,
10    trivial_casts,
11    trivial_numeric_casts,
12    unused_qualifications
13)]
14
15use core::ops::{Deref, DerefMut};
16
17use serde::{de::Visitor, serde_if_integer128, Deserializer};
18
19/// A newtype implementing [`serde::Deserializer`] if the type `D` implements [`AsTransientDeserializer`].
20#[derive(Debug, Clone, Copy)]
21pub struct PersistentDeserializer<D>(D);
22
23impl<D> PersistentDeserializer<D> {
24    /// Wraps the deserializer object.
25    pub fn new(deserializer: D) -> Self {
26        Self(deserializer)
27    }
28}
29
30impl<D> Deref for PersistentDeserializer<D> {
31    type Target = D;
32
33    #[inline]
34    fn deref(&self) -> &Self::Target {
35        &self.0
36    }
37}
38
39impl<D> DerefMut for PersistentDeserializer<D> {
40    #[inline]
41    fn deref_mut(&mut self) -> &mut Self::Target {
42        &mut self.0
43    }
44}
45
46/// Describes a type that can produce a [`serde::Deserializer`]-implementing object.
47pub trait AsTransientDeserializer<'de> {
48    /// The deserialization error type.
49    type Error: serde::de::Error;
50
51    /// Produces a deserializer object.
52    fn as_transient_deserializer<'a>(&'a mut self) -> impl Deserializer<'de, Error = Self::Error>;
53}
54
55impl<'de, D: AsTransientDeserializer<'de>> Deserializer<'de> for PersistentDeserializer<D> {
56    type Error = <D as AsTransientDeserializer<'de>>::Error;
57
58    // Note that we do not define `is_human_readable()`.
59    // None of the methods here use it, so it wouldn't have any effect
60    // (and we would have to add a method to `AsTransientDeserializer` if we needed it).
61
62    #[inline]
63    fn deserialize_any<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
64        self.0.as_transient_deserializer().deserialize_any(visitor)
65    }
66
67    #[inline]
68    fn deserialize_bool<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
69        self.0.as_transient_deserializer().deserialize_bool(visitor)
70    }
71
72    #[inline]
73    fn deserialize_i8<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
74        self.0.as_transient_deserializer().deserialize_i8(visitor)
75    }
76
77    #[inline]
78    fn deserialize_i16<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
79        self.0.as_transient_deserializer().deserialize_i16(visitor)
80    }
81
82    #[inline]
83    fn deserialize_i32<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
84        self.0.as_transient_deserializer().deserialize_i32(visitor)
85    }
86
87    #[inline]
88    fn deserialize_i64<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
89        self.0.as_transient_deserializer().deserialize_i64(visitor)
90    }
91
92    serde_if_integer128! {
93        #[inline]
94        fn deserialize_i128<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error>
95        {
96            self.0.as_transient_deserializer().deserialize_i128(visitor)
97        }
98    }
99
100    #[inline]
101    fn deserialize_u8<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
102        self.0.as_transient_deserializer().deserialize_u8(visitor)
103    }
104
105    #[inline]
106    fn deserialize_u16<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
107        self.0.as_transient_deserializer().deserialize_u16(visitor)
108    }
109
110    #[inline]
111    fn deserialize_u32<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
112        self.0.as_transient_deserializer().deserialize_u32(visitor)
113    }
114
115    #[inline]
116    fn deserialize_u64<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
117        self.0.as_transient_deserializer().deserialize_u64(visitor)
118    }
119
120    serde_if_integer128! {
121        #[inline]
122        fn deserialize_u128<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error>
123        {
124            self.0.as_transient_deserializer().deserialize_u128(visitor)
125        }
126    }
127
128    #[inline]
129    fn deserialize_f32<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
130        self.0.as_transient_deserializer().deserialize_f32(visitor)
131    }
132
133    #[inline]
134    fn deserialize_f64<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
135        self.0.as_transient_deserializer().deserialize_f64(visitor)
136    }
137
138    #[inline]
139    fn deserialize_char<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
140        self.0.as_transient_deserializer().deserialize_char(visitor)
141    }
142
143    #[inline]
144    fn deserialize_str<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
145        self.0.as_transient_deserializer().deserialize_str(visitor)
146    }
147
148    #[inline]
149    fn deserialize_string<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
150        self.0
151            .as_transient_deserializer()
152            .deserialize_string(visitor)
153    }
154
155    #[inline]
156    fn deserialize_bytes<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
157        self.0
158            .as_transient_deserializer()
159            .deserialize_bytes(visitor)
160    }
161
162    #[inline]
163    fn deserialize_byte_buf<V: Visitor<'de>>(
164        mut self,
165        visitor: V,
166    ) -> Result<V::Value, Self::Error> {
167        self.0
168            .as_transient_deserializer()
169            .deserialize_byte_buf(visitor)
170    }
171
172    #[inline]
173    fn deserialize_option<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
174        self.0
175            .as_transient_deserializer()
176            .deserialize_option(visitor)
177    }
178
179    #[inline]
180    fn deserialize_unit<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
181        self.0.as_transient_deserializer().deserialize_unit(visitor)
182    }
183
184    #[inline]
185    fn deserialize_unit_struct<V: Visitor<'de>>(
186        mut self,
187        name: &'static str,
188        visitor: V,
189    ) -> Result<V::Value, Self::Error> {
190        self.0
191            .as_transient_deserializer()
192            .deserialize_unit_struct(name, visitor)
193    }
194
195    #[inline]
196    fn deserialize_newtype_struct<V: Visitor<'de>>(
197        mut self,
198        name: &'static str,
199        visitor: V,
200    ) -> Result<V::Value, Self::Error> {
201        self.0
202            .as_transient_deserializer()
203            .deserialize_newtype_struct(name, visitor)
204    }
205
206    #[inline]
207    fn deserialize_seq<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
208        self.0.as_transient_deserializer().deserialize_seq(visitor)
209    }
210
211    #[inline]
212    fn deserialize_tuple<V: Visitor<'de>>(
213        mut self,
214        len: usize,
215        visitor: V,
216    ) -> Result<V::Value, Self::Error> {
217        self.0
218            .as_transient_deserializer()
219            .deserialize_tuple(len, visitor)
220    }
221
222    #[inline]
223    fn deserialize_tuple_struct<V: Visitor<'de>>(
224        mut self,
225        name: &'static str,
226        len: usize,
227        visitor: V,
228    ) -> Result<V::Value, Self::Error> {
229        self.0
230            .as_transient_deserializer()
231            .deserialize_tuple_struct(name, len, visitor)
232    }
233
234    #[inline]
235    fn deserialize_map<V: Visitor<'de>>(mut self, visitor: V) -> Result<V::Value, Self::Error> {
236        self.0.as_transient_deserializer().deserialize_map(visitor)
237    }
238
239    #[inline]
240    fn deserialize_struct<V: Visitor<'de>>(
241        mut self,
242        name: &'static str,
243        fields: &'static [&'static str],
244        visitor: V,
245    ) -> Result<V::Value, Self::Error> {
246        self.0
247            .as_transient_deserializer()
248            .deserialize_struct(name, fields, visitor)
249    }
250
251    #[inline]
252    fn deserialize_enum<V: Visitor<'de>>(
253        mut self,
254        name: &'static str,
255        variants: &'static [&'static str],
256        visitor: V,
257    ) -> Result<V::Value, Self::Error> {
258        self.0
259            .as_transient_deserializer()
260            .deserialize_enum(name, variants, visitor)
261    }
262
263    #[inline]
264    fn deserialize_identifier<V: Visitor<'de>>(
265        mut self,
266        visitor: V,
267    ) -> Result<V::Value, Self::Error> {
268        self.0
269            .as_transient_deserializer()
270            .deserialize_identifier(visitor)
271    }
272
273    #[inline]
274    fn deserialize_ignored_any<V: Visitor<'de>>(
275        mut self,
276        visitor: V,
277    ) -> Result<V::Value, Self::Error> {
278        self.0
279            .as_transient_deserializer()
280            .deserialize_ignored_any(visitor)
281    }
282}