@@ -11,6 +11,7 @@ use serde::{de, Deserialize};
1111pub struct Node < ' de > {
1212 dtb : RefDtb < ' de > ,
1313 reg : RegConfig ,
14+ cursor : BodyCursor ,
1415 props_start : Option < BodyCursor > ,
1516 nodes_start : Option < BodyCursor > ,
1617}
@@ -48,6 +49,15 @@ pub struct PropItem<'de> {
4849}
4950
5051impl < ' de > Node < ' de > {
52+ pub fn deserialize < T : Deserialize < ' de > > ( & self ) -> T {
53+ use super :: ValueCursor ;
54+ T :: deserialize ( & mut ValueDeserializer {
55+ dtb : self . dtb ,
56+ reg : self . reg ,
57+ cursor : ValueCursor :: Body ( self . cursor ) ,
58+ } )
59+ . unwrap ( )
60+ }
5161 // TODO: Maybe use BTreeMap when have alloc
5262 /// 获得节点迭代器。
5363 pub fn nodes < ' b > ( & ' b self ) -> NodeIter < ' de , ' b > {
@@ -179,10 +189,17 @@ impl<'de> Deserialize<'de> for Node<'_> {
179189 let mut reg: Option < RegConfig > = None ;
180190 let mut props_start: Option < BodyCursor > = None ;
181191 let mut nodes_start: Option < BodyCursor > = None ;
192+ let mut self_cursor: Option < BodyCursor > = None ;
182193 while let Some ( ( key, value) ) = access. next_entry :: < & str , ValueDeserializer < ' b > > ( ) ? {
183194 dtb = Some ( value. dtb ) ;
184195 reg = Some ( value. reg ) ;
185196 if key == "/" {
197+ self_cursor = match value. cursor {
198+ ValueCursor :: Body ( cursor) => Some ( cursor) ,
199+ ValueCursor :: Prop ( _, _) => {
200+ unreachable ! ( "root of NodeSeq shouble be body cursor" )
201+ }
202+ } ;
186203 continue ;
187204 }
188205 match value. cursor {
@@ -202,6 +219,7 @@ impl<'de> Deserialize<'de> for Node<'_> {
202219 Ok ( Node {
203220 dtb : dtb. unwrap ( ) ,
204221 reg : reg. unwrap ( ) ,
222+ cursor : self_cursor. unwrap ( ) ,
205223 nodes_start,
206224 props_start,
207225 } )
0 commit comments