← Все проекты уровня 3
Уровень 3 · Личные каталогиВариант C

Учёт вещей

Учитывайте домашние вещи по месту хранения и находите нужный предмет по названию или категории.

Техническое задание

Требования

Разработайте CLI для учёта вещей с командами add, list, update, delete и find. Запись включает уникальный ID, название, категорию, место хранения, количество, дату покупки в формате YYYY-MM-DD (необязательно), состояние: good, worn или broken, и заметку. Название, категория и место хранения обязательны; количество — положительное целое. ID создаётся программой при добавлении и должен сохраняться между запусками. Find выполняет поиск подстроки без учёта регистра по названию, категории, месту хранения и заметке. List фильтруется по --category, --location и --condition; несколько фильтров применяются одновременно.

Данные хранятся в JSON-файле, путь задаётся флагом --data, значение по умолчанию inventory.json в текущей директории. List сортирует записи сначала по месту хранения, затем по названию без учёта регистра, затем по ID. Update требует --id, принимает только заданные поля, а затем проверяет итоговое состояние целиком. Удаление требует --id; если записи с таким ID нет, возвращается ошибка, а файл не меняется. Удобство перемещения вещи обеспечивается сменой поля location без создания новой записи.

При отсутствии файла команда чтения показывает пустой список, а первая успешная запись создаёт хранилище. Перед каждым изменением загрузите и проверьте JSON и уникальность ID; сохраняйте изменённый документ атомарной заменой файла. Ошибка чтения, записи или повреждённая структура должна остановить изменение. В частности, нельзя молча создать пустой каталог поверх испорченных данных. Выведите понятные диагностики в stderr и ненулевой код для ошибок. Не делайте веб-интерфейс, синхронизацию и управление складскими партиями. README должен описывать команды и поля, тесты используют временные директории.

Структура программы

Разместите модель вещи, валидацию, поиск, фильтры и сортировку в internal/inventory. Чтение, проверку целостности JSON и атомарное сохранение сосредоточьте в отдельной части хранения; main.go связывает операцию с хранилищем и форматирует ответ. Возвращайте ошибки вверх. Тестируйте правила каталога без CLI и реального хранилища.

Критерии готовности

Ожидаемый результат

Предоставьте запускаемый Go-модуль, CLI, README со схемой хранилища и примерами команд, а также тесты для фильтров и JSON-операций. Каждая команда list должна иметь стабильную сортировку, чтобы пользователь мог сравнивать выдачу. Операции не требуют сети и не запускают фоновых процессов.

Критерии приёмки:

  • README описывает правила каталога отдельно от хранения; тесты используют временный файл.
  • пустое хранилище при первом list не вызывает ошибку;
  • add создаёт уникальную запись;
  • фильтры категории и места применяются вместе;
  • find ищет без учёта регистра;
  • update меняет место хранения, оставляя остальные поля;
  • delete неизвестного ID не меняет файл. Нулевое количество, неизвестный статус, невозможная дата покупки и повреждённый JSON дают ошибку. После успешного изменения данные читаются повторным запуском, а сломанный исходный JSON сохраняет исходные байты.

Для ориентира

Примеры входа и результата

Добавьте предмет «Зонт» категории «Сезонное», место «Прихожая», количество 1 и состояние good; команда выводит его ID. Команда list --location Прихожая показывает зонт, а find --query зонт находит его независимо от регистра.