fdt_parser/base/node/
memory.rs1use core::{iter, ops::Deref};
2
3use crate::{base::NodeBase, FdtError, MemoryRegion};
4
5#[derive(Clone)]
6pub struct Memory<'a> {
7 node: NodeBase<'a>,
8}
9
10impl<'a> Memory<'a> {
11 pub(crate) fn new(node: NodeBase<'a>) -> Self {
12 Memory { node }
13 }
14
15 pub fn regions(&self) -> impl Iterator<Item = Result<MemoryRegion, FdtError>> + 'a {
19 let mut reg = self.node.reg();
20 let mut has_error = false;
21 iter::from_fn(move || {
22 if has_error {
23 return None;
24 }
25 match &mut reg {
26 Ok(iter) => {
27 let one = iter.next()?;
28 Some(Ok(MemoryRegion {
29 address: one.address as usize as _,
30 size: one.size.unwrap_or_default(),
31 }))
32 }
33 Err(e) => {
34 has_error = true;
35 Some(Err(e.clone()))
36 }
37 }
38 })
39 }
40
41 pub fn name(&self) -> &'a str {
42 self.node.name()
43 }
44}
45
46impl core::fmt::Debug for Memory<'_> {
47 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
48 let mut st = f.debug_struct("Memory");
49 st.field("name", &self.name());
50 for r in self.regions().flatten() {
51 st.field("region", &r);
52 }
53 st.finish()
54 }
55}
56
57impl<'a> Deref for Memory<'a> {
58 type Target = NodeBase<'a>;
59
60 fn deref(&self) -> &Self::Target {
61 &self.node
62 }
63}