1 use config::{BincodeByteOrder, Options};
2 use std::io::Read;
3
4 use self::read::{BincodeRead, IoReader, SliceReader};
5 use byteorder::ReadBytesExt;
6 use config::{IntEncoding, SizeLimit};
7 use serde;
8 use serde::de::Error as DeError;
9 use serde::de::IntoDeserializer;
10 use {Error, ErrorKind, Result};
11
12 /// Specialized ways to read data into bincode.
13 pub mod read;
14
15 /// A Deserializer that reads bytes from a buffer.
16 ///
17 /// This struct should rarely be used.
18 /// In most cases, prefer the `deserialize_from` function.
19 ///
20 /// The ByteOrder that is chosen will impact the endianness that
21 /// is used to read integers out of the reader.
22 ///
23 /// ```ignore
24 /// let d = Deserializer::new(&mut some_reader, SizeLimit::new());
25 /// serde::Deserialize::deserialize(&mut deserializer);
26 /// let bytes_read = d.bytes_read();
27 /// ```
28 pub struct Deserializer<R, O: Options> {
29 pub(crate) reader: R,
30 options: O,
31 }
32
33 macro_rules! impl_deserialize_literal {
34 ($name:ident : $ty:ty = $read:ident()) => {
35 #[inline]
36 pub(crate) fn $name(&mut self) -> Result<$ty> {
37 self.read_literal_type::<$ty>()?;
38 self.reader
39 .$read::<<O::Endian as BincodeByteOrder>::Endian>()
40 .map_err(Into::into)
41 }
42 };
43 }
44
45 impl<'de, IR: Read, O: Options> Deserializer<IoReader<IR>, O> {
46 /// Creates a new Deserializer with a given `Read`er and options.
with_reader(r: IR, options: O) -> Self47 pub fn with_reader(r: IR, options: O) -> Self {
48 Deserializer {
49 reader: IoReader::new(r),
50 options,
51 }
52 }
53 }
54
55 impl<'de, O: Options> Deserializer<SliceReader<'de>, O> {
56 /// Creates a new Deserializer that will read from the given slice.
from_slice(slice: &'de [u8], options: O) -> Self57 pub fn from_slice(slice: &'de [u8], options: O) -> Self {
58 Deserializer {
59 reader: SliceReader::new(slice),
60 options,
61 }
62 }
63 }
64
65 impl<'de, R: BincodeRead<'de>, O: Options> Deserializer<R, O> {
66 /// Creates a new Deserializer with the given `BincodeRead`er
with_bincode_read(r: R, options: O) -> Deserializer<R, O>67 pub fn with_bincode_read(r: R, options: O) -> Deserializer<R, O> {
68 Deserializer { reader: r, options }
69 }
70
deserialize_byte(&mut self) -> Result<u8>71 pub(crate) fn deserialize_byte(&mut self) -> Result<u8> {
72 self.read_literal_type::<u8>()?;
73 self.reader.read_u8().map_err(Into::into)
74 }
75
76 impl_deserialize_literal! { deserialize_literal_u16 : u16 = read_u16() }
77 impl_deserialize_literal! { deserialize_literal_u32 : u32 = read_u32() }
78 impl_deserialize_literal! { deserialize_literal_u64 : u64 = read_u64() }
79
80 serde_if_integer128! {
81 impl_deserialize_literal! { deserialize_literal_u128 : u128 = read_u128() }
82 }
83
read_bytes(&mut self, count: u64) -> Result<()>84 fn read_bytes(&mut self, count: u64) -> Result<()> {
85 self.options.limit().add(count)
86 }
87
read_literal_type<T>(&mut self) -> Result<()>88 fn read_literal_type<T>(&mut self) -> Result<()> {
89 use std::mem::size_of;
90 self.read_bytes(size_of::<T>() as u64)
91 }
92
read_vec(&mut self) -> Result<Vec<u8>>93 fn read_vec(&mut self) -> Result<Vec<u8>> {
94 let len = O::IntEncoding::deserialize_len(self)?;
95 self.read_bytes(len as u64)?;
96 self.reader.get_byte_buffer(len)
97 }
98
read_string(&mut self) -> Result<String>99 fn read_string(&mut self) -> Result<String> {
100 let vec = self.read_vec()?;
101 String::from_utf8(vec).map_err(|e| ErrorKind::InvalidUtf8Encoding(e.utf8_error()).into())
102 }
103 }
104
105 macro_rules! impl_deserialize_int {
106 ($name:ident = $visitor_method:ident ($dser_method:ident)) => {
107 #[inline]
108 fn $name<V>(self, visitor: V) -> Result<V::Value>
109 where
110 V: serde::de::Visitor<'de>,
111 {
112 visitor.$visitor_method(O::IntEncoding::$dser_method(self)?)
113 }
114 };
115 }
116
117 impl<'de, 'a, R, O> serde::Deserializer<'de> for &'a mut Deserializer<R, O>
118 where
119 R: BincodeRead<'de>,
120 O: Options,
121 {
122 type Error = Error;
123
124 #[inline]
deserialize_any<V>(self, _visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,125 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
126 where
127 V: serde::de::Visitor<'de>,
128 {
129 Err(Box::new(ErrorKind::DeserializeAnyNotSupported))
130 }
131
deserialize_bool<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,132 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
133 where
134 V: serde::de::Visitor<'de>,
135 {
136 match self.deserialize_byte()? {
137 1 => visitor.visit_bool(true),
138 0 => visitor.visit_bool(false),
139 value => Err(ErrorKind::InvalidBoolEncoding(value).into()),
140 }
141 }
142
143 impl_deserialize_int!(deserialize_u16 = visit_u16(deserialize_u16));
144 impl_deserialize_int!(deserialize_u32 = visit_u32(deserialize_u32));
145 impl_deserialize_int!(deserialize_u64 = visit_u64(deserialize_u64));
146 impl_deserialize_int!(deserialize_i16 = visit_i16(deserialize_i16));
147 impl_deserialize_int!(deserialize_i32 = visit_i32(deserialize_i32));
148 impl_deserialize_int!(deserialize_i64 = visit_i64(deserialize_i64));
149
deserialize_f32<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,150 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
151 where
152 V: serde::de::Visitor<'de>,
153 {
154 self.read_literal_type::<f32>()?;
155 let value = self
156 .reader
157 .read_f32::<<O::Endian as BincodeByteOrder>::Endian>()?;
158 visitor.visit_f32(value)
159 }
160
deserialize_f64<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,161 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
162 where
163 V: serde::de::Visitor<'de>,
164 {
165 self.read_literal_type::<f64>()?;
166 let value = self
167 .reader
168 .read_f64::<<O::Endian as BincodeByteOrder>::Endian>()?;
169 visitor.visit_f64(value)
170 }
171
172 serde_if_integer128! {
173 impl_deserialize_int!(deserialize_u128 = visit_u128(deserialize_u128));
174 impl_deserialize_int!(deserialize_i128 = visit_i128(deserialize_i128));
175 }
176
177 #[inline]
deserialize_u8<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,178 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
179 where
180 V: serde::de::Visitor<'de>,
181 {
182 visitor.visit_u8(self.deserialize_byte()? as u8)
183 }
184
185 #[inline]
deserialize_i8<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,186 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
187 where
188 V: serde::de::Visitor<'de>,
189 {
190 visitor.visit_i8(self.deserialize_byte()? as i8)
191 }
192
deserialize_unit<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,193 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
194 where
195 V: serde::de::Visitor<'de>,
196 {
197 visitor.visit_unit()
198 }
199
deserialize_char<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,200 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
201 where
202 V: serde::de::Visitor<'de>,
203 {
204 use std::str;
205
206 let error = || ErrorKind::InvalidCharEncoding.into();
207
208 let mut buf = [0u8; 4];
209
210 // Look at the first byte to see how many bytes must be read
211 self.reader.read_exact(&mut buf[..1])?;
212 let width = utf8_char_width(buf[0]);
213 if width == 1 {
214 return visitor.visit_char(buf[0] as char);
215 }
216 if width == 0 {
217 return Err(error());
218 }
219
220 if self.reader.read_exact(&mut buf[1..width]).is_err() {
221 return Err(error());
222 }
223
224 let res = str::from_utf8(&buf[..width])
225 .ok()
226 .and_then(|s| s.chars().next())
227 .ok_or_else(error)?;
228 visitor.visit_char(res)
229 }
230
deserialize_str<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,231 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
232 where
233 V: serde::de::Visitor<'de>,
234 {
235 let len = O::IntEncoding::deserialize_len(self)?;
236 self.read_bytes(len as u64)?;
237 self.reader.forward_read_str(len, visitor)
238 }
239
deserialize_string<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,240 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
241 where
242 V: serde::de::Visitor<'de>,
243 {
244 visitor.visit_string(self.read_string()?)
245 }
246
deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,247 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
248 where
249 V: serde::de::Visitor<'de>,
250 {
251 let len = O::IntEncoding::deserialize_len(self)?;
252 self.read_bytes(len as u64)?;
253 self.reader.forward_read_bytes(len, visitor)
254 }
255
deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,256 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
257 where
258 V: serde::de::Visitor<'de>,
259 {
260 visitor.visit_byte_buf(self.read_vec()?)
261 }
262
deserialize_enum<V>( self, _enum: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: serde::de::Visitor<'de>,263 fn deserialize_enum<V>(
264 self,
265 _enum: &'static str,
266 _variants: &'static [&'static str],
267 visitor: V,
268 ) -> Result<V::Value>
269 where
270 V: serde::de::Visitor<'de>,
271 {
272 impl<'de, 'a, R: 'a, O> serde::de::EnumAccess<'de> for &'a mut Deserializer<R, O>
273 where
274 R: BincodeRead<'de>,
275 O: Options,
276 {
277 type Error = Error;
278 type Variant = Self;
279
280 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
281 where
282 V: serde::de::DeserializeSeed<'de>,
283 {
284 let idx: u32 = O::IntEncoding::deserialize_u32(self)?;
285 let val: Result<_> = seed.deserialize(idx.into_deserializer());
286 Ok((val?, self))
287 }
288 }
289
290 visitor.visit_enum(self)
291 }
292
deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,293 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value>
294 where
295 V: serde::de::Visitor<'de>,
296 {
297 struct Access<'a, R: Read + 'a, O: Options + 'a> {
298 deserializer: &'a mut Deserializer<R, O>,
299 len: usize,
300 }
301
302 impl<'de, 'a, 'b: 'a, R: BincodeRead<'de> + 'b, O: Options> serde::de::SeqAccess<'de>
303 for Access<'a, R, O>
304 {
305 type Error = Error;
306
307 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
308 where
309 T: serde::de::DeserializeSeed<'de>,
310 {
311 if self.len > 0 {
312 self.len -= 1;
313 let value =
314 serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)?;
315 Ok(Some(value))
316 } else {
317 Ok(None)
318 }
319 }
320
321 fn size_hint(&self) -> Option<usize> {
322 Some(self.len)
323 }
324 }
325
326 visitor.visit_seq(Access {
327 deserializer: self,
328 len,
329 })
330 }
331
deserialize_option<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,332 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
333 where
334 V: serde::de::Visitor<'de>,
335 {
336 let value: u8 = serde::de::Deserialize::deserialize(&mut *self)?;
337 match value {
338 0 => visitor.visit_none(),
339 1 => visitor.visit_some(&mut *self),
340 v => Err(ErrorKind::InvalidTagEncoding(v as usize).into()),
341 }
342 }
343
deserialize_seq<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,344 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
345 where
346 V: serde::de::Visitor<'de>,
347 {
348 let len = O::IntEncoding::deserialize_len(self)?;
349
350 self.deserialize_tuple(len, visitor)
351 }
352
deserialize_map<V>(self, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,353 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
354 where
355 V: serde::de::Visitor<'de>,
356 {
357 struct Access<'a, R: Read + 'a, O: Options + 'a> {
358 deserializer: &'a mut Deserializer<R, O>,
359 len: usize,
360 }
361
362 impl<'de, 'a, 'b: 'a, R: BincodeRead<'de> + 'b, O: Options> serde::de::MapAccess<'de>
363 for Access<'a, R, O>
364 {
365 type Error = Error;
366
367 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
368 where
369 K: serde::de::DeserializeSeed<'de>,
370 {
371 if self.len > 0 {
372 self.len -= 1;
373 let key =
374 serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)?;
375 Ok(Some(key))
376 } else {
377 Ok(None)
378 }
379 }
380
381 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
382 where
383 V: serde::de::DeserializeSeed<'de>,
384 {
385 let value = serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)?;
386 Ok(value)
387 }
388
389 fn size_hint(&self) -> Option<usize> {
390 Some(self.len)
391 }
392 }
393
394 let len = O::IntEncoding::deserialize_len(self)?;
395
396 visitor.visit_map(Access {
397 deserializer: self,
398 len,
399 })
400 }
401
deserialize_struct<V>( self, _name: &str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: serde::de::Visitor<'de>,402 fn deserialize_struct<V>(
403 self,
404 _name: &str,
405 fields: &'static [&'static str],
406 visitor: V,
407 ) -> Result<V::Value>
408 where
409 V: serde::de::Visitor<'de>,
410 {
411 self.deserialize_tuple(fields.len(), visitor)
412 }
413
deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,414 fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value>
415 where
416 V: serde::de::Visitor<'de>,
417 {
418 let message = "Bincode does not support Deserializer::deserialize_identifier";
419 Err(Error::custom(message))
420 }
421
deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,422 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
423 where
424 V: serde::de::Visitor<'de>,
425 {
426 visitor.visit_newtype_struct(self)
427 }
428
deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,429 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
430 where
431 V: serde::de::Visitor<'de>,
432 {
433 visitor.visit_unit()
434 }
435
deserialize_tuple_struct<V>( self, _name: &'static str, len: usize, visitor: V, ) -> Result<V::Value> where V: serde::de::Visitor<'de>,436 fn deserialize_tuple_struct<V>(
437 self,
438 _name: &'static str,
439 len: usize,
440 visitor: V,
441 ) -> Result<V::Value>
442 where
443 V: serde::de::Visitor<'de>,
444 {
445 self.deserialize_tuple(len, visitor)
446 }
447
deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,448 fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value>
449 where
450 V: serde::de::Visitor<'de>,
451 {
452 let message = "Bincode does not support Deserializer::deserialize_ignored_any";
453 Err(Error::custom(message))
454 }
455
is_human_readable(&self) -> bool456 fn is_human_readable(&self) -> bool {
457 false
458 }
459 }
460
461 impl<'de, 'a, R, O> serde::de::VariantAccess<'de> for &'a mut Deserializer<R, O>
462 where
463 R: BincodeRead<'de>,
464 O: Options,
465 {
466 type Error = Error;
467
unit_variant(self) -> Result<()>468 fn unit_variant(self) -> Result<()> {
469 Ok(())
470 }
471
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> where T: serde::de::DeserializeSeed<'de>,472 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
473 where
474 T: serde::de::DeserializeSeed<'de>,
475 {
476 serde::de::DeserializeSeed::deserialize(seed, self)
477 }
478
tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,479 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
480 where
481 V: serde::de::Visitor<'de>,
482 {
483 serde::de::Deserializer::deserialize_tuple(self, len, visitor)
484 }
485
struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value> where V: serde::de::Visitor<'de>,486 fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
487 where
488 V: serde::de::Visitor<'de>,
489 {
490 serde::de::Deserializer::deserialize_tuple(self, fields.len(), visitor)
491 }
492 }
493 static UTF8_CHAR_WIDTH: [u8; 256] = [
494 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
495 1, // 0x1F
496 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
497 1, // 0x3F
498 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
499 1, // 0x5F
500 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
501 1, // 0x7F
502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
503 0, // 0x9F
504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
505 0, // 0xBF
506 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
507 2, // 0xDF
508 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xEF
509 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xFF
510 ];
511
512 // This function is a copy of core::str::utf8_char_width
utf8_char_width(b: u8) -> usize513 fn utf8_char_width(b: u8) -> usize {
514 UTF8_CHAR_WIDTH[b as usize] as usize
515 }
516