1- use super :: { BodyCursor , Cursor } ;
1+ use super :: cursor:: MultiNodeCursor ;
2+ use super :: { BodyCursor , Cursor } ;
23use super :: { DtError , PropCursor , RefDtb , RegConfig } ;
34
45use core:: marker:: PhantomData ;
56use serde:: { de, Deserialize } ;
67
78#[ derive( Clone , Copy , Debug ) ]
89pub ( super ) enum ValueCursor {
9- Prop ( BodyCursor , PropCursor ) ,
1010 Body ( BodyCursor ) ,
11+ Prop ( BodyCursor , PropCursor ) ,
12+ Node ( MultiNodeCursor ) ,
1113}
1214
1315#[ derive( Clone , Copy ) ]
@@ -206,6 +208,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
206208 visitor. visit_some ( self )
207209 }
208210 }
211+ ValueCursor :: Node ( _) => visitor. visit_some ( self ) ,
209212 ValueCursor :: Body ( _) => visitor. visit_some ( self ) ,
210213 }
211214 }
@@ -247,25 +250,30 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
247250 V : de:: Visitor < ' de > ,
248251 {
249252 use super :: { StructAccess , StructAccessType , Temp } ;
250- match self . move_on ( ) {
251- Cursor :: Title ( c) => {
252- let ( name, _) = c. split_on ( self . dtb ) ;
253- let cursor = match self . cursor {
254- ValueCursor :: Body ( cursor) => cursor,
255- _ => unreachable ! ( "" ) ,
256- } ;
257-
258- let pre_len = name. as_bytes ( ) . iter ( ) . take_while ( |b| * * b != b'@' ) . count ( ) ;
259- let name_bytes = & name. as_bytes ( ) [ ..pre_len] ;
260- let name = unsafe { core:: str:: from_utf8_unchecked ( name_bytes) } ;
261-
262- visitor. visit_seq ( StructAccess {
263- access_type : StructAccessType :: Seq ( name) ,
264- temp : Temp :: Node ( cursor, cursor) ,
265- de : self ,
266- } )
253+ match self . cursor {
254+ ValueCursor :: Node ( result) => {
255+ let mut start_cursor = result. start_cursor ;
256+ match start_cursor. move_on ( self . dtb ) {
257+ Cursor :: Title ( c) => {
258+ let ( name, _) = c. split_on ( self . dtb ) ;
259+
260+ let pre_len = name. as_bytes ( ) . iter ( ) . take_while ( |b| * * b != b'@' ) . count ( ) ;
261+ let name_bytes = & name. as_bytes ( ) [ ..pre_len] ;
262+ let name = unsafe { core:: str:: from_utf8_unchecked ( name_bytes) } ;
263+
264+ let de = self ;
265+ de. cursor = ValueCursor :: Body ( start_cursor) ;
266+
267+ visitor. visit_seq ( StructAccess {
268+ access_type : StructAccessType :: Seq ( name) ,
269+ temp : Temp :: Uninit ,
270+ de,
271+ } )
272+ }
273+ _ => unreachable ! ( "seq request on a none seq cursor" ) ,
274+ }
267275 }
268- _ => unreachable ! ( "seq request on a none seq cursor" ) ,
276+ _ => unreachable ! ( "Seq request on a not-node cursor" ) ,
269277 }
270278 }
271279
@@ -293,14 +301,19 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
293301 V : de:: Visitor < ' de > ,
294302 {
295303 use super :: { StructAccess , StructAccessType , Temp } ;
296- if let ValueCursor :: Body ( cursor ) = self . cursor {
297- return visitor. visit_map ( StructAccess {
304+ match self . cursor {
305+ ValueCursor :: Node ( _ ) => visitor. visit_map ( StructAccess {
298306 access_type : StructAccessType :: Map ( false ) ,
299- temp : Temp :: Node ( cursor , cursor ) ,
307+ temp : Temp :: Uninit ,
300308 de : self ,
301- } ) ;
302- } ;
303- unreachable ! ( "Prop -> map" )
309+ } ) ,
310+ ValueCursor :: Body ( _) => visitor. visit_map ( StructAccess {
311+ access_type : StructAccessType :: Map ( false ) ,
312+ temp : Temp :: Uninit ,
313+ de : self ,
314+ } ) ,
315+ ValueCursor :: Prop ( _, _) => unreachable ! ( "Prop -> map" ) ,
316+ }
304317 }
305318
306319 fn deserialize_struct < V > (
@@ -313,14 +326,19 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
313326 V : de:: Visitor < ' de > ,
314327 {
315328 use super :: { StructAccess , StructAccessType , Temp } ;
316- if let ValueCursor :: Body ( cursor ) = self . cursor {
317- return visitor. visit_map ( StructAccess {
329+ match self . cursor {
330+ ValueCursor :: Node ( _ ) => visitor. visit_map ( StructAccess {
318331 access_type : StructAccessType :: Struct ( fields) ,
319- temp : Temp :: Node ( cursor , cursor ) ,
332+ temp : Temp :: Uninit ,
320333 de : self ,
321- } ) ;
322- } ;
323- unreachable ! ( "Prop -> struct {_name} {fields:?}" )
334+ } ) ,
335+ ValueCursor :: Body ( _) => visitor. visit_map ( StructAccess {
336+ access_type : StructAccessType :: Struct ( fields) ,
337+ temp : Temp :: Uninit ,
338+ de : self ,
339+ } ) ,
340+ ValueCursor :: Prop ( _, _) => unreachable ! ( "Prop -> struct {_name}" ) ,
341+ }
324342 }
325343
326344 fn deserialize_enum < V > (
0 commit comments