homework: use hash map and implement Debug trait
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
use crate::Device;
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Room {
|
||||
name: String,
|
||||
devices: Box<[Device]>,
|
||||
devices: HashMap<String, Device>,
|
||||
}
|
||||
|
||||
impl Room {
|
||||
pub fn new(name: impl AsRef<str>, devices: Box<[Device]>) -> Self {
|
||||
let devices = devices.into_iter().map(|d| (d.get_name().to_string(), d)).collect();
|
||||
Self {
|
||||
name: name.as_ref().to_string(),
|
||||
devices,
|
||||
@@ -17,24 +20,19 @@ impl Room {
|
||||
&self.name
|
||||
}
|
||||
|
||||
fn is_valid_idx(&self, idx: usize) -> bool {
|
||||
idx < self.devices.len()
|
||||
pub fn get_device(&self, key: &str) -> Option<&Device> {
|
||||
self.devices.get(key)
|
||||
}
|
||||
|
||||
pub fn get_device(&self, idx: usize) -> Option<&Device> {
|
||||
if self.is_valid_idx(idx) { Some(&self.devices[idx]) } else { None }
|
||||
}
|
||||
|
||||
pub fn get_device_mut(&mut self, idx: usize) -> Option<&mut Device> {
|
||||
self.is_valid_idx(idx);
|
||||
Some(&mut self.devices[idx])
|
||||
pub fn get_device_mut(&mut self, key: &str) -> Option<&mut Device> {
|
||||
self.devices.get_mut(key)
|
||||
}
|
||||
|
||||
pub fn print_status(&self) {
|
||||
println!("ROOM '{}':", self.name);
|
||||
println!("{}", "-".repeat(24));
|
||||
for d in self.devices.iter() {
|
||||
d.print_status();
|
||||
for (_, device) in self.devices.iter() {
|
||||
device.print_status();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,16 +53,16 @@ mod tests {
|
||||
assert_eq!(room.get_name(), "test_room");
|
||||
room.print_status();
|
||||
|
||||
assert_eq!(format!("{}", room.get_device(0).unwrap().display()), "DEV:PSoc[ OFF : 0.0 ]");
|
||||
assert_eq!(format!("{}", room.get_device(1).unwrap().display()), "DEV:Therm[ 21.6 ]");
|
||||
assert_eq!(format!("{}", room.get_device("PSoc").unwrap().display()), "DEV:PSoc[ OFF : 0.0 ]");
|
||||
assert_eq!(format!("{}", room.get_device("Therm").unwrap().display()), "DEV:Therm[ 21.6 ]");
|
||||
|
||||
let Device::PowerSocket(power_socket) = room.get_device_mut(0).unwrap() else {
|
||||
let Device::PowerSocket(power_socket) = room.get_device_mut("PSoc").unwrap() else {
|
||||
unreachable!()
|
||||
};
|
||||
power_socket.set_on(true);
|
||||
|
||||
assert_eq!(format!("{}", room.get_device(0).unwrap().display()), "DEV:PSoc[ ON : 12.3 ]");
|
||||
assert_eq!(format!("{}", room.get_device(1).unwrap().display()), "DEV:Therm[ 21.6 ]");
|
||||
assert_eq!(format!("{}", room.get_device("PSoc").unwrap().display()), "DEV:PSoc[ ON : 12.3 ]");
|
||||
assert_eq!(format!("{}", room.get_device("Therm").unwrap().display()), "DEV:Therm[ 21.6 ]");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -76,6 +74,6 @@ mod tests {
|
||||
Device::Thermometer(Thermometer::new("Therm", 21.56)),
|
||||
]),
|
||||
);
|
||||
assert!(room.get_device(2).is_none());
|
||||
assert!(room.get_device("dummy").is_none());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user