Данное задание нацелено на определение примерного уровня вашей прошаренности и обязательно для выполнения всем желающим вступить в секту. Есть 4 варианта задания: Intern, Junior, Middle и Senior, каждый вариант, очевидно, сложнее предыдущего. Для вступления обязательно выполнить хотя бы Intern, однако имеет смысл делать более сложные варианты, если претендуете на соответствующий уровень.
- Проект должен быть выполнен на C++17;
- Приветствуется использование фич современных плюсов (к примеру, std::filesystem), а также ООП;
- Выполненное задание требуется залить на свой Github;
- Запрещено использовать сторонние библиотеки (Boost и пр.).
Необходимо разработать упрощённый вариант Text Report System для создания параметризованных текстовых отчётов.
Шаблон отчёта – это простой текстовый файл. Проблему локализации можно не решать, считая, что весь текст у нас на английском языке. В этом файле в произвольном тексте размещены параметры в виде следующей конструкции:
Text {parameter1} text {parameter2} text {*parameter3}
Можно считать, что символы “{}” никогда не появляются в произвольном тексте.
Обязательные параметры отмечаются символом “*”. Обязательным является тот параметр, без значения которого отчёт генерироваться не должен. Для обязательных текстовых параметров их значение должно присутствовать в файле, содержащем значения текстовых параметров. Если параметр не является обязательным и его значение не удалось получить — в отчёт подставляется пустая строка.
Ниже приведён пример шаблона отчёта:
Dear {*user_name},
Thank you very much for choosing the services of our company!
Your order number {*order_number} will be delivered in 10 working days after {current_date}.
Sincerely yours,
Online store administration.
- Файл с шаблоном отчёта;
- Файл, содержащий значения текстовых параметров (каждый i-й параметр находится на i-й строчке).
- Файл со сгенерированным отчётом (отчёт можно просто выводить на экран).
- Файл с шаблоном отчёта;
- JSON/XML-файл (на выбор), содержащий значения текстовых параметров. Формат этого файла произвольный и подразумевается, что ошибок форматирования в нём не будет.
- В зависимости от аргументов командной строки:
- "-f" – файл со сгенерированным отчётом;
- "-c" – вывод сгенерированного отчёта в консоль.
Параметры отчёта могут быть двух видов:
- Текстовые параметры. В этом случае для работы с ними достаточно совпадения имени параметра в файле шаблона отчёта и в JSON/XML-файле без учёта регистра.
- Функциональные параметры. Представляют собой результат вызова предопределённой функции. Допустимы только зарегистрированные в программе имена подобных параметров, каждому из которых соответствует вызов определённой функции. При попадании имени функционального параметра в JSON/XML-файл должна генерироваться ошибка. (В рамках тестового задания должна быть реализована только одна функция, возвращающая current_date. Формат даты и времени произвольный).
Те же, что у Junior.
Те же, что у Junior + лог-файл, содержащий сообщения об ошибках и записи об успешной генерации отчёта.
Как часть проекта необходимо разработать класс, реализующий функциональность логирования. Для упрощения, лог сообщения и ошибки могут выводиться на экран. Логируется факт успешной генерации отчёта и перечисленные ниже ошибки:
- Если в процессе генерации отчёта любой из обязательных параметров не получил значения;
- Если имя зарегистрированного функционального параметра попало в JSON/XML-файл;
- Если вызов функции, инициированный функциональным параметром привёл к её внутреннему исключению;
- Ошибка чтения файла отчёта;
- Ошибка чтения JSON/XML-файла.
При возникновении любой из этих ошибок отчёт не создаётся.
- Сборка проекта осуществляется через CMake;
- Необходимо разработать структуру данных для хранения параметров в памяти и регистрации функциональных параметров (см. Типы параметров отчёта).
На этом уровне необходимо построить клиент-серверное приложение (на сокетах):
Передаёт JSON/XML-файл с параметрами в виде строки на сервер и получает сгенерированный сервером отчёт.
Хранит произвольный шаблон отчёта, принимает строку с JSON/XML-файлом и отправляет сгенерированный отчёт либо лог с ошибкой.
- Те же, что у Middle;
- Работа с сокетами асинхронная (допускается использование библиотеки libevent);
- Сильно поощряется наличие кроссплатформенности, приветствуется написание кода для UNIX-подобных ОС.