11use core:: marker:: PhantomData ;
22use crate :: core:: { enc, dec } ;
33
4-
4+ # [ derive ( PartialEq , Eq , Debug , Clone ) ]
55pub struct RawValue < ' de > ( & ' de [ u8 ] ) ;
66
77struct RawValueReader < ' r , ' de , R >
@@ -91,13 +91,63 @@ impl enc::Encode for RawValue<'_> {
9191 }
9292}
9393
94+ impl < ' de > RawValue < ' de > {
95+ pub fn as_bytes ( & self ) -> & ' de [ u8 ] {
96+ self . 0
97+ }
98+ }
99+
100+ #[ cfg( feature = "use_alloc" ) ]
101+ pub mod boxed {
102+ use crate :: core:: Value ;
103+ use crate :: core:: utils:: BufWriter ;
104+ use crate :: alloc:: boxed:: Box ;
105+ use super :: * ;
106+
107+ #[ derive( PartialEq , Eq , Debug , Clone ) ]
108+ pub struct BoxedRawValue ( Box < [ u8 ] > ) ;
109+
110+ impl < ' de > dec:: Decode < ' de > for BoxedRawValue {
111+ #[ inline]
112+ fn decode < R : dec:: Read < ' de > > ( reader : & mut R ) -> Result < Self , dec:: Error < R :: Error > > {
113+ let value = RawValue :: decode ( reader) ?;
114+ Ok ( BoxedRawValue ( Box :: from ( value. 0 ) ) )
115+ }
116+ }
117+
118+ impl enc:: Encode for BoxedRawValue {
119+ #[ inline]
120+ fn encode < W : enc:: Write > ( & self , writer : & mut W ) -> Result < ( ) , enc:: Error < W :: Error > > {
121+ writer. push ( & self . 0 ) . map_err ( enc:: Error :: Write )
122+ }
123+ }
124+
125+ impl BoxedRawValue {
126+ pub fn as_bytes ( & self ) -> & [ u8 ] {
127+ & self . 0
128+ }
129+
130+ pub fn from_value ( value : & Value )
131+ -> Result < BoxedRawValue , enc:: Error < crate :: alloc:: collections:: TryReserveError > >
132+ {
133+ use crate :: alloc:: vec:: Vec ;
134+ use crate :: core:: enc:: Encode ;
135+
136+ let mut writer = BufWriter :: new ( Vec :: new ( ) ) ;
137+ value. encode ( & mut writer) ?;
138+ Ok ( BoxedRawValue ( writer. into_inner ( ) . into_boxed_slice ( ) ) )
139+ }
140+ }
141+ }
142+
94143#[ test]
95144#[ cfg( feature = "use_std" ) ]
96145fn test_raw_value ( ) {
97146 use crate :: core:: enc:: Encode ;
98147 use crate :: core:: dec:: Decode ;
99148 use crate :: core:: utils:: { BufWriter , SliceReader } ;
100149 use crate :: core:: types;
150+ use boxed:: BoxedRawValue ;
101151
102152 let buf = {
103153 let mut buf = BufWriter :: new ( Vec :: new ( ) ) ;
@@ -111,37 +161,91 @@ fn test_raw_value() {
111161 buf
112162 } ;
113163
114- let mut reader = SliceReader :: new ( buf. buffer ( ) ) ;
115- let map = <types:: Map < Vec < ( & str , RawValue < ' _ > ) > > >:: decode ( & mut reader) . unwrap ( ) ;
164+ // raw value
165+ {
166+ let mut reader = SliceReader :: new ( buf. buffer ( ) ) ;
167+ let map = <types:: Map < Vec < ( & str , RawValue < ' _ > ) > > >:: decode ( & mut reader) . unwrap ( ) ;
116168
117- assert_eq ! ( map. 0 . len( ) , 1 ) ;
118- assert_eq ! ( map. 0 [ 0 ] . 0 , "bar" ) ;
169+ assert_eq ! ( map. 0 . len( ) , 1 ) ;
170+ assert_eq ! ( map. 0 [ 0 ] . 0 , "bar" ) ;
119171
120- let bar_raw_value = & map. 0 [ 0 ] . 1 ;
172+ let bar_raw_value = & map. 0 [ 0 ] . 1 ;
173+ assert ! ( !bar_raw_value. as_bytes( ) . is_empty( ) ) ;
121174
122- let buf2 = {
123- let mut buf = BufWriter :: new ( Vec :: new ( ) ) ;
175+ let buf2 = {
176+ let mut buf = BufWriter :: new ( Vec :: new ( ) ) ;
124177
125- types:: Map ( & [
126- ( "bar" , bar_raw_value)
127- ] [ ..] ) . encode ( & mut buf) . unwrap ( ) ;
178+ types:: Map ( & [
179+ ( "bar" , bar_raw_value)
180+ ] [ ..] ) . encode ( & mut buf) . unwrap ( ) ;
128181
129- buf
130- } ;
182+ buf
183+ } ;
184+
185+ assert_eq ! ( buf. buffer( ) , buf2. buffer( ) ) ;
186+
187+ type Bar < ' a > = types:: Map < Vec < ( & ' a str , u32 ) > > ;
188+
189+ let mut reader = SliceReader :: new ( buf2. buffer ( ) ) ;
190+ let map2 = <types:: Map < Vec < ( & str , Bar ) > > >:: decode ( & mut reader) . unwrap ( ) ;
191+
192+ assert_eq ! ( map2. 0 . len( ) , 1 ) ;
193+ assert_eq ! ( map2. 0 [ 0 ] . 0 , "bar" ) ;
194+
195+ let bar = & map2. 0 [ 0 ] . 1 ;
131196
132- assert_eq ! ( buf. buffer( ) , buf2. buffer( ) ) ;
197+ assert_eq ! ( bar. 0 . len( ) , 1 ) ;
198+ assert_eq ! ( bar. 0 [ 0 ] . 0 , "value" ) ;
199+ assert_eq ! ( bar. 0 [ 0 ] . 1 , 0x99 ) ;
200+ }
201+
202+ // boxed raw value
203+ {
204+ let mut reader = SliceReader :: new ( buf. buffer ( ) ) ;
205+ let map = <types:: Map < Vec < ( & str , BoxedRawValue ) > > >:: decode ( & mut reader) . unwrap ( ) ;
206+
207+ assert_eq ! ( map. 0 . len( ) , 1 ) ;
208+ assert_eq ! ( map. 0 [ 0 ] . 0 , "bar" ) ;
209+
210+ let bar_raw_value = & map. 0 [ 0 ] . 1 ;
211+ assert ! ( !bar_raw_value. as_bytes( ) . is_empty( ) ) ;
212+
213+ // check from value
214+ {
215+ use crate :: core:: Value ;
216+
217+ let mut reader = SliceReader :: new ( buf. buffer ( ) ) ;
218+ let map = <types:: Map < Vec < ( & str , Value ) > > >:: decode ( & mut reader) . unwrap ( ) ;
219+
220+ let bar_value = & map. 0 [ 0 ] . 1 ;
221+ let bar_raw_value2 = BoxedRawValue :: from_value ( & bar_value) . unwrap ( ) ;
222+ assert_eq ! ( bar_raw_value, & bar_raw_value2) ;
223+ }
133224
134- type Bar < ' a > = types:: Map < Vec < ( & ' a str , u32 ) > > ;
225+ let buf2 = {
226+ let mut buf = BufWriter :: new ( Vec :: new ( ) ) ;
135227
136- let mut reader = SliceReader :: new ( buf2. buffer ( ) ) ;
137- let map2 = <types:: Map < Vec < ( & str , Bar ) > > >:: decode ( & mut reader) . unwrap ( ) ;
228+ types:: Map ( & [
229+ ( "bar" , bar_raw_value)
230+ ] [ ..] ) . encode ( & mut buf) . unwrap ( ) ;
231+
232+ buf
233+ } ;
138234
139- assert_eq ! ( map2. 0 . len( ) , 1 ) ;
140- assert_eq ! ( map2. 0 [ 0 ] . 0 , "bar" ) ;
235+ assert_eq ! ( buf. buffer( ) , buf2. buffer( ) ) ;
141236
142- let bar = & map2 . 0 [ 0 ] . 1 ;
237+ type Bar < ' a > = types :: Map < Vec < ( & ' a str , u32 ) > > ;
143238
144- assert_eq ! ( bar. 0 . len( ) , 1 ) ;
145- assert_eq ! ( bar. 0 [ 0 ] . 0 , "value" ) ;
146- assert_eq ! ( bar. 0 [ 0 ] . 1 , 0x99 ) ;
239+ let mut reader = SliceReader :: new ( buf2. buffer ( ) ) ;
240+ let map2 = <types:: Map < Vec < ( & str , Bar ) > > >:: decode ( & mut reader) . unwrap ( ) ;
241+
242+ assert_eq ! ( map2. 0 . len( ) , 1 ) ;
243+ assert_eq ! ( map2. 0 [ 0 ] . 0 , "bar" ) ;
244+
245+ let bar = & map2. 0 [ 0 ] . 1 ;
246+
247+ assert_eq ! ( bar. 0 . len( ) , 1 ) ;
248+ assert_eq ! ( bar. 0 [ 0 ] . 0 , "value" ) ;
249+ assert_eq ! ( bar. 0 [ 0 ] . 1 , 0x99 ) ;
250+ }
147251}
0 commit comments