homework: room macro

This commit is contained in:
4 changed files with 26 additions and 31 deletions

View File

@@ -84,7 +84,7 @@
произошло. Тип ошибки должен реализовывать трейт `std::error::Error`. произошло. Тип ошибки должен реализовывать трейт `std::error::Error`.
- [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект - [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
умного устройства. умного устройства.
- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ, - [x] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
соответствующими ключами. соответствующими ключами.

View File

@@ -2,6 +2,7 @@ mod device;
mod error; mod error;
mod house; mod house;
mod power_socket; mod power_socket;
#[macro_use]
mod room; mod room;
mod thermometer; mod thermometer;

View File

@@ -1,40 +1,28 @@
use smart_house::{Device, House, PowerSocket, Room, Thermometer}; use smart_house::{Device, House, PowerSocket, Room, Thermometer, room};
fn main() { fn main() {
let mut house = House::new( let mut house = House::new(
[ [
( (
"Hall".to_string(), "Hall".to_string(),
Room::new( room!(
[ "PSocA" => PowerSocket::new(9.5, true),
("PSocA".to_string(), PowerSocket::new(9.5, true).into()), "ThermA" => Thermometer::new(20.1),
("ThermA".to_string(), Thermometer::new(20.1).into()),
]
.into_iter()
.collect(),
), ),
), ),
( (
"Main".to_string(), "Main".to_string(),
Room::new( room!(
[ "PSocB" => PowerSocket::new(11.2, true),
("PSocB".to_string(), PowerSocket::new(11.2, true).into()), "ThermB" => Thermometer::new(24.5),
("ThermB".to_string(), Thermometer::new(24.5).into()), "PSocC" => PowerSocket::new(10.4, true),
("PSocC".to_string(), PowerSocket::new(10.4, true).into()),
]
.into_iter()
.collect(),
), ),
), ),
( (
"Bedroom".to_string(), "Bedroom".to_string(),
Room::new( room!(
[ "ThermC" => Thermometer::new(19.3),
("ThermC".to_string(), Thermometer::new(19.3).into()), "PSocD" => PowerSocket::new(12.1, true),
("PSocD".to_string(), PowerSocket::new(12.1, true).into()),
]
.into_iter()
.collect(),
), ),
), ),
] ]

View File

@@ -35,19 +35,25 @@ impl Room {
} }
} }
#[macro_export]
macro_rules! room {
($($key:expr => $dev:expr),* $(,)?) => {
Room::new([$(
($key.to_string(), $dev.into()),
)*].into_iter().collect())
};
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::{PowerSocket, Thermometer}; use crate::{PowerSocket, Thermometer};
fn create_test_room() -> Room { fn create_test_room() -> Room {
let devices = [ room!(
("PSoc".to_string(), PowerSocket::new(12.34, false).into()), "PSoc" => PowerSocket::new(12.34, false),
("Therm".to_string(), Thermometer::new(21.56).into()), "Therm" => Thermometer::new(21.56),
] )
.into_iter()
.collect::<HashMap<String, Device>>();
Room::new(devices)
} }
#[test] #[test]