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