1use anyhow::{Result, anyhow};
24use serde::{Deserialize, Serialize};
25use std::fs::read_to_string;
26
27use crate::traits::ToJson;
28
29#[derive(Debug, Clone, Deserialize, Serialize)]
33pub struct Resources {
34 pub io_ports: Vec<Resource>,
35 pub io_mem: Vec<Resource>,
36 pub dma: Vec<Resource>,
37}
38
39impl ToJson for Resources {}
40
41#[derive(Debug, Clone, Deserialize, Serialize)]
42pub struct Resource {
43 pub address: String,
44 pub title: String,
45}
46
47impl Resources {
48 pub fn new() -> Result<Self> {
49 let ports = read_to_string("/proc/ioports")?;
50 let ports = ports.lines();
51
52 let mem = read_to_string("/proc/iomem")?;
53 let mem = mem.lines();
54
55 let dma = read_to_string("/proc/dma")?;
56 let dma = dma.lines();
57
58 let mut io_ports = Vec::new();
59 let mut io_mem = Vec::new();
60 let mut io_dma = Vec::new();
61
62 for line in ports {
63 io_ports.push(Resource::try_from(line)?);
64 }
65 io_ports.shrink_to_fit();
66 for line in mem {
67 io_mem.push(Resource::try_from(line)?);
68 }
69 io_mem.shrink_to_fit();
70 for line in dma {
71 io_dma.push(Resource::try_from(line)?);
72 }
73 io_dma.shrink_to_fit();
74
75 Ok(Self {
76 io_ports,
77 io_mem,
78 dma: io_dma,
79 })
80 }
81}
82
83impl TryFrom<&str> for Resource {
84 type Error = anyhow::Error;
85
86 fn try_from(value: &str) -> std::result::Result<Self, Self::Error> {
87 let mut v = value.split(':');
88 match (v.next(), v.next()) {
89 (Some(addr), Some(value)) => Ok(Self {
90 address: addr.trim_end().to_string(),
91 title: value.trim().to_string(),
92 }),
93 _ => Err(anyhow!("Unknown string format: \"{value}\"")),
94 }
95 }
96}