Skip to content

Commit 57e84b1

Browse files
committed
refactor: split StructAccess
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent b7b58c2 commit 57e84b1

File tree

4 files changed

+210
-206
lines changed

4 files changed

+210
-206
lines changed

src/de_mut/mod.rs

Lines changed: 2 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod node_seq;
1212
mod reg;
1313
mod str_seq;
1414
// mod r#struct;
15+
mod struct_access;
1516
mod structs;
1617

1718
const VALUE_DESERIALIZER_NAME: &str = "$serde_device_tree$de_mut$ValueDeserializer";
@@ -24,6 +25,7 @@ pub mod buildin {
2425
use cursor::{BodyCursor, Cursor, PropCursor};
2526
use data::{ValueCursor, ValueDeserializer};
2627
use reg::RegConfig;
28+
use struct_access::{StructAccess, StructAccessType, Temp};
2729
use 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-
}

src/de_mut/node.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ impl<'de> Node<'de> {
5050
/// 获得节点迭代器。
5151
pub fn nodes<'b>(&'b self) -> Option<NodeIter<'de, 'b>> {
5252
self.nodes_start.map(|node_cursor| NodeIter {
53-
node: self,
54-
cursor: node_cursor,
55-
i: 0,
56-
})
53+
node: self,
54+
cursor: node_cursor,
55+
i: 0,
56+
})
5757
}
5858

5959
/// 获得属性迭代器。
6060
pub fn props<'b>(&'b self) -> Option<PropIter<'de, 'b>> {
6161
self.props_start.map(|node_cursor| PropIter {
62-
node: self,
63-
cursor: node_cursor,
64-
i: 0,
65-
})
62+
node: self,
63+
cursor: node_cursor,
64+
i: 0,
65+
})
6666
}
6767
}
6868

0 commit comments

Comments
 (0)