1- use super :: BodyCursor ;
1+ use super :: { BodyCursor , Cursor } ;
22use super :: { DtError , PropCursor , RefDtb , RegConfig } ;
33
44use core:: marker:: PhantomData ;
55use serde:: { de, Deserialize } ;
66
77#[ derive( Clone , Copy , Debug ) ]
88pub ( super ) enum ValueCursor {
9- Prop ( PropCursor ) ,
9+ Prop ( BodyCursor , PropCursor ) ,
1010 Body ( BodyCursor ) ,
1111}
1212
13- #[ derive( Clone ) ]
13+ #[ derive( Clone , Copy ) ]
1414pub ( super ) struct ValueDeserializer < ' de > {
1515 pub dtb : RefDtb < ' de > ,
1616 pub reg : RegConfig ,
17- pub body_cursor : BodyCursor ,
1817 pub cursor : ValueCursor ,
1918}
2019
@@ -39,8 +38,7 @@ impl<'de> Deserialize<'de> for ValueDeserializer<'_> {
3938 D : de:: Deserializer < ' de > ,
4039 {
4140 Ok ( unsafe {
42- ( * ( core:: ptr:: addr_of!( deserializer) as * const _ as * const & ValueDeserializer ) )
43- . clone ( )
41+ * ( * ( core:: ptr:: addr_of!( deserializer) as * const _ as * const & ValueDeserializer ) )
4442 } )
4543 }
4644 }
@@ -70,7 +68,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
7068 where
7169 V : de:: Visitor < ' de > ,
7270 {
73- if let ValueCursor :: Prop ( cursor) = self . cursor {
71+ if let ValueCursor :: Prop ( _ , cursor) = self . cursor {
7472 let val = cursor. map_on ( self . dtb , |data| {
7573 if data. is_empty ( ) {
7674 true
@@ -129,7 +127,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
129127 where
130128 V : de:: Visitor < ' de > ,
131129 {
132- if let ValueCursor :: Prop ( cursor) = self . cursor {
130+ if let ValueCursor :: Prop ( _ , cursor) = self . cursor {
133131 return visitor. visit_u32 ( cursor. map_u32_on ( self . dtb ) ?) ;
134132 }
135133 unreachable ! ( "node -> u32" ) ;
@@ -181,7 +179,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
181179 where
182180 V : de:: Visitor < ' de > ,
183181 {
184- if let ValueCursor :: Prop ( cursor) = self . cursor {
182+ if let ValueCursor :: Prop ( _ , cursor) = self . cursor {
185183 let data = cursor. data_on ( self . dtb ) ;
186184 return visitor. visit_borrowed_bytes ( data) ;
187185 }
@@ -200,7 +198,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
200198 V : de:: Visitor < ' de > ,
201199 {
202200 match self . cursor {
203- ValueCursor :: Prop ( cursor) => {
201+ ValueCursor :: Prop ( _ , cursor) => {
204202 let data = cursor. data_on ( self . dtb ) ;
205203 if data. is_empty ( ) {
206204 visitor. visit_none ( )
@@ -242,7 +240,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
242240 return visitor. visit_newtype_struct ( self ) ;
243241 }
244242 match self . cursor {
245- ValueCursor :: Prop ( cursor) => match name {
243+ ValueCursor :: Prop ( _ , cursor) => match name {
246244 "StrSeq" => {
247245 let inner = super :: str_seq:: Inner {
248246 dtb : self . dtb ,
@@ -274,11 +272,31 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
274272 }
275273 }
276274
277- fn deserialize_seq < V > ( self , _visitor : V ) -> Result < V :: Value , Self :: Error >
275+ fn deserialize_seq < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
278276 where
279277 V : de:: Visitor < ' de > ,
280278 {
281- unreachable ! ( "seq" )
279+ use super :: { StructAccess , StructAccessType , Temp } ;
280+ match self . move_on ( ) {
281+ Cursor :: Title ( c) => {
282+ let ( name, _) = c. split_on ( self . dtb ) ;
283+ let cursor = match self . cursor {
284+ ValueCursor :: Body ( cursor) => cursor,
285+ _ => unreachable ! ( "" ) ,
286+ } ;
287+
288+ let pre_len = name. as_bytes ( ) . iter ( ) . take_while ( |b| * * b != b'@' ) . count ( ) ;
289+ let name_bytes = & name. as_bytes ( ) [ ..pre_len] ;
290+ let name = unsafe { core:: str:: from_utf8_unchecked ( name_bytes) } ;
291+
292+ visitor. visit_seq ( StructAccess {
293+ access_type : StructAccessType :: Seq ( name) ,
294+ temp : Temp :: Node ( cursor, cursor) ,
295+ de : self ,
296+ } )
297+ }
298+ _ => unreachable ! ( "seq request on a none seq cursor" ) ,
299+ }
282300 }
283301
284302 fn deserialize_tuple < V > ( self , _len : usize , _visitor : V ) -> Result < V :: Value , Self :: Error >
@@ -308,7 +326,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
308326 if let ValueCursor :: Body ( cursor) = self . cursor {
309327 return visitor. visit_map ( StructAccess {
310328 access_type : StructAccessType :: Map ( false ) ,
311- temp : Temp :: Node ( self . body_cursor , cursor) ,
329+ temp : Temp :: Node ( cursor , cursor) ,
312330 de : self ,
313331 } ) ;
314332 } ;
@@ -328,7 +346,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
328346 if let ValueCursor :: Body ( cursor) = self . cursor {
329347 return visitor. visit_map ( StructAccess {
330348 access_type : StructAccessType :: Struct ( fields) ,
331- temp : Temp :: Node ( self . body_cursor , cursor) ,
349+ temp : Temp :: Node ( cursor , cursor) ,
332350 de : self ,
333351 } ) ;
334352 } ;
@@ -364,7 +382,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
364382
365383impl ValueDeserializer < ' _ > {
366384 #[ inline]
367- pub fn move_next ( & mut self ) -> super :: Cursor {
385+ pub fn move_on ( & mut self ) -> super :: Cursor {
368386 if let ValueCursor :: Body ( ref mut cursor) = self . cursor {
369387 return cursor. move_on ( self . dtb ) ;
370388 } ;
0 commit comments