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`.
- [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
умного устройства.
- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
- [x] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
соответствующими ключами.

View File

@@ -2,6 +2,7 @@ mod device;
mod error;
mod house;
mod power_socket;
#[macro_use]
mod room;
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() {
let mut house = House::new(
[
(
"Hall".to_string(),
Room::new(
[
("PSocA".to_string(), PowerSocket::new(9.5, true).into()),
("ThermA".to_string(), Thermometer::new(20.1).into()),
]
.into_iter()
.collect(),
room!(
"PSocA" => PowerSocket::new(9.5, true),
"ThermA" => Thermometer::new(20.1),
),
),
(
"Main".to_string(),
Room::new(
[
("PSocB".to_string(), PowerSocket::new(11.2, true).into()),
("ThermB".to_string(), Thermometer::new(24.5).into()),
("PSocC".to_string(), PowerSocket::new(10.4, true).into()),
]
.into_iter()
.collect(),
room!(
"PSocB" => PowerSocket::new(11.2, true),
"ThermB" => Thermometer::new(24.5),
"PSocC" => PowerSocket::new(10.4, true),
),
),
(
"Bedroom".to_string(),
Room::new(
[
("ThermC".to_string(), Thermometer::new(19.3).into()),
("PSocD".to_string(), PowerSocket::new(12.1, true).into()),
]
.into_iter()
.collect(),
room!(
"ThermC" => Thermometer::new(19.3),
"PSocD" => PowerSocket::new(12.1, true),
),
),
]

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)]
mod tests {
use super::*;
use crate::{PowerSocket, Thermometer};
fn create_test_room() -> Room {
let devices = [
("PSoc".to_string(), PowerSocket::new(12.34, false).into()),
("Therm".to_string(), Thermometer::new(21.56).into()),
]
.into_iter()
.collect::<HashMap<String, Device>>();
Room::new(devices)
room!(
"PSoc" => PowerSocket::new(12.34, false),
"Therm" => Thermometer::new(21.56),
)
}
#[test]