1- use super :: { BodyCursor , Cursor , PropCursor , RefDtb , RegConfig , StructDeserializer } ;
1+ use super :: {
2+ BodyCursor , BorrowedValueDeserializer , Cursor , PropCursor , RefDtb , RegConfig ,
3+ StructDeserializer ,
4+ } ;
25use core:: marker:: PhantomData ;
36use serde:: { de, Deserialize } ;
47
@@ -44,8 +47,10 @@ pub struct PropItem<'de> {
4447}
4548
4649impl < ' de > Node < ' de > {
47- pub unsafe fn covnert_from_struct_deseriallizer_pointer ( ptr : * const u8 ) -> Self {
48- let struct_deseriallizer = unsafe { & * ( ptr as * const StructDeserializer ) } ;
50+ unsafe fn covnert_from_struct_deseriallizer_pointer (
51+ ptr : * const & StructDeserializer < ' de > ,
52+ ) -> Self {
53+ let struct_deseriallizer = & * ( ptr) ;
4954 println ! ( "get node from {:?}" , struct_deseriallizer. cursor) ;
5055 let dtb = struct_deseriallizer. dtb ;
5156 let mut cursor = struct_deseriallizer. cursor ;
@@ -83,7 +88,7 @@ impl<'de> Node<'de> {
8388 }
8489 }
8590 /// 获得节点迭代器。
86- pub const fn node_iter < ' b > ( & ' b self ) -> Option < NodeIter < ' de , ' b > > {
91+ pub const fn nodes < ' b > ( & ' b self ) -> Option < NodeIter < ' de , ' b > > {
8792 match self . nodes_start {
8893 None => None ,
8994 Some ( node_cursor) => Some ( NodeIter {
@@ -95,7 +100,7 @@ impl<'de> Node<'de> {
95100 }
96101
97102 /// 获得属性迭代器。
98- pub const fn prop_iter < ' b > ( & ' b self ) -> Option < PropIter < ' de , ' b > > {
103+ pub const fn props < ' b > ( & ' b self ) -> Option < PropIter < ' de , ' b > > {
99104 match self . nodes_start {
100105 None => None ,
101106 Some ( node_cursor) => Some ( PropIter {
@@ -165,24 +170,19 @@ impl<'de, 'b> Deserialize<'de> for Node<'b> {
165170 type Value = Node < ' b > ;
166171
167172 fn expecting ( & self , formatter : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
168- write ! ( formatter, "struct StrSeq " )
173+ write ! ( formatter, "struct Node " )
169174 }
170175
171- fn visit_borrowed_bytes < E > ( self , v : & ' de [ u8 ] ) -> Result < Self :: Value , E >
176+ fn visit_newtype_struct < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
172177 where
173- E : de:: Error ,
178+ D : de:: Deserializer < ' de > ,
174179 {
175- // 结构体转为内存切片,然后拷贝过来
176- if v. len ( ) == core:: mem:: size_of :: < StructDeserializer > ( ) {
177- Ok ( unsafe {
178- Self :: Value :: covnert_from_struct_deseriallizer_pointer ( v. as_ptr ( ) )
179- } )
180- } else {
181- Err ( E :: invalid_length (
182- v. len ( ) ,
183- & "`Node` is copied with wrong size." ,
184- ) )
185- }
180+ Ok ( unsafe {
181+ Node :: covnert_from_struct_deseriallizer_pointer ( core:: ptr:: addr_of!(
182+ deserializer
183+ )
184+ as * const & StructDeserializer )
185+ } )
186186 }
187187 }
188188
@@ -230,4 +230,12 @@ impl<'de> PropItem<'de> {
230230 pub fn get_name ( & self ) -> & str {
231231 self . name
232232 }
233+ pub fn deserialize < T : Deserialize < ' de > > ( & self ) -> T {
234+ T :: deserialize ( & mut BorrowedValueDeserializer {
235+ dtb : self . dtb ,
236+ reg : self . reg ,
237+ cursor : self . prop ,
238+ } )
239+ . unwrap ( )
240+ }
233241}
0 commit comments