11//! Generic MessagePack deserialization.
22
3+ use std:: convert:: TryInto ;
34use std:: error;
45use std:: fmt:: { self , Display , Formatter } ;
56use std:: io:: { self , Cursor , ErrorKind , Read } ;
7+ use std:: num:: TryFromIntError ;
68use std:: str:: { self , Utf8Error } ;
79
810use byteorder:: { self , ReadBytesExt } ;
@@ -157,6 +159,13 @@ impl<'a> From<DecodeStringError<'a>> for Error {
157159 }
158160}
159161
162+ impl From < TryFromIntError > for Error {
163+ #[ cold]
164+ fn from ( _: TryFromIntError ) -> Self {
165+ Error :: OutOfRange
166+ }
167+ }
168+
160169/// A Deserializer that reads bytes from a buffer.
161170///
162171/// # Note
@@ -327,8 +336,6 @@ impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
327336 }
328337
329338 fn read_128 ( & mut self ) -> Result < [ u8 ; 16 ] , Error > {
330- use std:: convert:: TryInto ;
331-
332339 let marker = self . take_or_read_marker ( ) ?;
333340
334341 if marker != Marker :: Bin8 {
@@ -508,35 +515,55 @@ impl<'de, 'a, R: ReadSlice<'de>, C: SerializerConfig> serde::Deserializer<'de> f
508515 Marker :: FixStr ( len) => Ok ( len. into ( ) ) ,
509516 Marker :: Str8 => read_u8 ( & mut self . rd ) . map ( u32:: from) ,
510517 Marker :: Str16 => read_u16 ( & mut self . rd ) . map ( u32:: from) ,
511- Marker :: Str32 | _ => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
518+ Marker :: Str32 => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
519+ _ => unreachable ! ( )
512520 } ?;
513521 self . read_str_data ( len, visitor)
514522 }
515523 Marker :: FixArray ( _) |
516524 Marker :: Array16 |
517525 Marker :: Array32 => {
518526 let len = match marker {
519- Marker :: FixArray ( len) => Ok ( len. into ( ) ) ,
520- Marker :: Array16 => read_u16 ( & mut self . rd ) . map ( u32:: from) ,
521- Marker :: Array32 | _ => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
522- } ?;
523- depth_count ! ( self . depth, visitor. visit_seq( SeqAccess :: new( self , len as usize ) ) )
527+ Marker :: FixArray ( len) => len. into ( ) ,
528+ Marker :: Array16 => read_u16 ( & mut self . rd ) ?. into ( ) ,
529+ Marker :: Array32 => read_u32 ( & mut self . rd ) ?,
530+ _ => unreachable ! ( ) ,
531+ } ;
532+
533+ depth_count ! ( self . depth, {
534+ let mut seq = SeqAccess :: new( self , len) ;
535+ let res = visitor. visit_seq( & mut seq) ?;
536+ match seq. left {
537+ 0 => Ok ( res) ,
538+ excess => Err ( Error :: LengthMismatch ( len - excess) ) ,
539+ }
540+ } )
524541 }
525542 Marker :: FixMap ( _) |
526543 Marker :: Map16 |
527544 Marker :: Map32 => {
528545 let len = match marker {
529- Marker :: FixMap ( len) => Ok ( len. into ( ) ) ,
530- Marker :: Map16 => read_u16 ( & mut self . rd ) . map ( u32:: from) ,
531- Marker :: Map32 | _ => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
532- } ?;
533- depth_count ! ( self . depth, visitor. visit_map( MapAccess :: new( self , len as usize ) ) )
546+ Marker :: FixMap ( len) => len. into ( ) ,
547+ Marker :: Map16 => read_u16 ( & mut self . rd ) ?. into ( ) ,
548+ Marker :: Map32 => read_u32 ( & mut self . rd ) ?,
549+ _ => unreachable ! ( )
550+ } ;
551+
552+ depth_count ! ( self . depth, {
553+ let mut seq = MapAccess :: new( self , len) ;
554+ let res = visitor. visit_map( & mut seq) ?;
555+ match seq. left {
556+ 0 => Ok ( res) ,
557+ excess => Err ( Error :: LengthMismatch ( len - excess) ) ,
558+ }
559+ } )
534560 }
535- Marker :: Bin8 | Marker :: Bin16 | Marker :: Bin32 => {
561+ Marker :: Bin8 | Marker :: Bin16 | Marker :: Bin32 => {
536562 let len = match marker {
537563 Marker :: Bin8 => read_u8 ( & mut self . rd ) . map ( u32:: from) ,
538564 Marker :: Bin16 => read_u16 ( & mut self . rd ) . map ( u32:: from) ,
539- Marker :: Bin32 | _ => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
565+ Marker :: Bin32 => read_u32 ( & mut self . rd ) . map ( u32:: from) ,
566+ _ => unreachable ! ( )
540567 } ?;
541568 match read_bin_data ( & mut self . rd , len) ? {
542569 Reference :: Borrowed ( buf) => visitor. visit_borrowed_bytes ( buf) ,
@@ -706,12 +733,12 @@ impl<'de, 'a, R: ReadSlice<'de>, C: SerializerConfig> serde::Deserializer<'de> f
706733
707734struct SeqAccess < ' a , R , C > {
708735 de : & ' a mut Deserializer < R , C > ,
709- left : usize ,
736+ left : u32 ,
710737}
711738
712739impl < ' a , R : ' a , C > SeqAccess < ' a , R , C > {
713740 #[ inline]
714- fn new ( de : & ' a mut Deserializer < R , C > , len : usize ) -> Self {
741+ fn new ( de : & ' a mut Deserializer < R , C > , len : u32 ) -> Self {
715742 SeqAccess {
716743 de,
717744 left : len,
@@ -736,17 +763,17 @@ impl<'de, 'a, R: ReadSlice<'de> + 'a, C: SerializerConfig> de::SeqAccess<'de> fo
736763
737764 #[ inline( always) ]
738765 fn size_hint ( & self ) -> Option < usize > {
739- Some ( self . left )
766+ self . left . try_into ( ) . ok ( )
740767 }
741768}
742769
743770struct MapAccess < ' a , R , C > {
744771 de : & ' a mut Deserializer < R , C > ,
745- left : usize ,
772+ left : u32 ,
746773}
747774
748775impl < ' a , R : ' a , C > MapAccess < ' a , R , C > {
749- fn new ( de : & ' a mut Deserializer < R , C > , len : usize ) -> Self {
776+ fn new ( de : & ' a mut Deserializer < R , C > , len : u32 ) -> Self {
750777 MapAccess {
751778 de,
752779 left : len,
@@ -763,7 +790,7 @@ impl<'de, 'a, R: ReadSlice<'de> + 'a, C: SerializerConfig> de::MapAccess<'de> fo
763790 {
764791 if self . left > 0 {
765792 self . left -= 1 ;
766- Ok ( Some ( seed. deserialize ( & mut * self . de ) ? ) )
793+ seed. deserialize ( & mut * self . de ) . map ( Some )
767794 } else {
768795 Ok ( None )
769796 }
@@ -773,12 +800,12 @@ impl<'de, 'a, R: ReadSlice<'de> + 'a, C: SerializerConfig> de::MapAccess<'de> fo
773800 fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value , Self :: Error >
774801 where V : DeserializeSeed < ' de >
775802 {
776- Ok ( seed. deserialize ( & mut * self . de ) ? )
803+ seed. deserialize ( & mut * self . de )
777804 }
778805
779806 #[ inline( always) ]
780807 fn size_hint ( & self ) -> Option < usize > {
781- Some ( self . left )
808+ self . left . try_into ( ) . ok ( )
782809 }
783810}
784811
0 commit comments