serde/de/
ignored_any.rs

1use crate::lib::*;
2
3use crate::de::{
4    Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, VariantAccess, Visitor,
5};
6
7/// An efficient way of discarding data from a deserializer.
8///
9/// Think of this like `serde_json::Value` in that it can be deserialized from
10/// any type, except that it does not store any information about the data that
11/// gets deserialized.
12///
13/// ```edition2021
14/// use serde::de::{
15///     self, Deserialize, DeserializeSeed, Deserializer, IgnoredAny, SeqAccess, Visitor,
16/// };
17/// use std::fmt;
18/// use std::marker::PhantomData;
19///
20/// /// A seed that can be used to deserialize only the `n`th element of a sequence
21/// /// while efficiently discarding elements of any type before or after index `n`.
22/// ///
23/// /// For example to deserialize only the element at index 3:
24/// ///
25/// /// ```
26/// /// NthElement::new(3).deserialize(deserializer)
27/// /// ```
28/// pub struct NthElement<T> {
29///     n: usize,
30///     marker: PhantomData<T>,
31/// }
32///
33/// impl<T> NthElement<T> {
34///     pub fn new(n: usize) -> Self {
35///         NthElement {
36///             n: n,
37///             marker: PhantomData,
38///         }
39///     }
40/// }
41///
42/// impl<'de, T> Visitor<'de> for NthElement<T>
43/// where
44///     T: Deserialize<'de>,
45/// {
46///     type Value = T;
47///
48///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
49///         write!(
50///             formatter,
51///             "a sequence in which we care about element {}",
52///             self.n
53///         )
54///     }
55///
56///     fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
57///     where
58///         A: SeqAccess<'de>,
59///     {
60///         // Skip over the first `n` elements.
61///         for i in 0..self.n {
62///             // It is an error if the sequence ends before we get to element `n`.
63///             if seq.next_element::<IgnoredAny>()?.is_none() {
64///                 return Err(de::Error::invalid_length(i, &self));
65///             }
66///         }
67///
68///         // Deserialize the one we care about.
69///         let nth = match seq.next_element()? {
70///             Some(nth) => nth,
71///             None => {
72///                 return Err(de::Error::invalid_length(self.n, &self));
73///             }
74///         };
75///
76///         // Skip over any remaining elements in the sequence after `n`.
77///         while let Some(IgnoredAny) = seq.next_element()? {
78///             // ignore
79///         }
80///
81///         Ok(nth)
82///     }
83/// }
84///
85/// impl<'de, T> DeserializeSeed<'de> for NthElement<T>
86/// where
87///     T: Deserialize<'de>,
88/// {
89///     type Value = T;
90///
91///     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
92///     where
93///         D: Deserializer<'de>,
94///     {
95///         deserializer.deserialize_seq(self)
96///     }
97/// }
98///
99/// # fn example<'de, D>(deserializer: D) -> Result<(), D::Error>
100/// # where
101/// #     D: Deserializer<'de>,
102/// # {
103/// // Deserialize only the sequence element at index 3 from this deserializer.
104/// // The element at index 3 is required to be a string. Elements before and
105/// // after index 3 are allowed to be of any type.
106/// let s: String = NthElement::new(3).deserialize(deserializer)?;
107/// #     Ok(())
108/// # }
109/// ```
110#[derive(Copy, Clone, Debug, Default, PartialEq)]
111pub struct IgnoredAny;
112
113impl<'de> Visitor<'de> for IgnoredAny {
114    type Value = IgnoredAny;
115
116    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
117        formatter.write_str("anything at all")
118    }
119
120    #[inline]
121    fn visit_bool<E>(self, x: bool) -> Result<Self::Value, E> {
122        let _ = x;
123        Ok(IgnoredAny)
124    }
125
126    #[inline]
127    fn visit_i64<E>(self, x: i64) -> Result<Self::Value, E> {
128        let _ = x;
129        Ok(IgnoredAny)
130    }
131
132    #[inline]
133    fn visit_i128<E>(self, x: i128) -> Result<Self::Value, E> {
134        let _ = x;
135        Ok(IgnoredAny)
136    }
137
138    #[inline]
139    fn visit_u64<E>(self, x: u64) -> Result<Self::Value, E> {
140        let _ = x;
141        Ok(IgnoredAny)
142    }
143
144    #[inline]
145    fn visit_u128<E>(self, x: u128) -> Result<Self::Value, E> {
146        let _ = x;
147        Ok(IgnoredAny)
148    }
149
150    #[inline]
151    fn visit_f64<E>(self, x: f64) -> Result<Self::Value, E> {
152        let _ = x;
153        Ok(IgnoredAny)
154    }
155
156    #[inline]
157    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
158    where
159        E: Error,
160    {
161        let _ = s;
162        Ok(IgnoredAny)
163    }
164
165    #[inline]
166    fn visit_none<E>(self) -> Result<Self::Value, E> {
167        Ok(IgnoredAny)
168    }
169
170    #[inline]
171    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
172    where
173        D: Deserializer<'de>,
174    {
175        IgnoredAny::deserialize(deserializer)
176    }
177
178    #[inline]
179    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
180    where
181        D: Deserializer<'de>,
182    {
183        IgnoredAny::deserialize(deserializer)
184    }
185
186    #[inline]
187    fn visit_unit<E>(self) -> Result<Self::Value, E> {
188        Ok(IgnoredAny)
189    }
190
191    #[inline]
192    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
193    where
194        A: SeqAccess<'de>,
195    {
196        while let Some(IgnoredAny) = tri!(seq.next_element()) {
197            // Gobble
198        }
199        Ok(IgnoredAny)
200    }
201
202    #[inline]
203    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
204    where
205        A: MapAccess<'de>,
206    {
207        while let Some((IgnoredAny, IgnoredAny)) = tri!(map.next_entry()) {
208            // Gobble
209        }
210        Ok(IgnoredAny)
211    }
212
213    #[inline]
214    fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>
215    where
216        E: Error,
217    {
218        let _ = bytes;
219        Ok(IgnoredAny)
220    }
221
222    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
223    where
224        A: EnumAccess<'de>,
225    {
226        tri!(data.variant::<IgnoredAny>()).1.newtype_variant()
227    }
228}
229
230impl<'de> Deserialize<'de> for IgnoredAny {
231    #[inline]
232    fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error>
233    where
234        D: Deserializer<'de>,
235    {
236        deserializer.deserialize_ignored_any(IgnoredAny)
237    }
238}