1
- use super :: { BodyCursor , Cursor , PropCursor , RefDtb , RegConfig , ValueCursor , ValueDeserializer } ;
1
+ use super :: {
2
+ BodyCursor , Cursor , MultiNodeCursor , PropCursor , RefDtb , RegConfig , ValueCursor ,
3
+ ValueDeserializer ,
4
+ } ;
2
5
use core:: fmt:: Debug ;
3
6
use core:: marker:: PhantomData ;
4
7
use serde:: de:: MapAccess ;
5
- use serde:: { Deserialize , de} ;
8
+ use serde:: { Deserialize , Serialize , de} ;
6
9
7
10
// TODO: Spec 2.3.5 said that we should not inherited from ancestors and the size-cell &
8
11
// address-cells should only used for current node's children.
@@ -27,7 +30,7 @@ pub struct NodeIter<'de, 'b> {
27
30
pub struct NodeItem < ' de > {
28
31
dtb : RefDtb < ' de > ,
29
32
reg : RegConfig ,
30
- node : BodyCursor ,
33
+ node : MultiNodeCursor ,
31
34
name : & ' de str ,
32
35
}
33
36
@@ -81,6 +84,16 @@ impl<'de> Node<'de> {
81
84
pub fn get_prop < ' b > ( & ' b self , name : & str ) -> Option < PropItem < ' b > > {
82
85
self . props ( ) . find ( |prop| prop. get_name ( ) == name)
83
86
}
87
+
88
+ pub fn name ( & self ) -> & ' de str {
89
+ let cursor = self . cursor . clone ( ) . move_on ( self . dtb ) ;
90
+ if let Cursor :: Title ( c) = cursor {
91
+ let ( name, _) = c. split_on ( self . dtb ) ;
92
+ name
93
+ } else {
94
+ todo ! ( ) ;
95
+ }
96
+ }
84
97
}
85
98
86
99
impl Debug for Node < ' _ > {
@@ -128,10 +141,10 @@ impl<'de> Iterator for NodeIter<'de, '_> {
128
141
let res = Some ( Self :: Item {
129
142
dtb,
130
143
reg : self . node . reg ,
131
- node : node_cursor. skip_cursor ,
144
+ node : node_cursor,
132
145
name,
133
146
} ) ;
134
- * cursor = node_cursor. next_cursor ;
147
+ * cursor = node_cursor. skip_cursor ;
135
148
res
136
149
} else {
137
150
None
@@ -200,10 +213,9 @@ impl<'de> Deserialize<'de> for Node<'_> {
200
213
reg = Some ( value. reg ) ;
201
214
if key == "/" {
202
215
self_cursor = match value. cursor {
203
- ValueCursor :: Body ( cursor) => Some ( cursor) ,
204
- ValueCursor :: Node ( result) => Some ( result. next_cursor ) ,
216
+ ValueCursor :: NodeIn ( result) => Some ( result. start_cursor ) ,
205
217
_ => {
206
- unreachable ! ( "root of NodeSeq shouble be body cursor" )
218
+ unreachable ! ( "root of NodeSeq shouble be NodeIn cursor" )
207
219
}
208
220
} ;
209
221
continue ;
@@ -214,7 +226,7 @@ impl<'de> Deserialize<'de> for Node<'_> {
214
226
props_start = Some ( cursor) ;
215
227
}
216
228
}
217
- ValueCursor :: Node ( cursor) => {
229
+ ValueCursor :: NodeIn ( cursor) => {
218
230
if nodes_start. is_none ( ) {
219
231
nodes_start = Some ( cursor. start_cursor ) ;
220
232
}
@@ -249,7 +261,7 @@ impl<'de> NodeItem<'de> {
249
261
T :: deserialize ( & mut ValueDeserializer {
250
262
dtb : self . dtb ,
251
263
reg : self . reg ,
252
- cursor : ValueCursor :: Body ( self . node ) ,
264
+ cursor : ValueCursor :: NodeIn ( self . node ) ,
253
265
} )
254
266
. unwrap ( )
255
267
}
@@ -271,13 +283,13 @@ impl<'de> NodeItem<'de> {
271
283
}
272
284
}
273
285
274
- pub fn get_full_name ( & self ) -> & str {
286
+ pub fn get_full_name ( & self ) -> & ' de str {
275
287
self . name
276
288
}
277
289
}
278
290
279
291
impl < ' de > PropItem < ' de > {
280
- pub fn get_name ( & self ) -> & str {
292
+ pub fn get_name ( & self ) -> & ' de str {
281
293
self . name
282
294
}
283
295
pub fn deserialize < T : Deserialize < ' de > > ( & self ) -> T {
@@ -290,6 +302,32 @@ impl<'de> PropItem<'de> {
290
302
. unwrap ( )
291
303
}
292
304
}
305
+ impl < ' se > Serialize for NodeItem < ' se > {
306
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
307
+ where
308
+ S : serde:: Serializer ,
309
+ {
310
+ serializer. serialize_newtype_struct ( crate :: de_mut:: NODE_NODE_ITEM_NAME , self )
311
+ }
312
+ }
313
+
314
+ impl < ' se > Serialize for PropItem < ' se > {
315
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
316
+ where
317
+ S : serde:: Serializer ,
318
+ {
319
+ serializer. serialize_bytes ( self . prop . data_on ( self . dtb ) )
320
+ }
321
+ }
322
+
323
+ impl < ' se > Serialize for Node < ' se > {
324
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
325
+ where
326
+ S : serde:: Serializer ,
327
+ {
328
+ serializer. serialize_newtype_struct ( crate :: de_mut:: NODE_NAME , self )
329
+ }
330
+ }
293
331
294
332
#[ cfg( test) ]
295
333
mod tests {
0 commit comments