Репозиторий содержит выполненные ДЗ на курсе OTUS Rust Developer. Professional. Номера ДЗ идут по порядку, в скобках номер урока, в котором оно было задано
Создадите заготовку для библиотеки «Умный дом» и напишите пример, демонстрирующий её функционал.
Библиотека и пример использования реализованы в одном package.
Для библиотеки:
- Реализована в виде lib крейта.
- Опишите тип: умный термометр. Тип должен предоставлять следующий функционал:
- Конструктор, принимающий значения полей.
- Возвращать значение текущей температуры (произвольное число).
- Опишите тип: умная розетка. Тип должен предоставлять следующий функционал:
- Конструктор, принимающий значения полей.
- Включение/выключение + возможность узнать текущее состояние.
- Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
- Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
- Выводить в стандартный вывод сообщение о состоянии устройства.
- Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
- Конструктор, принимающий массив устройств.
- Можно получить ссылку на устройство по указанному индексу.
- Можно получить мутабельную ссылку на устройство по указанному индексу.
- Выводить в стандартный вывод отчёт о всех устройствах в комнате.
- Опишите тип: умный дом, содержащий массив комнат. Тип должен предоставлять следующий функционал:
- Конструктор, принимающий массив комнат.
- Можно получить ссылку на комнату по указанному индексу.
- Можно получить мутабельную ссылку на комнату по указанному индексу.
- Выводить в стандартный вывод отчёт о всех комнатах.
- Размеры массивов можно выбрать произвольно.
- В случае, если указан индекс, выходящий за пределы массива, приложение должно аварийно завершаться (макрос
panic!()).
Для примера использования:
- Реализована в виде bin крейта.
- Создайте экземпляр умного дома и выведете отчёт о его содержимом.
- Для уже созданного экземпляра дома выключите умную розетку в одной из комнат. Снова выведите отчёт.
- Package успешно собирается.
- Приложение-пример успешно выполняется и выводит отчёт о доме.
- Команды
cargo clippyиcargo fmt --checkне выводят ошибок и предупреждений. - Присутствуют и успешно выполняются модульные тесты.
Дорабатываем функционал умного дома, используя возможности стандартной библиотеки.
- Добавить обработку ошибок:
- Заменить паники на возврат Option в методах получения комнаты по ключу.
- Заменить паники на возврат Option в методах получения устройства по ключу.
- Доработать хранение объектов:
- Заменить массивы устройств и комнат на ассоциативные коллекции из std. В качестве ключей использовать строки.
- Реализовать трейт Debug на всех типах.
- Добавить возможность динамически добавлять/удалять устройства в комнату.
- Добавить возможность динамически добавлять/удалять комнату в дом.
- Добавить в тип умного дома метод, позволяющий сразу получить ссылку на умное устройство. Метод принимает имя комнаты и имя устройства. В случае, если устройство или комната не найдены, возвращать тип ошибки, сообщающий, что именно произошло. Тип ошибки должен реализовывать трейт std::error::Error.
- Добавить реализации трейта From, позволяющие преобразовывать объекты умной розетки и умного термометра в объект умного устройства.
- Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ, объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с соответствующими ключами.
- Доработать формирование отчёта:
- Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство, комната, дом.
- Привести тесты в соответствие с новым функционалом.
- Доработать приложение-пример:
- Продемонстрировать возможность динамического добавления/удаления комнат.
- Продемонстрировать возможность динамического добавления/удаления устройств.
- Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме, отдельной комнате, отдельном устройстве.
- Продемонстрировать возможность обработки ошибок.
- Package успешно собирается.
- Приложение-пример успешно выполняется и выводит отчёт о доме.
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
- Присутствуют и успешно выполняются модульные тесты.
Описать для умной розетки и умного термометра логику взаимодействия с удалённым устройством и написать имитаторы устройств для тестирования.
- Для типа умной розетки:
- Функционал не изменяется: включение/выключение + запрос мощности.
- Взаимодействие организовано синхронно, через TCP.
- Розетка может использовать как реальный TCP-обмен, так и имитировать реальную работу (для тестов).
- Для имитатора умной розетки:
- Читает адрес для приёма TCP-соединений из аргументов командной строки.
- Реализован с использованием неблокирующего сетевого взаимодействия.
- Хранит состояние розетки.
- Позволяет управлять розеткой множеству клиентов одновременно.
- Для умного термометра:
- Функционал не изменяется: возвращает температуру.
- Получает значения температуры в виде UDP-пакетов в параллельном потоке.
- Параллельный поток запускается при создании объекта термометра и завершается при уничтожении этого объекта.
- Объект термометра возвращает последнее полученное значение температуры.
- Термометр может имитировать удалённое получение данных о температуре (для тестов).
- Для имитатора умного термометра:
- Реализован с использованием неблокирующего сетевого взаимодействия.
- Читает адрес для отправки UDP-пакетов и временной период отправки из файла.
- Отправляет произвольное значение температуры на указанный адрес с указанной периодичностью.
- Добавлен дополнительный пример умного дома с розетками и термометрами, которые работают с имитаторами. Данный пример должен запускаться и:
- Выводить отчёт о состоянии дома, если имитаторы запущены.
- Сообщать об ошибке, если устройству не удалось получить данные.
- Package успешно собирается.
- Приложение-пример успешно выполняется.
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
- Присутствуют и успешно выполняются модульные тесты.