Требования
Разработайте 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 и реального хранилища.