Skip to content

Commit 6590276

Browse files
committed
feat: avoid option of Node::props and Node::nodes
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent ed66bb1 commit 6590276

File tree

3 files changed

+64
-72
lines changed

3 files changed

+64
-72
lines changed

examples/qemu-virt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ fn main() -> Result<(), Error> {
133133
}
134134

135135
println!("{:?}", t.soc);
136-
for current_node in t.soc.nodes().unwrap() {
136+
for current_node in t.soc.nodes() {
137137
if current_node.get_parsed_name().0 == "virtio_mmio" {
138138
let mmio = current_node.deserialize::<VirtIoMmio>();
139139
println!("{:?} {:?}", current_node.get_parsed_name(), mmio.reg);

src/de_mut/node.rs

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub struct Node<'de> {
1818
/// 节点迭代器。
1919
pub struct NodeIter<'de, 'b> {
2020
node: &'b Node<'de>,
21-
cursor: BodyCursor,
21+
cursor: Option<BodyCursor>,
2222
i: usize,
2323
}
2424

@@ -33,7 +33,7 @@ pub struct NodeItem<'de> {
3333
/// 属性迭代器。
3434
pub struct PropIter<'de, 'b> {
3535
node: &'b Node<'de>,
36-
cursor: BodyCursor,
36+
cursor: Option<BodyCursor>,
3737
i: usize,
3838
}
3939

@@ -50,52 +50,48 @@ pub struct PropItem<'de> {
5050
impl<'de> Node<'de> {
5151
// TODO: Maybe use BTreeMap when have alloc
5252
/// 获得节点迭代器。
53-
pub fn nodes<'b>(&'b self) -> Option<NodeIter<'de, 'b>> {
54-
self.nodes_start.map(|node_cursor| NodeIter {
53+
pub fn nodes<'b>(&'b self) -> NodeIter<'de, 'b> {
54+
NodeIter {
5555
node: self,
56-
cursor: node_cursor,
56+
cursor: self.nodes_start,
5757
i: 0,
58-
})
58+
}
5959
}
6060

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

7171
impl Debug for Node<'_> {
7272
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7373
let props = self.props();
7474
write!(f, "Props: [")?;
75-
if let Some(s) = props {
76-
let mut first_written = true;
77-
for prop in s {
78-
if first_written {
79-
write!(f, "\"{}\"", prop.get_name())?;
80-
first_written = false;
81-
} else {
82-
write!(f, ",\"{}\"", prop.get_name())?;
83-
}
75+
let mut first_written = true;
76+
for prop in props {
77+
if first_written {
78+
write!(f, "\"{}\"", prop.get_name())?;
79+
first_written = false;
80+
} else {
81+
write!(f, ",\"{}\"", prop.get_name())?;
8482
}
8583
}
8684
writeln!(f, "]")?;
8785

8886
let children = self.nodes();
8987
write!(f, "Children: [")?;
90-
if let Some(s) = children {
91-
let mut first_written = true;
92-
for child in s {
93-
if first_written {
94-
write!(f, "\"{}\"", child.get_full_name())?;
95-
first_written = false;
96-
} else {
97-
write!(f, ",\"{}\"", child.get_full_name())?;
98-
}
88+
let mut first_written = true;
89+
for child in children {
90+
if first_written {
91+
write!(f, "\"{}\"", child.get_full_name())?;
92+
first_written = false;
93+
} else {
94+
write!(f, ",\"{}\"", child.get_full_name())?;
9995
}
10096
}
10197
writeln!(f, "]")?;
@@ -108,19 +104,23 @@ impl<'de> Iterator for NodeIter<'de, '_> {
108104
type Item = NodeItem<'de>;
109105

110106
fn next(&mut self) -> Option<Self::Item> {
111-
self.i += 1;
112-
let dtb = self.node.dtb;
113-
if let Cursor::Title(c) = self.cursor.move_on(dtb) {
114-
let (name, _) = c.split_on(dtb);
115-
let (node_cursor, next) = c.take_node_on(dtb, name);
116-
let res = Some(Self::Item {
117-
dtb,
118-
reg: self.node.reg,
119-
node: node_cursor,
120-
name,
121-
});
122-
self.cursor = next;
123-
res
107+
if let Some(ref mut cursor) = self.cursor {
108+
self.i += 1;
109+
let dtb = self.node.dtb;
110+
if let Cursor::Title(c) = cursor.move_on(dtb) {
111+
let (name, _) = c.split_on(dtb);
112+
let (node_cursor, next) = c.take_node_on(dtb, name);
113+
let res = Some(Self::Item {
114+
dtb,
115+
reg: self.node.reg,
116+
node: node_cursor,
117+
name,
118+
});
119+
*cursor = next;
120+
res
121+
} else {
122+
None
123+
}
124124
} else {
125125
None
126126
}
@@ -131,19 +131,23 @@ impl<'de> Iterator for PropIter<'de, '_> {
131131
type Item = PropItem<'de>;
132132

133133
fn next(&mut self) -> Option<Self::Item> {
134-
self.i += 1;
135-
let dtb = self.node.dtb;
136-
if let Cursor::Prop(c) = self.cursor.move_on(dtb) {
137-
let (name, next) = c.name_on(dtb);
138-
let res = Some(Self::Item {
139-
dtb,
140-
body: self.cursor,
141-
reg: self.node.reg,
142-
prop: c,
143-
name,
144-
});
145-
self.cursor = next;
146-
res
134+
if let Some(ref mut cursor) = self.cursor {
135+
self.i += 1;
136+
let dtb = self.node.dtb;
137+
if let Cursor::Prop(c) = cursor.move_on(dtb) {
138+
let (name, next) = c.name_on(dtb);
139+
let res = Some(Self::Item {
140+
dtb,
141+
body: *cursor,
142+
reg: self.node.reg,
143+
prop: c,
144+
name,
145+
});
146+
*cursor = next;
147+
res
148+
} else {
149+
None
150+
}
147151
} else {
148152
None
149153
}

src/utils/mod.rs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,7 @@ impl Node<'_> {
1818
Some(node) => node,
1919
None => break,
2020
};
21-
let mut nodes = match node.nodes() {
22-
Some(nodes) => nodes,
23-
None => {
24-
current_node = None;
25-
break;
26-
}
27-
};
28-
let next_node_iter = nodes.find(|x| x.get_full_name() == current_name);
21+
let next_node_iter = node.nodes().find(|x| x.get_full_name() == current_name);
2922
match next_node_iter {
3023
None => current_node = None,
3124
Some(iter) => {
@@ -43,11 +36,9 @@ impl Node<'_> {
4336
F: FnMut(&Node),
4437
{
4538
func(self);
46-
if let Some(nodes) = self.nodes() {
47-
for node in nodes {
48-
let node = node.deserialize::<Node>();
49-
node.search(func);
50-
}
39+
for node in self.nodes() {
40+
let node = node.deserialize::<Node>();
41+
node.search(func);
5142
}
5243
}
5344
}
@@ -92,10 +83,7 @@ mod tests {
9283

9384
let node: Node = from_raw_mut(&dtb).unwrap();
9485
let node = node.find("/chosen").unwrap();
95-
let result = node
96-
.props()
97-
.unwrap()
98-
.find(|prop| prop.get_name() == "stdout-path");
86+
let result = node.props().find(|prop| prop.get_name() == "stdout-path");
9987
match result {
10088
Some(iter) => {
10189
if iter.deserialize::<StrSeq>().iter().next().unwrap() != "serial0" {

0 commit comments

Comments
 (0)