1 | // Super explicit first paragraph because this shows up at the top level and |
2 | // trips up people who are just looking for basic Serialize / Deserialize |
3 | // documentation. |
4 | // |
5 | /// Helper macro when implementing the `Deserializer` part of a new data format |
6 | /// for Serde. |
7 | /// |
8 | /// Some [`Deserializer`] implementations for self-describing formats do not |
9 | /// care what hint the [`Visitor`] gives them, they just want to blindly call |
10 | /// the [`Visitor`] method corresponding to the data they can tell is in the |
11 | /// input. This requires repetitive implementations of all the [`Deserializer`] |
12 | /// trait methods. |
13 | /// |
14 | /// ```edition2021 |
15 | /// # use serde::forward_to_deserialize_any; |
16 | /// # use serde::de::{value, Deserializer, Visitor}; |
17 | /// # |
18 | /// # struct MyDeserializer; |
19 | /// # |
20 | /// # impl<'de> Deserializer<'de> for MyDeserializer { |
21 | /// # type Error = value::Error; |
22 | /// # |
23 | /// # fn deserialize_any<V>(self, _: V) -> Result<V::Value, Self::Error> |
24 | /// # where |
25 | /// # V: Visitor<'de>, |
26 | /// # { |
27 | /// # unimplemented!() |
28 | /// # } |
29 | /// # |
30 | /// #[inline] |
31 | /// fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> |
32 | /// where |
33 | /// V: Visitor<'de>, |
34 | /// { |
35 | /// self.deserialize_any(visitor) |
36 | /// } |
37 | /// # |
38 | /// # forward_to_deserialize_any! { |
39 | /// # i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
40 | /// # bytes byte_buf option unit unit_struct newtype_struct seq tuple |
41 | /// # tuple_struct map struct enum identifier ignored_any |
42 | /// # } |
43 | /// # } |
44 | /// ``` |
45 | /// |
46 | /// The `forward_to_deserialize_any!` macro implements these simple forwarding |
47 | /// methods so that they forward directly to [`Deserializer::deserialize_any`]. |
48 | /// You can choose which methods to forward. |
49 | /// |
50 | /// ```edition2021 |
51 | /// # use serde::forward_to_deserialize_any; |
52 | /// # use serde::de::{value, Deserializer, Visitor}; |
53 | /// # |
54 | /// # struct MyDeserializer; |
55 | /// # |
56 | /// impl<'de> Deserializer<'de> for MyDeserializer { |
57 | /// # type Error = value::Error; |
58 | /// # |
59 | /// fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> |
60 | /// where |
61 | /// V: Visitor<'de>, |
62 | /// { |
63 | /// /* ... */ |
64 | /// # let _ = visitor; |
65 | /// # unimplemented!() |
66 | /// } |
67 | /// |
68 | /// forward_to_deserialize_any! { |
69 | /// bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
70 | /// bytes byte_buf option unit unit_struct newtype_struct seq tuple |
71 | /// tuple_struct map struct enum identifier ignored_any |
72 | /// } |
73 | /// } |
74 | /// ``` |
75 | /// |
76 | /// The macro assumes the convention that your `Deserializer` lifetime parameter |
77 | /// is called `'de` and that the `Visitor` type parameters on each method are |
78 | /// called `V`. A different type parameter and a different lifetime can be |
79 | /// specified explicitly if necessary. |
80 | /// |
81 | /// ```edition2021 |
82 | /// # use serde::forward_to_deserialize_any; |
83 | /// # use serde::de::{value, Deserializer, Visitor}; |
84 | /// # use std::marker::PhantomData; |
85 | /// # |
86 | /// # struct MyDeserializer<V>(PhantomData<V>); |
87 | /// # |
88 | /// # impl<'q, V> Deserializer<'q> for MyDeserializer<V> { |
89 | /// # type Error = value::Error; |
90 | /// # |
91 | /// # fn deserialize_any<W>(self, visitor: W) -> Result<W::Value, Self::Error> |
92 | /// # where |
93 | /// # W: Visitor<'q>, |
94 | /// # { |
95 | /// # unimplemented!() |
96 | /// # } |
97 | /// # |
98 | /// forward_to_deserialize_any! { |
99 | /// <W: Visitor<'q>> |
100 | /// bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
101 | /// bytes byte_buf option unit unit_struct newtype_struct seq tuple |
102 | /// tuple_struct map struct enum identifier ignored_any |
103 | /// } |
104 | /// # } |
105 | /// ``` |
106 | /// |
107 | /// [`Deserializer`]: trait.Deserializer.html |
108 | /// [`Visitor`]: de/trait.Visitor.html |
109 | /// [`Deserializer::deserialize_any`]: trait.Deserializer.html#tymethod.deserialize_any |
110 | #[macro_export (local_inner_macros)] |
111 | macro_rules! forward_to_deserialize_any { |
112 | (<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => { |
113 | $(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})* |
114 | }; |
115 | // This case must be after the previous one. |
116 | ($($func:ident)*) => { |
117 | $(forward_to_deserialize_any_helper!{$func<'de, V>})* |
118 | }; |
119 | } |
120 | |
121 | #[doc (hidden)] |
122 | #[macro_export ] |
123 | macro_rules! forward_to_deserialize_any_method { |
124 | ($func:ident<$l:tt, $v:ident>($($arg:ident : $ty:ty),*)) => { |
125 | #[inline] |
126 | fn $func<$v>(self, $($arg: $ty,)* visitor: $v) -> $crate::__private::Result<$v::Value, Self::Error> |
127 | where |
128 | $v: $crate::de::Visitor<$l>, |
129 | { |
130 | $( |
131 | let _ = $arg; |
132 | )* |
133 | self.deserialize_any(visitor) |
134 | } |
135 | }; |
136 | } |
137 | |
138 | #[doc (hidden)] |
139 | #[macro_export (local_inner_macros)] |
140 | macro_rules! forward_to_deserialize_any_helper { |
141 | (bool<$l:tt, $v:ident>) => { |
142 | forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()} |
143 | }; |
144 | (i8<$l:tt, $v:ident>) => { |
145 | forward_to_deserialize_any_method!{deserialize_i8<$l, $v>()} |
146 | }; |
147 | (i16<$l:tt, $v:ident>) => { |
148 | forward_to_deserialize_any_method!{deserialize_i16<$l, $v>()} |
149 | }; |
150 | (i32<$l:tt, $v:ident>) => { |
151 | forward_to_deserialize_any_method!{deserialize_i32<$l, $v>()} |
152 | }; |
153 | (i64<$l:tt, $v:ident>) => { |
154 | forward_to_deserialize_any_method!{deserialize_i64<$l, $v>()} |
155 | }; |
156 | (i128<$l:tt, $v:ident>) => { |
157 | forward_to_deserialize_any_method!{deserialize_i128<$l, $v>()} |
158 | }; |
159 | (u8<$l:tt, $v:ident>) => { |
160 | forward_to_deserialize_any_method!{deserialize_u8<$l, $v>()} |
161 | }; |
162 | (u16<$l:tt, $v:ident>) => { |
163 | forward_to_deserialize_any_method!{deserialize_u16<$l, $v>()} |
164 | }; |
165 | (u32<$l:tt, $v:ident>) => { |
166 | forward_to_deserialize_any_method!{deserialize_u32<$l, $v>()} |
167 | }; |
168 | (u64<$l:tt, $v:ident>) => { |
169 | forward_to_deserialize_any_method!{deserialize_u64<$l, $v>()} |
170 | }; |
171 | (u128<$l:tt, $v:ident>) => { |
172 | forward_to_deserialize_any_method!{deserialize_u128<$l, $v>()} |
173 | }; |
174 | (f32<$l:tt, $v:ident>) => { |
175 | forward_to_deserialize_any_method!{deserialize_f32<$l, $v>()} |
176 | }; |
177 | (f64<$l:tt, $v:ident>) => { |
178 | forward_to_deserialize_any_method!{deserialize_f64<$l, $v>()} |
179 | }; |
180 | (char<$l:tt, $v:ident>) => { |
181 | forward_to_deserialize_any_method!{deserialize_char<$l, $v>()} |
182 | }; |
183 | (str<$l:tt, $v:ident>) => { |
184 | forward_to_deserialize_any_method!{deserialize_str<$l, $v>()} |
185 | }; |
186 | (string<$l:tt, $v:ident>) => { |
187 | forward_to_deserialize_any_method!{deserialize_string<$l, $v>()} |
188 | }; |
189 | (bytes<$l:tt, $v:ident>) => { |
190 | forward_to_deserialize_any_method!{deserialize_bytes<$l, $v>()} |
191 | }; |
192 | (byte_buf<$l:tt, $v:ident>) => { |
193 | forward_to_deserialize_any_method!{deserialize_byte_buf<$l, $v>()} |
194 | }; |
195 | (option<$l:tt, $v:ident>) => { |
196 | forward_to_deserialize_any_method!{deserialize_option<$l, $v>()} |
197 | }; |
198 | (unit<$l:tt, $v:ident>) => { |
199 | forward_to_deserialize_any_method!{deserialize_unit<$l, $v>()} |
200 | }; |
201 | (unit_struct<$l:tt, $v:ident>) => { |
202 | forward_to_deserialize_any_method!{deserialize_unit_struct<$l, $v>(name: &'static str)} |
203 | }; |
204 | (newtype_struct<$l:tt, $v:ident>) => { |
205 | forward_to_deserialize_any_method!{deserialize_newtype_struct<$l, $v>(name: &'static str)} |
206 | }; |
207 | (seq<$l:tt, $v:ident>) => { |
208 | forward_to_deserialize_any_method!{deserialize_seq<$l, $v>()} |
209 | }; |
210 | (tuple<$l:tt, $v:ident>) => { |
211 | forward_to_deserialize_any_method!{deserialize_tuple<$l, $v>(len: usize)} |
212 | }; |
213 | (tuple_struct<$l:tt, $v:ident>) => { |
214 | forward_to_deserialize_any_method!{deserialize_tuple_struct<$l, $v>(name: &'static str, len: usize)} |
215 | }; |
216 | (map<$l:tt, $v:ident>) => { |
217 | forward_to_deserialize_any_method!{deserialize_map<$l, $v>()} |
218 | }; |
219 | (struct<$l:tt, $v:ident>) => { |
220 | forward_to_deserialize_any_method!{deserialize_struct<$l, $v>(name: &'static str, fields: &'static [&'static str])} |
221 | }; |
222 | (enum<$l:tt, $v:ident>) => { |
223 | forward_to_deserialize_any_method!{deserialize_enum<$l, $v>(name: &'static str, variants: &'static [&'static str])} |
224 | }; |
225 | (identifier<$l:tt, $v:ident>) => { |
226 | forward_to_deserialize_any_method!{deserialize_identifier<$l, $v>()} |
227 | }; |
228 | (ignored_any<$l:tt, $v:ident>) => { |
229 | forward_to_deserialize_any_method!{deserialize_ignored_any<$l, $v>()} |
230 | }; |
231 | } |
232 | |