@@ -263,6 +263,63 @@ impl<'a> Deserializer<read::SliceRead<'a>> {
263263 }
264264}
265265
266+ impl < ' de , R : Read < ' de > > Deserializer < R > {
267+ #[ cfg( feature = "raw_value" ) ]
268+ fn deserialize_raw_value < V > ( & mut self , visitor : V ) -> Result < V :: Value >
269+ where
270+ V : de:: Visitor < ' de > ,
271+ {
272+ self . read . begin_raw_buffering ( ) ;
273+ self . ignore_value ( ) ?;
274+ self . read . end_raw_buffering ( visitor)
275+ }
276+
277+ #[ cfg( feature = "raw_value" ) ]
278+ fn ignore_value ( & mut self ) -> Result < ( ) > {
279+ match self . parse_peek ( ) ? {
280+ b'0' ..=b'9' => {
281+ self . buf . clear ( ) ;
282+ self . read . parse_byte_str ( & mut self . buf ) ?;
283+ Ok ( ( ) )
284+ }
285+ b'i' => {
286+ self . parse_next ( ) ?;
287+ self . parse_integer ( ) ?;
288+ Ok ( ( ) )
289+ }
290+ b'l' => {
291+ self . parse_next ( ) ?;
292+ loop {
293+ if self . parse_peek ( ) ? == b'e' {
294+ self . parse_next ( ) ?;
295+ break ;
296+ }
297+ self . ignore_value ( ) ?;
298+ }
299+ Ok ( ( ) )
300+ }
301+ b'd' => {
302+ self . parse_next ( ) ?;
303+ loop {
304+ if self . parse_peek ( ) ? == b'e' {
305+ self . parse_next ( ) ?;
306+ break ;
307+ }
308+
309+ self . buf . clear ( ) ;
310+ self . read . parse_byte_str ( & mut self . buf ) ?;
311+ self . ignore_value ( ) ?;
312+ }
313+ Ok ( ( ) )
314+ }
315+ _ => Err ( Error :: new (
316+ ErrorKind :: ExpectedSomeValue ,
317+ self . read . byte_offset ( ) ,
318+ ) ) ,
319+ }
320+ }
321+ }
322+
266323impl < ' de , R : Read < ' de > > de:: Deserializer < ' de > for & mut Deserializer < R > {
267324 type Error = Error ;
268325
@@ -393,10 +450,16 @@ impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
393450 }
394451
395452 #[ inline]
396- fn deserialize_newtype_struct < V > ( self , _name : & ' static str , visitor : V ) -> Result < V :: Value >
453+ fn deserialize_newtype_struct < V > ( self , name : & ' static str , visitor : V ) -> Result < V :: Value >
397454 where
398455 V : de:: Visitor < ' de > ,
399456 {
457+ #[ cfg( feature = "raw_value" ) ]
458+ if name == crate :: raw:: TOKEN {
459+ return self . deserialize_raw_value ( visitor) ;
460+ }
461+
462+ let _ = name;
400463 visitor. visit_newtype_struct ( self )
401464 }
402465
@@ -481,10 +544,16 @@ where
481544 }
482545
483546 #[ inline]
484- fn deserialize_newtype_struct < V > ( self , _name : & ' static str , visitor : V ) -> Result < V :: Value >
547+ fn deserialize_newtype_struct < V > ( self , name : & ' static str , visitor : V ) -> Result < V :: Value >
485548 where
486549 V : de:: Visitor < ' de > ,
487550 {
551+ #[ cfg( feature = "raw_value" ) ]
552+ if name == crate :: raw:: TOKEN {
553+ return self . de . deserialize_raw_value ( visitor) ;
554+ }
555+
556+ let _ = name;
488557 visitor. visit_newtype_struct ( self )
489558 }
490559
@@ -770,4 +839,32 @@ mod tests {
770839 assert_eq ! ( s, expected) ;
771840 Ok ( ( ) )
772841 }
842+
843+ #[ cfg( feature = "raw_value" ) ]
844+ #[ test]
845+ fn test_decode_raw_value_top_level ( ) -> Result < ( ) > {
846+ use crate :: RawValue ;
847+
848+ let input = b"li1ei2ei3ee" ;
849+ let raw: RawValue = from_slice ( input) ?;
850+ assert_eq ! ( raw. get( ) , input) ;
851+ Ok ( ( ) )
852+ }
853+
854+ #[ cfg( feature = "raw_value" ) ]
855+ #[ test]
856+ fn test_decode_raw_value_struct_field ( ) -> Result < ( ) > {
857+ use crate :: RawValue ;
858+ use serde_derive:: Deserialize ;
859+
860+ #[ derive( Deserialize ) ]
861+ struct Envelope {
862+ payload : RawValue ,
863+ }
864+
865+ let input = b"d7:payloadli1ei2eee" ;
866+ let decoded: Envelope = from_slice ( input) ?;
867+ assert_eq ! ( decoded. payload. get( ) , b"li1ei2ee" ) ;
868+ Ok ( ( ) )
869+ }
773870}
0 commit comments