From 2ba393f3bd4186e7d7134f25dfaf503d4cee7257 Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Sat, 24 Jan 2026 13:45:55 +0300 Subject: [PATCH] homework: demo --- smart-house/README.md | 8 +-- smart-house/src/main.rs | 105 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 105 insertions(+), 8 deletions(-) diff --git a/smart-house/README.md b/smart-house/README.md index 6f917e8..adbfbe5 100644 --- a/smart-house/README.md +++ b/smart-house/README.md @@ -95,11 +95,11 @@ Привести тесты в соответствие с новым функционалом. Доработать приложение-пример: -- [ ] Продемонстрировать возможность динамического добавления/удаления комнат. -- [ ] Продемонстрировать возможность динамического добавления/удаления устройств. -- [ ] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме, +- [x] Продемонстрировать возможность динамического добавления/удаления комнат. +- [x] Продемонстрировать возможность динамического добавления/удаления устройств. +- [x] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме, отдельной комнате, отдельном устройстве. -- [ ] Продемонстрировать возможность обработки ошибок. +- [x] Продемонстрировать возможность обработки ошибок. **Критерии оценки**: diff --git a/smart-house/src/main.rs b/smart-house/src/main.rs index afbe50c..48d7356 100644 --- a/smart-house/src/main.rs +++ b/smart-house/src/main.rs @@ -1,7 +1,26 @@ use smart_house::{Device, House, PowerSocket, PrintStatus, Room, Thermometer, room}; fn main() { - let mut house = House::new( + let mut house = create_house_demo(); + + switch_off_power_socket_in_hall_demo(&mut house); + + add_new_room_in_house_demo(&mut house); + + add_power_socket_to_closet_room_demo(&mut house); + + remove_thermometer_from_closet_room_demo(&mut house); + + remove_closet_room_demo(&mut house); + + searching_devices_in_house_demo(&house); + + universal_printing_function_demo(&house); +} + +fn create_house_demo() -> House { + println!("# Create new smart house"); + let house = House::new( [ ( "Hall".to_string(), @@ -29,9 +48,11 @@ fn main() { .into_iter() .collect(), ); - house.print_status(); + house +} +fn switch_off_power_socket_in_hall_demo(house: &mut House) { print!("# Switching off a power socket in Hall... "); let Device::PowerSocket(power_socket) = house.get_room_mut("Hall").unwrap().get_device_mut("PSocA").unwrap() else { println!("FAILED!"); @@ -39,7 +60,83 @@ fn main() { }; power_socket.set_on(false); println!("SUCCESS"); - println!(); - house.print_status(); } + +fn add_new_room_in_house_demo(house: &mut House) { + println!("# Add new room into house"); + house.insert_room( + "Closet", + room!( + "ThermD" => Thermometer::new(9.5) + ), + ); + house.print_status(); +} + +fn add_power_socket_to_closet_room_demo(house: &mut House) { + println!("# Add power socket to 'Closet' room"); + house.get_room_mut("Closet").unwrap().insert_device("PSocE", PowerSocket::new(8.0, true).into()); + house.print_status(); +} + +fn remove_thermometer_from_closet_room_demo(house: &mut House) { + print!("# Removing thermometer from 'Closet' room... "); + let Some(_) = house.get_room_mut("Closet").unwrap().remove_device("ThermD") else { + println!("FAILED!"); + return; + }; + println!("SUCCESS"); + house.print_status(); +} + +fn remove_closet_room_demo(house: &mut House) { + print!("# Removing 'Closet' room... "); + let Some(_) = house.remove_room("Closet") else { + println!("FAILED!"); + return; + }; + println!("SUCCESS"); + house.print_status(); +} + +fn searching_devices_in_house_demo(house: &House) { + println!("# Searching dummy device in empty room"); + find_device_handling_errors_demo(house, "empty", "dummy"); + + println!("# Searching dummy device in Bedroom"); + find_device_handling_errors_demo(house, "Bedroom", "dummy"); + + println!("# Searching ThermA device in Hall room"); + find_device_handling_errors_demo(house, "Hall", "ThermA"); + + println!(); +} + +fn find_device_handling_errors_demo(house: &House, room: &str, device: &str) { + match house.get_device(room, device) { + Err(error) => { + println!("FAIL. Error: {:?}", error); + } + Ok(device) => { + print!("SUCCESS. Device found: "); + device.print_status(); + } + } +} + +fn universal_printing_function_demo(house: &House) { + println!("# Print house using universal function"); + print_status(house); + + println!("# Print Main room using universal function"); + print_status(house.get_room("Main").unwrap()); + + println!(); + println!("# Print PSocC device from Main room using universal function"); + print_status(house.get_device("Main", "PSocC").unwrap()); +} + +fn print_status(printable: &impl PrintStatus) { + printable.print_status(); +}