@@ -12,6 +12,7 @@ mod node_seq;
1212mod reg;
1313mod str_seq;
1414// mod r#struct;
15+ mod struct_access;
1516mod structs;
1617
1718const VALUE_DESERIALIZER_NAME : & str = "$serde_device_tree$de_mut$ValueDeserializer" ;
@@ -24,6 +25,7 @@ pub mod buildin {
2425use cursor:: { BodyCursor , Cursor , PropCursor } ;
2526use data:: { ValueCursor , ValueDeserializer } ;
2627use reg:: RegConfig ;
28+ use struct_access:: { StructAccess , StructAccessType , Temp } ;
2729use structs:: { RefDtb , StructureBlock , BLOCK_LEN } ;
2830
2931/// 从 [`RefDtb`] 反序列化一个描述设备树的 `T` 类型实例。
@@ -50,199 +52,3 @@ where
5052 }
5153 } )
5254}
53-
54- // For map type, we should send root item to trans dtb and reg
55- enum StructAccessType < ' de > {
56- Map ( bool ) ,
57- Seq ( & ' de str ) ,
58- Struct ( & ' static [ & ' static str ] ) ,
59- }
60-
61- /// 结构体解析状态。
62- struct StructAccess < ' de , ' b > {
63- access_type : StructAccessType < ' de > ,
64- temp : Temp ,
65- de : & ' b mut ValueDeserializer < ' de > ,
66- }
67-
68- /// 用于跨键-值传递的临时变量。
69- ///
70- /// 解析键(名字)时将确定值类型,保存 `Temp` 类型的状态。
71- /// 根据状态分发值解析器。
72- enum Temp {
73- Node ( BodyCursor , BodyCursor ) ,
74- Group ( BodyCursor ) ,
75- Prop ( BodyCursor , PropCursor ) ,
76- }
77-
78- impl < ' de > de:: MapAccess < ' de > for StructAccess < ' de , ' _ > {
79- type Error = DtError ;
80-
81- fn next_key_seed < K > ( & mut self , seed : K ) -> Result < Option < K :: Value > , Self :: Error >
82- where
83- K : de:: DeserializeSeed < ' de > ,
84- {
85- if let StructAccessType :: Map ( flag) = self . access_type {
86- if !flag {
87- return seed
88- . deserialize ( de:: value:: BorrowedStrDeserializer :: new ( "/" ) )
89- . map ( Some ) ;
90- }
91- }
92- let check_contains = |name : & str | -> bool {
93- match self . access_type {
94- StructAccessType :: Struct ( fields) => fields. contains ( & name) ,
95- _ => true ,
96- }
97- } ;
98- let name = loop {
99- let origin_cursor = match self . de . cursor {
100- ValueCursor :: Body ( cursor) => cursor,
101- _ => unreachable ! ( "map access's cursor should always be body cursor" ) ,
102- } ;
103- match self . de . move_on ( ) {
104- // 子节点名字
105- Cursor :: Title ( c) => {
106- let ( name, _) = c. split_on ( self . de . dtb ) ;
107-
108- let pre_len = name. as_bytes ( ) . iter ( ) . take_while ( |b| * * b != b'@' ) . count ( ) ;
109- // 子节点名字不带 @ 或正在解析 Node 类型
110- if pre_len == name. as_bytes ( ) . len ( ) || check_contains ( name) {
111- let ( node, next) = c. take_node_on ( self . de . dtb , name) ;
112- self . de . cursor = ValueCursor :: Body ( next) ;
113- if check_contains ( name) {
114- self . temp = Temp :: Node ( origin_cursor, node) ;
115- break name;
116- }
117- }
118- // @ 之前的部分是真正的名字,用这个名字搜索连续的一组
119- else {
120- let name_bytes = & name. as_bytes ( ) [ ..pre_len] ;
121- let name = unsafe { core:: str:: from_utf8_unchecked ( name_bytes) } ;
122- let ( group, _, next) = c. take_group_on ( self . de . dtb , name) ;
123- self . de . cursor = ValueCursor :: Body ( next) ;
124- if check_contains ( name) {
125- self . temp = Temp :: Group ( group) ;
126- break name;
127- }
128- }
129- }
130- // 属性条目
131- Cursor :: Prop ( c) => {
132- let ( name, next) = c. name_on ( self . de . dtb ) ;
133- self . de . cursor = ValueCursor :: Body ( next) ;
134- match name {
135- "#address-cells" => {
136- self . de . reg . address_cells = c. map_u32_on ( self . de . dtb ) ?;
137- }
138- "#size-cells" => {
139- self . de . reg . size_cells = c. map_u32_on ( self . de . dtb ) ?;
140- }
141- _ => { }
142- }
143- if check_contains ( name) {
144- self . temp = Temp :: Prop ( origin_cursor, c) ;
145- break name;
146- }
147- }
148- // 截止符,结构体解析完成
149- Cursor :: End => {
150- self . de . step_n ( 1 ) ;
151- return Ok ( None ) ;
152- }
153- }
154- } ;
155- seed. deserialize ( de:: value:: BorrowedStrDeserializer :: new ( name) )
156- . map ( Some )
157- }
158-
159- fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value , Self :: Error >
160- where
161- V : de:: DeserializeSeed < ' de > ,
162- {
163- if let StructAccessType :: Map ( ref mut flag) = self . access_type {
164- if !* flag {
165- * flag = true ;
166- return seed. deserialize ( & mut ValueDeserializer {
167- dtb : self . de . dtb ,
168- reg : self . de . reg ,
169- cursor : self . de . cursor ,
170- } ) ;
171- }
172- }
173- match self . temp {
174- Temp :: Node ( cursor, node_cursor) => {
175- // 键是独立节点名字,递归
176- match self . access_type {
177- StructAccessType :: Map ( _) => seed. deserialize ( & mut ValueDeserializer {
178- dtb : self . de . dtb ,
179- reg : self . de . reg ,
180- cursor : ValueCursor :: Body ( cursor) ,
181- } ) ,
182- StructAccessType :: Struct ( _) => seed. deserialize ( & mut ValueDeserializer {
183- dtb : self . de . dtb ,
184- reg : self . de . reg ,
185- cursor : ValueCursor :: Body ( node_cursor) ,
186- } ) ,
187- _ => unreachable ! ( ) ,
188- }
189- }
190- Temp :: Group ( cursor) => {
191- // 键是组名字,构造组反序列化器
192- seed. deserialize ( & mut ValueDeserializer {
193- dtb : self . de . dtb ,
194- reg : self . de . reg ,
195- cursor : ValueCursor :: Body ( cursor) ,
196- } )
197- }
198- Temp :: Prop ( origin_cursor, cursor) => {
199- // 键是属性名字,构造属性反序列化器
200- seed. deserialize ( & mut ValueDeserializer {
201- dtb : self . de . dtb ,
202- reg : self . de . reg ,
203- cursor : ValueCursor :: Prop ( origin_cursor, cursor) ,
204- } )
205- }
206- }
207- }
208- }
209-
210- impl < ' de > de:: SeqAccess < ' de > for StructAccess < ' de , ' _ > {
211- type Error = DtError ;
212-
213- fn next_element_seed < K > ( & mut self , seed : K ) -> Result < Option < K :: Value > , Self :: Error >
214- where
215- K : de:: DeserializeSeed < ' de > ,
216- {
217- if let StructAccessType :: Seq ( pre_name) = self . access_type {
218- match self . de . move_on ( ) {
219- // 子节点名字
220- Cursor :: Title ( c) => {
221- let ( name, _) = c. split_on ( self . de . dtb ) ;
222- let ( _, next) = c. take_node_on ( self . de . dtb , name) ;
223- let prev_cursor = match self . de . cursor {
224- ValueCursor :: Body ( cursor) => cursor,
225- _ => unreachable ! ( ) ,
226- } ;
227-
228- let pre_len = name. as_bytes ( ) . iter ( ) . take_while ( |b| * * b != b'@' ) . count ( ) ;
229- let name_bytes = & name. as_bytes ( ) [ ..pre_len] ;
230- let name = unsafe { core:: str:: from_utf8_unchecked ( name_bytes) } ;
231- if pre_name != name {
232- return Ok ( None ) ;
233- }
234- self . de . cursor = ValueCursor :: Body ( next) ;
235- seed. deserialize ( & mut ValueDeserializer {
236- dtb : self . de . dtb ,
237- reg : self . de . reg ,
238- cursor : ValueCursor :: Body ( prev_cursor) ,
239- } )
240- . map ( Some )
241- }
242- _ => Ok ( None ) ,
243- }
244- } else {
245- unreachable ! ( "SeqAccess should only be accessed by seq" ) ;
246- }
247- }
248- }
0 commit comments