homework: use hash map and implement Debug trait
This commit is contained in:
@@ -1,35 +1,38 @@
|
||||
use crate::Room;
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct House {
|
||||
address: String,
|
||||
rooms: Box<[Room]>,
|
||||
rooms: HashMap<String, Room>,
|
||||
}
|
||||
|
||||
impl House {
|
||||
pub fn new(address: impl AsRef<str>, rooms: Box<[Room]>) -> Self {
|
||||
let rooms = rooms.into_iter().map(|r| (r.get_name().to_string(), r)).collect();
|
||||
Self {
|
||||
address: address.as_ref().to_string(),
|
||||
rooms,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_valid_idx(&self, idx: usize) -> bool {
|
||||
idx < self.rooms.len()
|
||||
pub fn get_address(&self) -> &str {
|
||||
&self.address
|
||||
}
|
||||
|
||||
pub fn get_room(&self, idx: usize) -> Option<&Room> {
|
||||
if self.is_valid_idx(idx) { Some(&self.rooms[idx]) } else { None }
|
||||
pub fn get_room(&self, key: &str) -> Option<&Room> {
|
||||
self.rooms.get(key)
|
||||
}
|
||||
|
||||
pub fn get_room_mut(&mut self, idx: usize) -> Option<&mut Room> {
|
||||
if self.is_valid_idx(idx) { Some(&mut self.rooms[idx]) } else { None }
|
||||
pub fn get_room_mut(&mut self, key: &str) -> Option<&mut Room> {
|
||||
self.rooms.get_mut(key)
|
||||
}
|
||||
|
||||
pub fn print_status(&self) {
|
||||
println!("HOUSE '{}':", self.address);
|
||||
println!("{}", "=".repeat(32));
|
||||
for d in self.rooms.iter() {
|
||||
d.print_status();
|
||||
for (_, room) in self.rooms.iter() {
|
||||
room.print_status();
|
||||
println!();
|
||||
}
|
||||
}
|
||||
@@ -68,24 +71,28 @@ mod tests {
|
||||
let mut house = create_test_house();
|
||||
house.print_status();
|
||||
assert_eq!(house.address, "Best street, 777");
|
||||
assert_eq!(house.get_address(), "Best street, 777");
|
||||
|
||||
assert_eq!(format!("{}", house.get_room(0).unwrap().get_device(0).unwrap().display()), "DEV:ThermA[ 20.0 ]");
|
||||
assert_eq!(
|
||||
format!("{}", house.get_room(0).unwrap().get_device(1).unwrap().display()),
|
||||
format!("{}", house.get_room("main").unwrap().get_device("ThermA").unwrap().display()),
|
||||
"DEV:ThermA[ 20.0 ]"
|
||||
);
|
||||
assert_eq!(
|
||||
format!("{}", house.get_room("main").unwrap().get_device("PSocA").unwrap().display()),
|
||||
"DEV:PSocA[ OFF : 0.0 ]"
|
||||
);
|
||||
assert_eq!(
|
||||
format!("{}", house.get_room(1).unwrap().get_device(0).unwrap().display()),
|
||||
format!("{}", house.get_room("bedroom").unwrap().get_device("PSocC").unwrap().display()),
|
||||
"DEV:PSocC[ ON : 11.1 ]"
|
||||
);
|
||||
|
||||
let Device::PowerSocket(powers_socket) = house.get_room_mut(0).unwrap().get_device_mut(1).unwrap() else {
|
||||
let Device::PowerSocket(powers_socket) = house.get_room_mut("main").unwrap().get_device_mut("PSocA").unwrap() else {
|
||||
unreachable!()
|
||||
};
|
||||
powers_socket.set_on(true);
|
||||
|
||||
assert_eq!(
|
||||
format!("{}", house.get_room(0).unwrap().get_device(1).unwrap().display()),
|
||||
format!("{}", house.get_room("main").unwrap().get_device("PSocA").unwrap().display()),
|
||||
"DEV:PSocA[ ON : 12.3 ]"
|
||||
);
|
||||
}
|
||||
@@ -93,6 +100,6 @@ mod tests {
|
||||
#[test]
|
||||
fn check_out_of_bounds() {
|
||||
let house = create_test_house();
|
||||
assert!(house.get_room(2).is_none());
|
||||
assert!(house.get_room("absent").is_none());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user