use alloc::{string::String, vec::Vec}; use {crate::alloc::string::ToString, core::fmt, hashbrown::HashMap, xml::XMLElement}; pub type Device = xml::XMLElement; #[derive(Debug)] pub struct DeviceTree { pub devices: HashMap>, } impl DeviceTree { pub fn new() -> Self { let mut dt = Self { devices: HashMap::new(), }; // Human input devices { dt.devices.insert("Mice".to_string(), Vec::new()); dt.devices.insert("Keyboards".to_string(), Vec::new()); dt.devices.insert("Controllers".to_string(), Vec::new()); // Human Input Devices that do not fit into other catagories go in this spot dt.devices.insert("Generic HIDs".to_string(), Vec::new()); } { dt.devices.insert("Disk Drives".to_string(), Vec::new()); dt.devices.insert("CD Drives".to_string(), Vec::new()); } dt.devices.insert("Batteries".to_string(), Vec::new()); dt.devices.insert("Monitors".to_string(), Vec::new()); dt.devices.insert("GPUs".to_string(), Vec::new()); dt.devices.insert("CPUs".to_string(), Vec::new()); dt.devices.insert("USB".to_string(), Vec::new()); dt.devices.insert("Serial Ports".to_string(), Vec::new()); dt.devices.insert("Cameras".to_string(), Vec::new()); dt.devices .insert("Biometric Devices".to_string(), Vec::new()); dt } } use crate::utils::TAB; impl fmt::Display for DeviceTree { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { writeln!(f); for (device_type, devices) in &self.devices { writeln!(f, "\r{TAB}{}/\r", device_type)?; for device in devices { writeln!(f, "{TAB}{TAB}{}/\r", device.name)?; for attr in &device.attributes { writeln!(f, "{TAB}{TAB}{TAB}{}\r", attr)?; } for child in &device.children { writeln!(f, "{TAB}{TAB}{TAB}{}\r", child.name)?; for attr in &child.attributes { writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", attr)?; } for child in &child.children { writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", child.name)?; for attr in &child.attributes { writeln!(f, "{TAB}{TAB}{TAB}{TAB}{TAB}{}\r", attr)?; } } } } } Ok(()) } }