# Учебная библиотека "Умный дом" Демонстрационная библиотека для выполнения домашних заданий. ## ДЗ 2025-12-16 Заготовка для библиотеки "Умный дом". ### Цель: Создать заготовку для библиотеки «Умный дом» и напишите пример, демонстрирующий её функционал. ### Срок: Сдать до: **2026-01-19** ### Описание/Пошаговая инструкция выполнения домашнего задания: Библиотека и пример использования реализованы в одном package. Для библиотеки: - [x] Реализована в виде lib крейта. - [x] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал: - [x] Конструктор, принимающий значения полей. - [x] Возвращать значение текущей температуры (произвольное число). - [x] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал: - [x] Конструктор, принимающий значения полей. - [x] Включение/выключение + возможность узнать текущее состояние. - [x] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число. - [x] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал: - [x] Выводить в стандартный вывод сообщение о состоянии устройства. - [x] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал: - [x] Конструктор, принимающий массив устройств. - [x] Можно получить ссылку на устройство по указанному индексу. - [x] Можно получить мутабельную ссылку на устройство по указанному индексу. - [x] Выводить в стандартный вывод отчёт о всех устройствах в комнате. - [x] Опишите тип: умный дом, содержащий массив комнат. Тип должен предоставлять следующий функционал: - [x] Конструктор, принимающий массив комнат. - [x] Можно получить ссылку на комнату по указанному индексу. - [x] Можно получить мутабельную ссылку на комнату по указанному индексу. - [x] Выводить в стандартный вывод отчёт о всех комнатах. - Размеры массивов можно выбрать произвольно. - В случае, если указан индекс, выходящий за пределы массива, приложение должно аварийно завершаться (макрос `panic!()`). Для примера использования: - [x] Реализована в виде bin крейта. - [x] Создайте экземпляр умного дома и выведете отчёт о его содержимом. - [x] Для уже созданного экземпляра дома выключите умную розетку в одной из комнат. Снова выведите отчёт. **Критерии оценки**: - Package успешно собирается. - Приложение-пример успешно выполняется и выводит отчёт о доме. - Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений. - Присутствуют и успешно выполняются модульные тесты. ## ДЗ 2026-01-20 Дорабатываем умный дом ### Цель: Дорабатываем функционал умного дома, используя возможности стандартной библиотеки. ### Срок: Сдать до: **2026-02-11** ### Описание/Пошаговая инструкция выполнения домашнего задания: Добавить обработку ошибок: - [x] Заменить паники на возврат Option в методах получения комнаты по ключу. - [x] Заменить паники на возврат Option в методах получения устройства по ключу. Доработать хранение объектов: - [x] Заменить массивы устройств и комнат на ассоциативные коллекции из std. В качестве ключей использовать строки. - [x] Реализовать трейт Debug на всех типах. - [ ] Добавить возможность динамически добавлять/удалять устройства в комнату. - [ ] Добавить возможность динамически добавлять/удалять комнату в дом. - [ ] Добавить в тип умного дома метод, позволяющий сразу получить ссылку на умное устройство. Метод принимает имя комнаты и имя устройства. В случае, если устройство или комната не найдены, возвращать тип ошибки, сообщающий, что именно произошло. Тип ошибки должен реализовывать трейт `std::error::Error`. - [ ] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект умного устройства. - [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ, объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с соответствующими ключами. Доработать формирование отчёта: - [ ] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство, комната, дом. Привести тесты в соответствие с новым функционалом. Доработать приложение-пример: - [ ] Продемонстрировать возможность динамического добавления/удаления комнат. - [ ] Продемонстрировать возможность динамического добавления/удаления устройств. - [ ] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме, отдельной комнате, отдельном устройстве. - [ ] Продемонстрировать возможность обработки ошибок. **Критерии оценки**: - Package успешно собирается. - Приложение-пример успешно выполняется и выводит отчёт о доме. - Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений. - Присутствуют и успешно выполняются модульные тесты.