diff --git a/kernel/src/device_tree.rs b/kernel/src/device_tree.rs index cffa0698..e02bd191 100644 --- a/kernel/src/device_tree.rs +++ b/kernel/src/device_tree.rs @@ -23,56 +23,46 @@ impl DeviceTree { 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()); - + device_tree!(dt, [ + "Mice", + "Keyboards", + "Controllers", + "Generic HIDs", + "Disk Drives", + "CD Drives", + "Batteries", + "Monitors", + "GPUs", + "CPUs", + "USB", + "Serial Ports", + "Cameras", + "Biometric Devices", + ]); dt } } -use crate::utils::TAB; - +use crate::{utils::TAB, device_tree}; +use crate::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)?; + writeln!(f, "\r{}{}/\r", tab!(1), device_type)?; for device in devices { - writeln!(f, "{TAB}{TAB}{}/\r", device.name)?; + writeln!(f, "{}{}/\r", tab!(2), device.name)?; for attr in &device.attributes { - writeln!(f, "{TAB}{TAB}{TAB}{}\r", attr)?; + writeln!(f, "{}{}\r", tab!(3), attr)?; } for child in &device.children { - writeln!(f, "{TAB}{TAB}{TAB}{}\r", child.name)?; + writeln!(f, "{}{}\r", tab!(3), child.name)?; for attr in &child.attributes { - writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", attr)?; + writeln!(f, "{}{}\r", tab!(4), attr)?; } for child in &child.children { - writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", child.name)?; + writeln!(f, "{}{}\r", tab!(4), child.name)?; for attr in &child.attributes { - writeln!(f, "{TAB}{TAB}{TAB}{TAB}{TAB}{}\r", attr)?; + writeln!(f, "{}{}\r", tab!(5), attr)?; } } } diff --git a/kernel/src/utils.rs b/kernel/src/utils.rs index 405bf7e8..f733eec8 100644 --- a/kernel/src/utils.rs +++ b/kernel/src/utils.rs @@ -3,3 +3,26 @@ /// Used when tab `\t` in hardware is not known and we will default to two spaces pub const TAB: &str = " "; + + +// NOTE: this only reduces the code duplication in source code not in generated code! +// Written by Yours Truly: Munir +/// A simple macro to reduce code duplication when we use TAB internally +#[macro_export] +macro_rules! tab { + ($num:expr) => { + TAB.repeat($num) + } +} + +// NOTE: this only reduces the code duplication in source code not in generated code! +// Written by Yours Truly: Munir +/// A simple macro to reduce code duplication when we insert device types into the device tree +#[macro_export] +macro_rules! device_tree { + ($devtree:expr, $dev_type_vec:expr) => { + for each_device_type in $dev_type_vec { + $devtree.devices.insert(each_device_type.to_string(), Vec::new()); + } + }; +} \ No newline at end of file