add Room struct

This commit is contained in:
3 changed files with 91 additions and 5 deletions

View File

@@ -30,11 +30,11 @@
- [x] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
- [x] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
- [x] Выводить в стандартный вывод сообщение о состоянии устройства.
- [ ] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
- [ ] Конструктор, принимающий массив устройств.
- [ ] Можно получить ссылку на устройство по указанному индексу.
- [ ] Можно получить мутабельную ссылку на устройство по указанному индексу.
- [ ] Выводить в стандартный вывод отчёт о всех устройствах в комнате.
- [x] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий массив устройств.
- [x] Можно получить ссылку на устройство по указанному индексу.
- [x] Можно получить мутабельную ссылку на устройство по указанному индексу.
- [x] Выводить в стандартный вывод отчёт о всех устройствах в комнате.
- [ ] Опишите тип: умный дом, содержащий массив комнат. Тип должен предоставлять следующий функционал:
- [ ] Конструктор, принимающий массив комнат.
- [ ] Можно получить ссылку на комнату по указанному индексу.

View File

@@ -1,5 +1,6 @@
mod device;
mod power_socket;
mod room;
mod thermometer;
pub use device::Device;

85
smart-house/src/room.rs Normal file
View File

@@ -0,0 +1,85 @@
#![allow(unused)]
use crate::Device;
pub struct Room {
name: String,
devices: Box<[Device]>,
}
impl Room {
pub fn new(name: impl AsRef<str>, devices: Box<[Device]>) -> Self {
Self {
name: name.as_ref().to_string(),
devices,
}
}
fn check_bounds(&self, idx: usize) {
if idx >= self.devices.len() {
panic!("Index is out of bounds")
}
}
pub fn get_device(&self, idx: usize) -> &Device {
self.check_bounds(idx);
&self.devices[idx]
}
pub fn get_device_mut(&mut self, idx: usize) -> &mut Device {
self.check_bounds(idx);
&mut self.devices[idx]
}
pub fn print_status(&self) {
println!("{}", "=".repeat(16));
println!("{}:", self.name);
println!("{}", "-".repeat(16));
for d in self.devices.iter() {
d.print_status();
}
println!("{}", "=".repeat(16));
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{PowerSocket, Thermometer};
#[test]
fn smoke_test() {
let devices = Box::new([
Device::PowerSocket(PowerSocket::new(12.34, false)),
Device::Thermometer(Thermometer::new(21.56)),
]);
let mut room = Room::new("test_room", devices);
assert_eq!(room.name, "test_room");
room.print_status();
assert_eq!(format!("{}", room.get_device(0).display()), "DEV:PowerSocket[ OFF : 0.0 ]");
assert_eq!(format!("{}", room.get_device(1).display()), "DEV:Thermometer[ 21.6 ]");
let power_socket = match room.get_device_mut(0) {
Device::PowerSocket(ps) => ps,
_ => unreachable!(),
};
power_socket.set_on(true);
assert_eq!(format!("{}", room.get_device(0).display()), "DEV:PowerSocket[ ON : 12.3 ]");
assert_eq!(format!("{}", room.get_device(1).display()), "DEV:Thermometer[ 21.6 ]");
}
#[test]
#[should_panic(expected = "Index is out of bounds")]
fn panic_test() {
let room = Room::new(
"test_room",
Box::new([
Device::PowerSocket(PowerSocket::new(12.34, false)),
Device::Thermometer(Thermometer::new(21.56)),
]),
);
room.check_bounds(2);
}
}