Skip to content

Commit 35053fa

Browse files
committed
refactor: 重构 NodeClock、NodeInterruptController 和 NodePci 的构造函数,添加 try_from_raw 方法以增强错误处理
1 parent 9f18a72 commit 35053fa

File tree

4 files changed

+38
-39
lines changed

4 files changed

+38
-39
lines changed

fdt-edit/src/node/clock.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ impl NodeTrait for NodeClock {
4949
}
5050

5151
impl NodeClock {
52-
pub fn new(raw: RawNode) -> Self {
52+
pub fn try_from_raw(raw: RawNode) -> Result<Self, RawNode> {
53+
if !raw.properties.iter().any(|p| p.name() == "#clock-cells") {
54+
return Err(raw);
55+
}
56+
5357
let clock_output_names = Self::get_string_list(&raw, "clock-output-names");
5458
let clock_names = Self::get_string_list(&raw, "clock-names");
5559
let clock_cells = Self::get_u32(&raw, "#clock-cells").unwrap_or(0);
@@ -68,13 +72,13 @@ impl NodeClock {
6872
ClockType::Normal
6973
};
7074

71-
NodeClock {
75+
Ok(NodeClock {
7276
clock_output_names,
7377
clock_names,
7478
clock_cells,
7579
kind,
7680
raw,
77-
}
81+
})
7882
}
7983

8084
/// 获取字符串列表属性

fdt-edit/src/node/interrupt_controller.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ impl NodeTrait for NodeInterruptController {
2222
}
2323

2424
impl NodeInterruptController {
25+
pub fn try_from_raw(raw: RawNode) -> Result<Self, RawNode> {
26+
if !is_interrupt_controller_node(&raw) {
27+
return Err(raw);
28+
}
29+
Ok(NodeInterruptController(raw))
30+
}
31+
2532
pub fn new(raw: RawNode) -> Self {
2633
NodeInterruptController(raw)
2734
}

fdt-edit/src/node/mod.rs

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -54,51 +54,31 @@ impl Node {
5454
Self::Raw(RawNode::new(""))
5555
}
5656

57-
// fn new(raw: RawNode) -> Self {
58-
// let name = raw.name.as_str();
59-
60-
// // 根据节点名称或属性判断类型
61-
// if name == "chosen" {
62-
// return Self::Chosen(NodeChosen(raw));
63-
// }
64-
65-
// if name.starts_with("memory") {
66-
// return Self::Memory(NodeMemory(raw));
67-
// }
68-
69-
// // 检查是否是中断控制器
70-
// if is_interrupt_controller_node(&raw) {
71-
// return Self::InterruptController(NodeInterruptController::new(raw));
72-
// }
73-
74-
// // 检查是否是时钟提供者
75-
// if raw.properties.iter().any(|p| p.name() == "#clock-cells") {
76-
// return Self::Clock(NodeClock::new(raw));
77-
// }
78-
79-
// // 检查 device_type 属性
80-
// let mut node = Self::Raw(raw);
81-
// if let Some(t) = node.find_property("device_type")
82-
// && let PropertyKind::Str(dt) = &t.kind
83-
// && dt.as_str() == "pci"
84-
// {
85-
// node = Self::Pci(NodePci(node.to_raw()));
86-
// }
87-
// node
88-
// }
89-
9057
pub fn new_raw(name: &str) -> Self {
9158
Self::Raw(RawNode::new(name))
9259
}
9360

9461
pub fn from_raw<'a>(val: fdt_raw::Node<'a>) -> Self {
9562
match val {
9663
fdt_raw::Node::General(node_base) => {
64+
let mut raw = RawNode::from(node_base);
65+
66+
raw = match NodePci::try_from_raw(raw) {
67+
Ok(v) => return Self::Pci(v),
68+
Err(r) => r,
69+
};
70+
71+
raw = match NodeClock::try_from_raw(raw) {
72+
Ok(v) => return Self::Clock(v),
73+
Err(r) => r,
74+
};
9775

98-
76+
raw = match NodeInterruptController::try_from_raw(raw) {
77+
Ok(v) => return Self::InterruptController(v),
78+
Err(r) => r,
79+
};
9980

100-
let raw_node = RawNode::from(node_base);
101-
Self::Raw(raw_node)
81+
Self::Raw(raw)
10282
}
10383
fdt_raw::Node::Chosen(chosen) => {
10484
let mut new_one = NodeChosen::new();

fdt-edit/src/node/pci.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ impl NodeTrait for NodePci {
5858
}
5959

6060
impl NodePci {
61+
pub fn try_from_raw(raw: RawNode) -> Result<Self, RawNode> {
62+
if raw.device_type() == Some("pci") {
63+
Ok(NodePci(raw))
64+
} else {
65+
Err(raw)
66+
}
67+
}
68+
6169
pub fn new(name: &str) -> Self {
6270
NodePci(RawNode::new(name))
6371
}

0 commit comments

Comments
 (0)