From 38f5e62263628e711c14f5dc4c212333408db7ac Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Sat, 24 Jan 2026 12:41:11 +0300 Subject: [PATCH] homework: room macro --- smart-house/README.md | 2 +- smart-house/src/lib.rs | 1 + smart-house/src/main.rs | 34 +++++++++++----------------------- smart-house/src/room.rs | 20 +++++++++++++------- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/smart-house/README.md b/smart-house/README.md index ea115e7..e0e29d8 100644 --- a/smart-house/README.md +++ b/smart-house/README.md @@ -84,7 +84,7 @@ произошло. Тип ошибки должен реализовывать трейт `std::error::Error`. - [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект умного устройства. -- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ, +- [x] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ, объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с соответствующими ключами. diff --git a/smart-house/src/lib.rs b/smart-house/src/lib.rs index 8247aa6..e0b75f1 100644 --- a/smart-house/src/lib.rs +++ b/smart-house/src/lib.rs @@ -2,6 +2,7 @@ mod device; mod error; mod house; mod power_socket; +#[macro_use] mod room; mod thermometer; diff --git a/smart-house/src/main.rs b/smart-house/src/main.rs index 9181164..ddb4a9f 100644 --- a/smart-house/src/main.rs +++ b/smart-house/src/main.rs @@ -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), ), ), ] diff --git a/smart-house/src/room.rs b/smart-house/src/room.rs index a1a9fbb..2ac481e 100644 --- a/smart-house/src/room.rs +++ b/smart-house/src/room.rs @@ -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::>(); - Room::new(devices) + room!( + "PSoc" => PowerSocket::new(12.34, false), + "Therm" => Thermometer::new(21.56), + ) } #[test]