1use std::io::BufRead;
4use std::marker::PhantomData;
5use std::str;
6use std::string::String;
7use byteorder::{ByteOrder, ReadBytesExt};
8use serde::de::{self, Deserialize, DeserializeSeed, SeqAccess, Visitor};
9
10use error::{Error, Result};
11
12pub struct Deserializer<BO, R> {
88 reader: R,
90 _byteorder: PhantomData<BO>,
92}
93
94impl<BO, R> Deserializer<BO, R>
95 where R: BufRead,
96 BO: ByteOrder,
97{
98 pub fn new(reader: R) -> Self {
109 Deserializer { reader, _byteorder: PhantomData }
110 }
111 #[inline]
113 fn read_to_end(&mut self) -> Result<Vec<u8>> {
114 let mut buf = Vec::new();
115 self.reader.read_to_end(&mut buf)?;
116 Ok(buf)
117 }
118 fn read_char(&mut self) -> Result<char> {
122 static UTF8_CHAR_WIDTH: [u8; 256] = [
125 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
126 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,1,
128 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,1,
130 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,1,
132 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
134 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,0,
136 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
138 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, ];
142
143 let mut buf = [0u8; 4];
144 self.reader.read_exact(&mut buf[..1])?;let width = UTF8_CHAR_WIDTH[buf[0] as usize] as usize;
146 if width == 1 {
147 return Ok(buf[0] as char);
148 }
149 self.reader.read_exact(&mut buf[1..width])?;
150 let s = str::from_utf8(&buf[..width])?;
151 s.chars().next().ok_or_else(|| Error::Unknown("UTF-8 bytes decoded as empty string".into()))
152 }
153}
154
155macro_rules! impl_numbers {
157 ($dser_method:ident, $visitor_method:ident, $reader_method:ident) => {
158 fn $dser_method<V>(self, visitor: V) -> Result<V::Value>
159 where V: de::Visitor<'de>,
160 {
161 visitor.$visitor_method(self.reader.$reader_method::<BO>()?)
162 }
163 }
164}
165macro_rules! unsupported {
169 ($dser_method:ident) => {
170 fn $dser_method<V>(self, _visitor: V) -> Result<V::Value>
174 where V: Visitor<'de>,
175 {
176 Err(Error::Unsupported(concat!('`', stringify!($dser_method), "` is not supported")))
177 }
178 }
179}
180
181impl<'de, 'a, BO, R> de::Deserializer<'de> for &'a mut Deserializer<BO, R>
182 where R: BufRead,
183 BO: ByteOrder,
184{
185 type Error = Error;
186
187 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
189 where V: Visitor<'de>,
190 {
191 visitor.visit_i8(self.reader.read_i8()?)
192 }
193 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
195 where V: Visitor<'de>,
196 {
197 visitor.visit_u8(self.reader.read_u8()?)
198 }
199 impl_numbers!(deserialize_i16, visit_i16, read_i16);
200 impl_numbers!(deserialize_u16, visit_u16, read_u16);
201 impl_numbers!(deserialize_i32, visit_i32, read_i32);
202 impl_numbers!(deserialize_u32, visit_u32, read_u32);
203 impl_numbers!(deserialize_i64, visit_i64, read_i64);
204 impl_numbers!(deserialize_u64, visit_u64, read_u64);
205 impl_numbers!(deserialize_i128, visit_i128, read_i128);
206 impl_numbers!(deserialize_u128, visit_u128, read_u128);
207 impl_numbers!(deserialize_f32, visit_f32, read_f32);
208 impl_numbers!(deserialize_f64, visit_f64, read_f64);
209
210 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
211 where V: Visitor<'de>,
212 {
213 visitor.visit_char(self.read_char()?)
214 }
215 #[inline]
216 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
217 where V: Visitor<'de>,
218 {
219 self.deserialize_string(visitor)
220 }
221 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
231 where V: Visitor<'de>,
232 {
233 let buf = self.read_to_end()?;
234 visitor.visit_string(String::from_utf8(buf)?)
235 }
236 #[inline]
237 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
238 where V: Visitor<'de>,
239 {
240 self.deserialize_byte_buf(visitor)
241 }
242 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
243 where V: Visitor<'de>,
244 {
245 visitor.visit_byte_buf(self.read_to_end()?)
246 }
247 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
251 where V: Visitor<'de>,
252 {
253 visitor.visit_unit()
254 }
255 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
259 where V: Visitor<'de>,
260 {
261 visitor.visit_unit()
262 }
263 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
267 where V: Visitor<'de>,
268 {
269 visitor.visit_newtype_struct(self)
270 }
271 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
278 where V: Visitor<'de>,
279 {
280 visitor.visit_seq(self)
281 }
282 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value>
287 where V: Visitor<'de>,
288 {
289 visitor.visit_seq(Tuple { de: self, count: len })
290 }
291 #[inline]
296 fn deserialize_tuple_struct<V>(self, _name: &'static str, len: usize, visitor: V) -> Result<V::Value>
297 where V: Visitor<'de>,
298 {
299 self.deserialize_tuple(len, visitor)
300 }
301 #[inline]
306 fn deserialize_struct<V>(self, _name: &'static str, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
307 where V: Visitor<'de>,
308 {
309 self.deserialize_tuple(fields.len(), visitor)
310 }
311
312 unsupported!(deserialize_any);
313 unsupported!(deserialize_map);
314 unsupported!(deserialize_bool);
315 unsupported!(deserialize_option);
316 unsupported!(deserialize_identifier);
317 unsupported!(deserialize_ignored_any);
318 fn deserialize_enum<V>(self, _name: &'static str, _variants: &'static [&'static str], _visitor: V) -> Result<V::Value>
319 where V: Visitor<'de>,
320 {
321 Err(Error::Unsupported("`deserialize_enum` is not supported"))
322 }
323}
324
325struct Tuple<'a, BO, R> {
328 de: &'a mut Deserializer<BO, R>,
330 count: usize,
332}
333impl<'a, 'de, BO, R> SeqAccess<'de> for Tuple<'a, BO, R>
334 where R: BufRead,
335 BO: ByteOrder,
336{
337 type Error = Error;
338
339 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
340 where T: DeserializeSeed<'de>,
341 {
342 if self.count > 0 {
344 self.count -= 1;
345 return seed.deserialize(&mut *self.de).map(Some);
346 }
347 return Ok(None);
348 }
349
350 fn size_hint(&self) -> Option<usize> { Some(self.count) }
351}
352
353impl<'a, 'de, BO, R> SeqAccess<'de> for &'a mut Deserializer<BO, R>
354 where R: BufRead,
355 BO: ByteOrder,
356{
357 type Error = Error;
358
359 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
360 where T: DeserializeSeed<'de>,
361 {
362 if self.reader.fill_buf()?.is_empty() {
364 return Ok(None);
365 }
366 seed.deserialize(&mut **self).map(Some)
367 }
368}
369
370pub fn from_bytes<'a, BO, T>(storage: &'a [u8]) -> Result<T>
391 where T: Deserialize<'a>,
392 BO: ByteOrder,
393{
394 let mut deserializer: Deserializer<BO, _> = Deserializer::new(storage);
395 T::deserialize(&mut deserializer)
396}
397
398#[cfg(test)]
401mod integers {
402 use super::from_bytes;
403 use byteorder::{BE, LE};
404
405 #[test]
406 fn test_u8() {
407 let test: u8 = 0x12;
408 assert_eq!(from_bytes::<BE, u8>(&[0x12]).unwrap(), test);
409 assert_eq!(from_bytes::<LE, u8>(&[0x12]).unwrap(), test);
410 }
411 #[test]
412 fn test_i8() {
413 let test: i8 = 0x12;
414 assert_eq!(from_bytes::<BE, i8>(&[0x12]).unwrap(), test);
415 assert_eq!(from_bytes::<LE, i8>(&[0x12]).unwrap(), test);
416 }
417
418 #[test]
419 fn test_u16() {
420 let test: u16 = 0x1234;
421 assert_eq!(from_bytes::<BE, u16>(&[0x12, 0x34]).unwrap(), test);
422 assert_eq!(from_bytes::<LE, u16>(&[0x34, 0x12]).unwrap(), test);
423 }
424 #[test]
425 fn test_i16() {
426 let test: i16 = 0x1234;
427 assert_eq!(from_bytes::<BE, i16>(&[0x12, 0x34]).unwrap(), test);
428 assert_eq!(from_bytes::<LE, i16>(&[0x34, 0x12]).unwrap(), test);
429 }
430
431 #[test]
432 fn test_u32() {
433 let test: u32 = 0x12345678;
434 assert_eq!(from_bytes::<BE, u32>(&[0x12, 0x34, 0x56, 0x78]).unwrap(), test);
435 assert_eq!(from_bytes::<LE, u32>(&[0x78, 0x56, 0x34, 0x12]).unwrap(), test);
436 }
437 #[test]
438 fn test_i32() {
439 let test: i32 = 0x12345678;
440 assert_eq!(from_bytes::<BE, i32>(&[0x12, 0x34, 0x56, 0x78]).unwrap(), test);
441 assert_eq!(from_bytes::<LE, i32>(&[0x78, 0x56, 0x34, 0x12]).unwrap(), test);
442 }
443
444 #[test]
445 fn test_u64() {
446 let test: u64 = 0x12345678_90ABCDEF;
447 assert_eq!(from_bytes::<BE, u64>(&[0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]).unwrap(), test);
448 assert_eq!(from_bytes::<LE, u64>(&[0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]).unwrap(), test);
449 }
450 #[test]
451 fn test_i64() {
452 let test: i64 = 0x12345678_90ABCDEF;
453 assert_eq!(from_bytes::<BE, i64>(&[0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]).unwrap(), test);
454 assert_eq!(from_bytes::<LE, i64>(&[0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]).unwrap(), test);
455 }
456
457 #[test]
458 fn test_u128() {
459 let test: u128 = 0x12345678_90ABCDEF_12345678_90ABCDEF;
460 assert_eq!(from_bytes::<BE, u128>(&[0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]).unwrap(), test);
461 assert_eq!(from_bytes::<LE, u128>(&[0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12, 0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]).unwrap(), test);
462 }
463 #[test]
464 fn test_i128() {
465 let test: i128 = 0x12345678_90ABCDEF_12345678_90ABCDEF;
466 assert_eq!(from_bytes::<BE, i128>(&[0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]).unwrap(), test);
467 assert_eq!(from_bytes::<LE, i128>(&[0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12, 0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]).unwrap(), test);
468 }
469}
470#[cfg(test)]
471mod floats {
472 use super::from_bytes;
473 use byteorder::{ByteOrder, BE, LE};
474
475 macro_rules! float_test {
476 ($name:ident, $BO:ident :: $write:ident, $type:ty) => (
477 quickcheck! {
478 fn $name(test: $type) -> bool {
479 let mut buf = [0; std::mem::size_of::<$type>()];
480 $BO::$write(&mut buf, test);
481 from_bytes::<$BO, $type>(&buf).unwrap() == test
482 }
483 }
484 );
485 }
486
487 float_test!(test_f32_be, BE::write_f32, f32);
488 float_test!(test_f32_le, LE::write_f32, f32);
489
490 float_test!(test_f64_be, BE::write_f64, f64);
491 float_test!(test_f64_le, LE::write_f64, f64);
492}
493#[cfg(test)]
494mod complex {
495 use super::from_bytes;
496 use byteorder::{BE, LE};
497
498 quickcheck! {
499 #[should_panic]
500 fn test_bool(byte: u8) -> bool {
501 from_bytes::<BE, bool>(&[byte]).unwrap()
502 }
503 }
504 #[test]
506 fn test_unit() {
507 #[derive(Debug, Deserialize, PartialEq)]
508 struct Test;
509
510 let test = Test;
511 assert_eq!(from_bytes::<BE, Test>(&[]).unwrap(), test);
512 assert_eq!(from_bytes::<LE, Test>(&[]).unwrap(), test);
513 }
514
515 #[test]
517 fn test_newtype() {
518 #[derive(Debug, Deserialize, PartialEq)]
519 struct Test(u32);
520
521 let test = Test(0x12345678);
522 assert_eq!(from_bytes::<BE, Test>(&[0x12, 0x34, 0x56, 0x78]).unwrap(), test);
523 assert_eq!(from_bytes::<LE, Test>(&[0x78, 0x56, 0x34, 0x12]).unwrap(), test);
524 }
525
526 #[test]
529 fn test_tuple() {
530 #[derive(Debug, Deserialize, PartialEq)]
531 struct Test(u32, u16);
532
533 let test = Test(0x12345678, 0xABCD);
534 assert_eq!(from_bytes::<BE, Test>(&[0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD]).unwrap(), test);
535 assert_eq!(from_bytes::<LE, Test>(&[0x78, 0x56, 0x34, 0x12, 0xCD, 0xAB]).unwrap(), test);
536 }
537
538 #[test]
541 fn test_struct() {
542 #[derive(Debug, Deserialize, PartialEq)]
543 struct Test {
544 int1: u32,
545 int2: u16,
546 }
547
548 let test = Test { int1: 0x12345678, int2: 0xABCD };
549 assert_eq!(from_bytes::<BE, Test>(&[0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD]).unwrap(), test);
550 assert_eq!(from_bytes::<LE, Test>(&[0x78, 0x56, 0x34, 0x12, 0xCD, 0xAB]).unwrap(), test);
551 }
552
553 #[test]
557 #[should_panic]
558 fn test_option_be() {
559 from_bytes::<BE, Option<u16>>(&[0x12, 0x34]).unwrap();
560 }
561 #[test]
562 #[should_panic]
563 fn test_option_le() {
564 from_bytes::<LE, Option<u16>>(&[0x12, 0x34]).unwrap();
565 }
566
567 #[test]
571 fn test_seq() {
572 let test = [0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD];
573 assert_eq!(from_bytes::<BE, Vec<u16>>(&test).unwrap(), vec![0x1234, 0x5678, 0xABCD]);
574 assert_eq!(from_bytes::<LE, Vec<u16>>(&test).unwrap(), vec![0x3412, 0x7856, 0xCDAB]);
575 }
576
577 #[test]
579 #[should_panic]
580 fn test_str_be() {
581 from_bytes::<BE, &str>("test".as_bytes()).unwrap();
582 }
583 #[test]
584 #[should_panic]
585 fn test_str_le() {
586 from_bytes::<LE, &str>("test".as_bytes()).unwrap();
587 }
588 #[test]
589 fn test_string() {
590 let test = "тест";
591 assert_eq!(from_bytes::<BE, String>(test.as_bytes()).unwrap(), test);
592 assert_eq!(from_bytes::<LE, String>(test.as_bytes()).unwrap(), test);
593 }
594
595 #[test]
596 fn test_array_empty() {
597 assert_eq!(from_bytes::<BE, [u16; 0]>(&[]).unwrap(), []);
598 assert_eq!(from_bytes::<LE, [u16; 0]>(&[]).unwrap(), []);
599 }
600 #[test]
601 fn test_array() {
602 let test = [0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD];
603 assert_eq!(from_bytes::<BE, [u16; 3]>(&test).unwrap(), [0x1234, 0x5678, 0xABCD]);
604 assert_eq!(from_bytes::<LE, [u16; 3]>(&test).unwrap(), [0x3412, 0x7856, 0xCDAB]);
605 }
606 #[test]
607 #[should_panic]
608 fn test_array_no_data_be() {
609 let test = [0x12, 0x34, 0x56, 0x78, 0xAB];
610 from_bytes::<BE, [u16; 3]>(&test).unwrap();
611 }
612 #[test]
613 #[should_panic]
614 fn test_array_no_data_le() {
615 let test = [0x12, 0x34, 0x56, 0x78, 0xAB];
616 from_bytes::<LE, [u16; 3]>(&test).unwrap();
617 }
618 #[test]
619 fn test_vec() {
620 let test = [0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD];
621 assert_eq!(from_bytes::<BE, Vec<u16>>(&test).unwrap(), vec![0x1234, 0x5678, 0xABCD]);
622 assert_eq!(from_bytes::<LE, Vec<u16>>(&test).unwrap(), vec![0x3412, 0x7856, 0xCDAB]);
623 }
624 #[test]
625 #[should_panic]
626 fn test_vec_no_data_be() {
627 let test = [0x12, 0x34, 0x56, 0x78, 0xAB];
628 from_bytes::<BE, Vec<u16>>(&test).unwrap();
629 }
630 #[test]
631 #[should_panic]
632 fn test_vec_no_data_le() {
633 let test = [0x12, 0x34, 0x56, 0x78, 0xAB];
634 from_bytes::<LE, Vec<u16>>(&test).unwrap();
635 }
636}