homework: room macro
This commit is contained in:
@@ -84,7 +84,7 @@
|
||||
произошло. Тип ошибки должен реализовывать трейт `std::error::Error`.
|
||||
- [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
|
||||
умного устройства.
|
||||
- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
|
||||
- [x] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
|
||||
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
|
||||
соответствующими ключами.
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ mod device;
|
||||
mod error;
|
||||
mod house;
|
||||
mod power_socket;
|
||||
#[macro_use]
|
||||
mod room;
|
||||
mod thermometer;
|
||||
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user