@@ -9,6 +9,9 @@ use alloc::vec::Vec;
99#[ cfg( feature = "std" ) ]
1010use std:: { io, vec:: Vec } ;
1111
12+ // #[cfg(feature = "raw_value")]
13+ use { crate :: raw:: OwnedRawDeserializer , serde:: de:: Visitor } ;
14+
1215/// A reference to borrowed data.
1316///
1417/// The variant determines if the slice comes from a long lived source (e.g. an
@@ -125,6 +128,21 @@ pub trait Read<'a> {
125128 /// - malformatted input
126129 /// - end of file
127130 fn parse_raw_dict < ' b > ( & ' b mut self , buf : & ' b mut Vec < u8 > ) -> Result < Ref < ' a , ' b , [ u8 ] > > ;
131+
132+ /// Switch raw buffering mode on.
133+ ///
134+ /// This is used when deserializing `RawValue`.
135+ // #[cfg(feature = "raw_value")]
136+ #[ doc( hidden) ]
137+ fn begin_raw_buffering ( & mut self ) ;
138+
139+ /// Switch raw buffering mode off and provides the raw buffered data to the
140+ /// given visitor.
141+ // #[cfg(feature = "raw_value")]
142+ #[ doc( hidden) ]
143+ fn end_raw_buffering < V > ( & mut self , visitor : V ) -> Result < V :: Value >
144+ where
145+ V : Visitor < ' a > ;
128146}
129147
130148/// A wrapper to implement this crate's [Read] trait for [`std::io::Read`] trait implementations.
@@ -138,6 +156,9 @@ where
138156 iter : io:: Bytes < R > ,
139157 peeked_byte : Option < u8 > ,
140158 byte_offset : usize ,
159+
160+ // #[cfg(feature = "raw_value")]
161+ raw_buffer : Option < Vec < u8 > > ,
141162}
142163
143164#[ cfg( feature = "std" ) ]
@@ -157,6 +178,9 @@ where
157178 iter : reader. bytes ( ) ,
158179 peeked_byte : None ,
159180 byte_offset : 0 ,
181+
182+ // #[cfg(feature = "raw_value")]
183+ raw_buffer : None ,
160184 }
161185 }
162186}
@@ -170,11 +194,23 @@ where
170194 fn next ( & mut self ) -> Option < Result < u8 > > {
171195 match self . peeked_byte . take ( ) {
172196 Some ( b) => {
197+ // #[cfg(feature = "raw_value")]
198+ {
199+ if let Some ( buf) = & mut self . raw_buffer {
200+ buf. push ( b) ;
201+ }
202+ }
173203 self . byte_offset += 1 ;
174204 Some ( Ok ( b) )
175205 }
176206 None => match self . iter . next ( ) {
177207 Some ( Ok ( b) ) => {
208+ // #[cfg(feature = "raw_value")]
209+ {
210+ if let Some ( buf) = & mut self . raw_buffer {
211+ buf. push ( b) ;
212+ }
213+ }
178214 self . byte_offset += 1 ;
179215 Some ( Ok ( b) )
180216 }
@@ -402,6 +438,22 @@ where
402438 }
403439 }
404440 }
441+
442+ // #[cfg(feature = "raw_value")]
443+ fn begin_raw_buffering ( & mut self ) {
444+ self . raw_buffer = Some ( Vec :: new ( ) ) ;
445+ }
446+
447+ // #[cfg(feature = "raw_value")]
448+ fn end_raw_buffering < V > ( & mut self , visitor : V ) -> Result < V :: Value >
449+ where
450+ V : Visitor < ' a > ,
451+ {
452+ let raw = self . raw_buffer . take ( ) . unwrap ( ) ;
453+ visitor. visit_map ( OwnedRawDeserializer {
454+ raw_value : Some ( raw) ,
455+ } )
456+ }
405457}
406458
407459/// A wrapper to implement this crate's [Read] trait for byte slices.
@@ -410,6 +462,9 @@ where
410462pub struct SliceRead < ' a > {
411463 slice : & ' a [ u8 ] ,
412464 byte_offset : usize ,
465+
466+ // #[cfg(feature = "raw_value")]
467+ raw_buffer : Option < Vec < u8 > > ,
413468}
414469
415470impl < ' a > SliceRead < ' a > {
@@ -419,6 +474,9 @@ impl<'a> SliceRead<'a> {
419474 SliceRead {
420475 slice,
421476 byte_offset : 0 ,
477+
478+ // #[cfg(feature = "raw_value")]
479+ raw_buffer : None ,
422480 }
423481 }
424482}
@@ -428,6 +486,12 @@ impl<'a> Read<'a> for SliceRead<'a> {
428486 fn next ( & mut self ) -> Option < Result < u8 > > {
429487 if self . byte_offset < self . slice . len ( ) {
430488 let b = self . slice [ self . byte_offset ] ;
489+ // #[cfg(feature = "raw_value")]
490+ {
491+ if let Some ( buf) = & mut self . raw_buffer {
492+ buf. push ( b) ;
493+ }
494+ }
431495 self . byte_offset += 1 ;
432496 Some ( Ok ( b) )
433497 } else {
@@ -484,6 +548,13 @@ impl<'a> Read<'a> for SliceRead<'a> {
484548 ) ) ;
485549 }
486550
551+ // #[cfg(feature = "raw_value")]
552+ {
553+ if let Some ( buf) = & mut self . raw_buffer {
554+ buf. extend_from_slice ( & self . slice [ start_idx..self . byte_offset ] ) ;
555+ }
556+ }
557+
487558 Ok ( Ref :: Source ( & self . slice [ start_idx..self . byte_offset ] ) )
488559 }
489560
@@ -648,4 +719,20 @@ impl<'a> Read<'a> for SliceRead<'a> {
648719 }
649720 }
650721 }
722+
723+ // #[cfg(feature = "raw_value")]
724+ fn begin_raw_buffering ( & mut self ) {
725+ self . raw_buffer = Some ( Vec :: new ( ) ) ;
726+ }
727+
728+ // #[cfg(feature = "raw_value")]
729+ fn end_raw_buffering < V > ( & mut self , visitor : V ) -> Result < V :: Value >
730+ where
731+ V : Visitor < ' a > ,
732+ {
733+ let raw = self . raw_buffer . take ( ) . unwrap ( ) ;
734+ visitor. visit_map ( OwnedRawDeserializer {
735+ raw_value : Some ( raw) ,
736+ } )
737+ }
651738}
0 commit comments