fbthrift_git/
deserialize.rs1use std::collections::BTreeMap;
18use std::collections::BTreeSet;
19use std::collections::HashMap;
20use std::collections::HashSet;
21use std::hash::Hash;
22use std::sync::Arc;
23
24use bytes::Bytes;
25use ordered_float::OrderedFloat;
26
27use crate::protocol::should_break;
28use crate::protocol::ProtocolReader;
29use crate::Result;
30
31pub trait Deserialize<P>
33where
34 P: ProtocolReader,
35{
36 fn read(p: &mut P) -> Result<Self>
37 where
38 Self: Sized;
39}
40
41impl<P, T> Deserialize<P> for Box<T>
42where
43 P: ProtocolReader,
44 T: Deserialize<P>,
45{
46 #[inline]
47 fn read(p: &mut P) -> Result<Self> {
48 T::read(p).map(Box::new)
49 }
50}
51
52impl<P, T> Deserialize<P> for Arc<T>
53where
54 P: ProtocolReader,
55 T: Deserialize<P>,
56{
57 fn read(p: &mut P) -> Result<Self> {
58 T::read(p).map(Arc::new)
59 }
60}
61
62impl<P> Deserialize<P> for ()
63where
64 P: ProtocolReader,
65{
66 #[inline]
67 fn read(_p: &mut P) -> Result<Self> {
68 Ok(())
69 }
70}
71
72impl<P> Deserialize<P> for bool
73where
74 P: ProtocolReader,
75{
76 #[inline]
77 fn read(p: &mut P) -> Result<Self> {
78 p.read_bool()
79 }
80}
81
82impl<P> Deserialize<P> for i8
83where
84 P: ProtocolReader,
85{
86 #[inline]
87 fn read(p: &mut P) -> Result<Self> {
88 p.read_byte()
89 }
90}
91
92impl<P> Deserialize<P> for i16
93where
94 P: ProtocolReader,
95{
96 #[inline]
97 fn read(p: &mut P) -> Result<Self> {
98 p.read_i16()
99 }
100}
101
102impl<P> Deserialize<P> for i32
103where
104 P: ProtocolReader,
105{
106 #[inline]
107 fn read(p: &mut P) -> Result<Self> {
108 p.read_i32()
109 }
110}
111
112impl<P> Deserialize<P> for i64
113where
114 P: ProtocolReader,
115{
116 #[inline]
117 fn read(p: &mut P) -> Result<Self> {
118 p.read_i64()
119 }
120}
121
122impl<P> Deserialize<P> for f64
123where
124 P: ProtocolReader,
125{
126 #[inline]
127 fn read(p: &mut P) -> Result<Self> {
128 p.read_double()
129 }
130}
131
132impl<P> Deserialize<P> for f32
133where
134 P: ProtocolReader,
135{
136 #[inline]
137 fn read(p: &mut P) -> Result<Self> {
138 p.read_float()
139 }
140}
141
142impl<P> Deserialize<P> for OrderedFloat<f64>
143where
144 P: ProtocolReader,
145{
146 #[inline]
147 fn read(p: &mut P) -> Result<Self> {
148 p.read_double().map(OrderedFloat)
149 }
150}
151
152impl<P> Deserialize<P> for OrderedFloat<f32>
153where
154 P: ProtocolReader,
155{
156 #[inline]
157 fn read(p: &mut P) -> Result<Self> {
158 p.read_float().map(OrderedFloat)
159 }
160}
161
162impl<P> Deserialize<P> for String
163where
164 P: ProtocolReader,
165{
166 #[inline]
167 fn read(p: &mut P) -> Result<Self> {
168 p.read_string()
169 }
170}
171
172impl<P> Deserialize<P> for Bytes
173where
174 P: ProtocolReader,
175{
176 #[inline]
177 fn read(p: &mut P) -> Result<Self> {
178 p.read_binary()
179 }
180}
181
182impl<P> Deserialize<P> for Vec<u8>
183where
184 P: ProtocolReader,
185{
186 #[inline]
187 fn read(p: &mut P) -> Result<Self> {
188 p.read_binary()
189 }
190}
191
192impl<P, T> Deserialize<P> for BTreeSet<T>
193where
194 P: ProtocolReader,
195 T: Deserialize<P> + Ord,
196{
197 fn read(p: &mut P) -> Result<Self> {
198 let (_elem_ty, len) = p.read_set_begin()?;
199 let mut bset = BTreeSet::new();
200
201 if let Some(0) = len {
202 return Ok(bset);
203 }
204
205 let mut idx = 0;
206 loop {
207 let more = p.read_set_value_begin()?;
208 if !more {
209 break;
210 }
211 let item = Deserialize::read(p)?;
212 p.read_set_value_end()?;
213 bset.insert(item);
214
215 idx += 1;
216 if should_break(len, more, idx) {
217 break;
218 }
219 }
220 p.read_set_end()?;
221 Ok(bset)
222 }
223}
224
225impl<P, T, S> Deserialize<P> for HashSet<T, S>
226where
227 P: ProtocolReader,
228 T: Deserialize<P> + Hash + Eq,
229 S: std::hash::BuildHasher + Default,
230{
231 fn read(p: &mut P) -> Result<Self> {
232 let (_elem_ty, len) = p.read_set_begin()?;
233 let mut hset =
234 HashSet::with_capacity_and_hasher(len.unwrap_or_default(), Default::default());
235
236 if let Some(0) = len {
237 return Ok(hset);
238 }
239
240 let mut idx = 0;
241 loop {
242 let more = p.read_set_value_begin()?;
243 if !more {
244 break;
245 }
246 let item = Deserialize::read(p)?;
247 p.read_set_value_end()?;
248 hset.insert(item);
249
250 idx += 1;
251 if should_break(len, more, idx) {
252 break;
253 }
254 }
255 p.read_set_end()?;
256 Ok(hset)
257 }
258}
259
260impl<P, K, V> Deserialize<P> for BTreeMap<K, V>
261where
262 P: ProtocolReader,
263 K: Deserialize<P> + Ord,
264 V: Deserialize<P>,
265{
266 fn read(p: &mut P) -> Result<Self> {
267 let (_key_ty, _val_ty, len) = p.read_map_begin()?;
268 let mut btree = BTreeMap::new();
269
270 if let Some(0) = len {
271 return Ok(btree);
272 }
273
274 let mut idx = 0;
275 loop {
276 let more = p.read_map_key_begin()?;
277 if !more {
278 break;
279 }
280 let key = Deserialize::read(p)?;
281 p.read_map_value_begin()?;
282 let val = Deserialize::read(p)?;
283 p.read_map_value_end()?;
284 btree.insert(key, val);
285
286 idx += 1;
287 if should_break(len, more, idx) {
288 break;
289 }
290 }
291 p.read_map_end()?;
292 Ok(btree)
293 }
294}
295
296impl<P, K, V, S> Deserialize<P> for HashMap<K, V, S>
297where
298 P: ProtocolReader,
299 K: Deserialize<P> + Hash + Eq,
300 V: Deserialize<P>,
301 S: std::hash::BuildHasher + Default,
302{
303 fn read(p: &mut P) -> Result<Self> {
304 let (_key_ty, _val_ty, len) = p.read_map_begin()?;
305 let mut hmap =
306 HashMap::with_capacity_and_hasher(len.unwrap_or_default(), Default::default());
307
308 if let Some(0) = len {
309 return Ok(hmap);
310 }
311
312 let mut idx = 0;
313 loop {
314 let more = p.read_map_key_begin()?;
315 if !more {
316 break;
317 }
318 let key = Deserialize::read(p)?;
319 p.read_map_value_begin()?;
320 let val = Deserialize::read(p)?;
321 p.read_map_value_end()?;
322 hmap.insert(key, val);
323
324 idx += 1;
325 if should_break(len, more, idx) {
326 break;
327 }
328 }
329 p.read_map_end()?;
330 Ok(hmap)
331 }
332}
333
334impl<P, T> Deserialize<P> for Vec<T>
335where
336 P: ProtocolReader,
337 T: Deserialize<P> + crate::ttype::GetTType, {
339 fn read(p: &mut P) -> Result<Self> {
341 let (_elem_ty, len) = p.read_list_begin()?;
342 let mut list = Vec::with_capacity(len.unwrap_or_default());
343
344 if let Some(0) = len {
345 return Ok(list);
346 }
347
348 let mut idx = 0;
349 loop {
350 let more = p.read_list_value_begin()?;
351 if !more {
352 break;
353 }
354 let item = Deserialize::read(p)?;
355 p.read_list_value_end()?;
356 list.push(item);
357
358 idx += 1;
359 if should_break(len, more, idx) {
360 break;
361 }
362 }
363 p.read_list_end()?;
364 Ok(list)
365 }
366}