From 519f625f9b1b68cdca43b909d34fea4a2ae0abd7 Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Sat, 24 Jan 2026 12:48:39 +0300 Subject: [PATCH] homework: extract print_status into a separate trait --- smart-house/README.md | 2 +- smart-house/src/device.rs | 11 +++++++---- smart-house/src/house.rs | 6 ++++-- smart-house/src/lib.rs | 2 ++ smart-house/src/main.rs | 2 +- smart-house/src/print_status.rs | 3 +++ smart-house/src/room.rs | 6 ++++-- 7 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 smart-house/src/print_status.rs diff --git a/smart-house/README.md b/smart-house/README.md index e0e29d8..6f917e8 100644 --- a/smart-house/README.md +++ b/smart-house/README.md @@ -89,7 +89,7 @@ соответствующими ключами. Доработать формирование отчёта: -- [ ] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство, +- [x] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство, комната, дом. Привести тесты в соответствие с новым функционалом. diff --git a/smart-house/src/device.rs b/smart-house/src/device.rs index 73f9910..097614b 100644 --- a/smart-house/src/device.rs +++ b/smart-house/src/device.rs @@ -1,3 +1,4 @@ +use crate::PrintStatus; use std::fmt::Display; #[derive(Debug)] @@ -17,10 +18,6 @@ impl Device { } } } - - pub fn print_status(&self) { - println!("{}", self.display()); - } } impl From for Device { @@ -35,6 +32,12 @@ impl From for Device { } } +impl PrintStatus for Device { + fn print_status(&self) { + println!("{}", self.display()); + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/smart-house/src/house.rs b/smart-house/src/house.rs index a2e563d..6065d67 100644 --- a/smart-house/src/house.rs +++ b/smart-house/src/house.rs @@ -1,4 +1,4 @@ -use crate::{Device, Error, Room}; +use crate::{Device, Error, PrintStatus, Room}; use std::collections::HashMap; #[derive(Debug)] @@ -36,8 +36,10 @@ impl House { }; Ok(device) } +} - pub fn print_status(&self) { +impl PrintStatus for House { + fn print_status(&self) { for (room_name, room) in self.rooms.iter() { println!("{}:", room_name); println!("{}", "-".repeat(32)); diff --git a/smart-house/src/lib.rs b/smart-house/src/lib.rs index e0b75f1..0171d36 100644 --- a/smart-house/src/lib.rs +++ b/smart-house/src/lib.rs @@ -4,11 +4,13 @@ mod house; mod power_socket; #[macro_use] mod room; +mod print_status; mod thermometer; pub use device::Device; pub use error::Error; pub use house::House; pub use power_socket::PowerSocket; +pub use print_status::PrintStatus; pub use room::Room; pub use thermometer::Thermometer; diff --git a/smart-house/src/main.rs b/smart-house/src/main.rs index ddb4a9f..afbe50c 100644 --- a/smart-house/src/main.rs +++ b/smart-house/src/main.rs @@ -1,4 +1,4 @@ -use smart_house::{Device, House, PowerSocket, Room, Thermometer, room}; +use smart_house::{Device, House, PowerSocket, PrintStatus, Room, Thermometer, room}; fn main() { let mut house = House::new( diff --git a/smart-house/src/print_status.rs b/smart-house/src/print_status.rs new file mode 100644 index 0000000..3f06159 --- /dev/null +++ b/smart-house/src/print_status.rs @@ -0,0 +1,3 @@ +pub trait PrintStatus { + fn print_status(&self); +} diff --git a/smart-house/src/room.rs b/smart-house/src/room.rs index 2ac481e..5a36303 100644 --- a/smart-house/src/room.rs +++ b/smart-house/src/room.rs @@ -1,4 +1,4 @@ -use crate::Device; +use crate::{Device, PrintStatus}; use std::collections::HashMap; #[derive(Debug)] @@ -26,8 +26,10 @@ impl Room { pub fn remove_device(&mut self, name: &str) -> Option { self.devices.remove(name) } +} - pub fn print_status(&self) { +impl PrintStatus for Room { + fn print_status(&self) { for (name, device) in self.devices.iter() { print!("{} => ", name); device.print_status();