Задача
Создайте небольшую CLI-программу, которая масштабирует рецепт. Она получает путь к JSON-файлу с полями portions и ingredients, а также обязательный флаг --target с целым количеством желаемых порций. Каждый ингредиент содержит непустые name и unit и положительное quantity — конечное десятичное число. Пример структуры: объект с portions: 4 и массивом ингредиентов, где каждый элемент задаёт название, количество и единицу измерения. Порядок ингредиентов в исходном файле должен сохраниться.
Для каждого ингредиента рассчитайте новое количество как исходное количество, умноженное на целевое число порций и делённое на исходное число порций. Масштабируйте все величины одинаково: граммы остаются граммами, штуки остаются штуками, а округление количества не выполняется, поскольку это может изменить рецепт. Покажите в терминале название, новое количество, единицу и целевой размер рецепта. Допускайте дробные результаты и отображайте до трёх знаков после запятой, удаляя лишние конечные нули. Программа только читает входной файл и печатает результат; исходный файл не меняется.
Путь к файлу передаётся позиционным аргументом, путь и --target обязательны. Отклоняйте нечитаемый или некорректный JSON, отсутствующие поля, пустой список, пустые названия и единицы, неположительное исходное количество порций, ноль или отрицательное target, неположительное количество ингредиента и нечисловые/бесконечные величины. Ошибка должна содержать контекст, попадать в stderr и завершать программу ненулевым кодом. Не добавляйте базу данных, сетевые вызовы, каталог продуктов или преобразование единиц: задача учит чтению структурированных данных и арифметике.
Структура программы
Оставьте main.go чтение пути и флага, запуск преобразования и обработку ошибки. В отдельном файле package main разместите типы рецепта, проверку данных и функцию пересчёта количеств ингредиентов; в отдельной функции формируйте строки результата. Эти функции должны тестироваться без main и доступа к аргументам процесса.