xref: /aosp_15_r20/external/cronet/third_party/rust/chromium_crates_io/vendor/serde-1.0.197/src/de/ignored_any.rs (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 use crate::lib::*;
2 
3 use 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)]
111 pub struct IgnoredAny;
112 
113 impl<'de> Visitor<'de> for IgnoredAny {
114     type Value = IgnoredAny;
115 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result116     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
117         formatter.write_str("anything at all")
118     }
119 
120     #[inline]
visit_bool<E>(self, x: bool) -> Result<Self::Value, E>121     fn visit_bool<E>(self, x: bool) -> Result<Self::Value, E> {
122         let _ = x;
123         Ok(IgnoredAny)
124     }
125 
126     #[inline]
visit_i64<E>(self, x: i64) -> Result<Self::Value, E>127     fn visit_i64<E>(self, x: i64) -> Result<Self::Value, E> {
128         let _ = x;
129         Ok(IgnoredAny)
130     }
131 
132     #[inline]
visit_i128<E>(self, x: i128) -> Result<Self::Value, E>133     fn visit_i128<E>(self, x: i128) -> Result<Self::Value, E> {
134         let _ = x;
135         Ok(IgnoredAny)
136     }
137 
138     #[inline]
visit_u64<E>(self, x: u64) -> Result<Self::Value, E>139     fn visit_u64<E>(self, x: u64) -> Result<Self::Value, E> {
140         let _ = x;
141         Ok(IgnoredAny)
142     }
143 
144     #[inline]
visit_u128<E>(self, x: u128) -> Result<Self::Value, E>145     fn visit_u128<E>(self, x: u128) -> Result<Self::Value, E> {
146         let _ = x;
147         Ok(IgnoredAny)
148     }
149 
150     #[inline]
visit_f64<E>(self, x: f64) -> Result<Self::Value, E>151     fn visit_f64<E>(self, x: f64) -> Result<Self::Value, E> {
152         let _ = x;
153         Ok(IgnoredAny)
154     }
155 
156     #[inline]
visit_str<E>(self, s: &str) -> Result<Self::Value, E> where E: Error,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]
visit_none<E>(self) -> Result<Self::Value, E>166     fn visit_none<E>(self) -> Result<Self::Value, E> {
167         Ok(IgnoredAny)
168     }
169 
170     #[inline]
visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,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]
visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,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]
visit_unit<E>(self) -> Result<Self::Value, E>187     fn visit_unit<E>(self) -> Result<Self::Value, E> {
188         Ok(IgnoredAny)
189     }
190 
191     #[inline]
visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> where A: SeqAccess<'de>,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]
visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: MapAccess<'de>,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]
visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E> where E: Error,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 
visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> where A: EnumAccess<'de>,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 
230 impl<'de> Deserialize<'de> for IgnoredAny {
231     #[inline]
deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error> where D: Deserializer<'de>,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 }
239