1- use super :: { BodyCursor , Cursor , PropCursor , RefDtb , RegConfig , ValueCursor , ValueDeserializer } ;
1+ use super :: {
2+ BodyCursor , Cursor , MultiNodeCursor , PropCursor , RefDtb , RegConfig , ValueCursor ,
3+ ValueDeserializer ,
4+ } ;
25use core:: fmt:: Debug ;
36use core:: marker:: PhantomData ;
47use serde:: de:: MapAccess ;
5- use serde:: { Deserialize , de} ;
8+ use serde:: { Deserialize , Serialize , de} ;
69
710// TODO: Spec 2.3.5 said that we should not inherited from ancestors and the size-cell &
811// address-cells should only used for current node's children.
@@ -27,7 +30,7 @@ pub struct NodeIter<'de, 'b> {
2730pub struct NodeItem < ' de > {
2831 dtb : RefDtb < ' de > ,
2932 reg : RegConfig ,
30- node : BodyCursor ,
33+ node : MultiNodeCursor ,
3134 name : & ' de str ,
3235}
3336
@@ -81,6 +84,16 @@ impl<'de> Node<'de> {
8184 pub fn get_prop < ' b > ( & ' b self , name : & str ) -> Option < PropItem < ' b > > {
8285 self . props ( ) . find ( |prop| prop. get_name ( ) == name)
8386 }
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+ }
8497}
8598
8699impl Debug for Node < ' _ > {
@@ -128,10 +141,10 @@ impl<'de> Iterator for NodeIter<'de, '_> {
128141 let res = Some ( Self :: Item {
129142 dtb,
130143 reg : self . node . reg ,
131- node : node_cursor. skip_cursor ,
144+ node : node_cursor,
132145 name,
133146 } ) ;
134- * cursor = node_cursor. next_cursor ;
147+ * cursor = node_cursor. skip_cursor ;
135148 res
136149 } else {
137150 None
@@ -200,10 +213,9 @@ impl<'de> Deserialize<'de> for Node<'_> {
200213 reg = Some ( value. reg ) ;
201214 if key == "/" {
202215 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 ) ,
205217 _ => {
206- unreachable ! ( "root of NodeSeq shouble be body cursor" )
218+ unreachable ! ( "root of NodeSeq shouble be NodeIn cursor" )
207219 }
208220 } ;
209221 continue ;
@@ -214,7 +226,7 @@ impl<'de> Deserialize<'de> for Node<'_> {
214226 props_start = Some ( cursor) ;
215227 }
216228 }
217- ValueCursor :: Node ( cursor) => {
229+ ValueCursor :: NodeIn ( cursor) => {
218230 if nodes_start. is_none ( ) {
219231 nodes_start = Some ( cursor. start_cursor ) ;
220232 }
@@ -249,7 +261,7 @@ impl<'de> NodeItem<'de> {
249261 T :: deserialize ( & mut ValueDeserializer {
250262 dtb : self . dtb ,
251263 reg : self . reg ,
252- cursor : ValueCursor :: Body ( self . node ) ,
264+ cursor : ValueCursor :: NodeIn ( self . node ) ,
253265 } )
254266 . unwrap ( )
255267 }
@@ -271,13 +283,13 @@ impl<'de> NodeItem<'de> {
271283 }
272284 }
273285
274- pub fn get_full_name ( & self ) -> & str {
286+ pub fn get_full_name ( & self ) -> & ' de str {
275287 self . name
276288 }
277289}
278290
279291impl < ' de > PropItem < ' de > {
280- pub fn get_name ( & self ) -> & str {
292+ pub fn get_name ( & self ) -> & ' de str {
281293 self . name
282294 }
283295 pub fn deserialize < T : Deserialize < ' de > > ( & self ) -> T {
@@ -290,6 +302,32 @@ impl<'de> PropItem<'de> {
290302 . unwrap ( )
291303 }
292304}
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+ }
293331
294332#[ cfg( test) ]
295333mod tests {
0 commit comments