0.1.5-dev

config[map] added for kept existing config
This commit is contained in:
2025-09-09 06:30:41 +03:00
parent a02209c698
commit e9fa4f30e1

57
main.go
View File

@@ -28,15 +28,17 @@ const (
// Глобальная переменная для пути вывода. Это позволяет подменять ее в тестах. // Глобальная переменная для пути вывода. Это позволяет подменять ее в тестах.
var ( var (
outputDir = "date" outputDir = "date"
version = "0.1.4-dev" version = "0.1.5-dev"
) )
// --- СТРУКТУРЫ ДЛЯ ПАРСИНГА КОНФИГУРАЦИОННЫХ ФАЙЛОВ --- // --- СТРУКТУРЫ ДЛЯ ПАРСИНГА КОНФИГУРАЦИОННЫХ ФАЙЛОВ ---
// ConfigFile используется для чтения секции "shtrih" из connect.json.
// Остальные секции файла игнорируются при чтении, но сохраняются при записи.
type ConfigFile struct { type ConfigFile struct {
Timeout int `json:"timeout_to_ip_port"` // Если ключ "shtrih" в JSON отсутствует, это поле будет nil.
Shtrih []ConnectionSettings `json:"shtrih"` // Если ключ есть, но массив пуст (shtrih: []), поле будет пустым срезом.
Atol []interface{} `json:"atol"` Shtrih []ConnectionSettings `json:"shtrih"`
} }
type ConnectionSettings struct { type ConnectionSettings struct {
@@ -435,30 +437,33 @@ func saveNewMergedInfo(kktInfo *shtrih.FiscalInfo, wsData map[string]interface{}
} }
// saveEmptyShtrihConfig создает или обновляет connect.json, указывая, // saveEmptyShtrihConfig создает или обновляет connect.json, указывая,
// что устройства "Штрих-М" не были найдены. Это предотвращает повторные // что устройства "Штрих-М" не были найдены. Функция работает неразрушающим
// полные сканирования при последующих запусках. // образом, сохраняя все остальные данные в файле.
func saveEmptyShtrihConfig() { func saveEmptyShtrihConfig() {
log.Printf("Сохраняю конфигурацию с пустым списком устройств Штрих-М в '%s'...", configFileName) log.Printf("Сохраняю конфигурацию с пустым списком устройств Штрих-М в '%s'...", configFileName)
var configFile ConfigFile
// Пытаемся прочитать существующий файл, чтобы не затереть другие секции (например, 'atol'). // Используем map[string]interface{} для редактирования JSON.
configMap := make(map[string]interface{})
// Пытаемся прочитать существующий файл, чтобы не затереть другие секции.
data, err := os.ReadFile(configFileName) data, err := os.ReadFile(configFileName)
if err == nil { if err == nil {
if err := json.Unmarshal(data, &configFile); err != nil { // Если файл есть, парсим его в нашу карту.
if err := json.Unmarshal(data, &configMap); err != nil {
log.Printf("Предупреждение: файл '%s' поврежден (%v). Он будет перезаписан.", configFileName, err) log.Printf("Предупреждение: файл '%s' поврежден (%v). Он будет перезаписан.", configFileName, err)
// В случае ошибки парсинга, начинаем с пустой структуры, чтобы исправить файл. // В случае ошибки парсинга, начинаем с пустой карты, чтобы исправить файл.
configFile = ConfigFile{} configMap = make(map[string]interface{})
} }
} else if !os.IsNotExist(err) { } else if !os.IsNotExist(err) {
// Логируем ошибку, если это не "файл не найден". // Логируем ошибку, если это не "файл не найден".
log.Printf("Предупреждение: не удалось прочитать '%s' (%v). Файл будет создан заново.", configFileName, err) log.Printf("Предупреждение: не удалось прочитать '%s' (%v). Файл будет создан заново.", configFileName, err)
} }
// Устанавливаем пустой срез для 'shtrih'. // Устанавливаем или обновляем только ключ 'shtrih'.
configFile.Shtrih = []ConnectionSettings{} configMap["shtrih"] = []ConnectionSettings{}
// Маршалинг и запись обратно в файл. // Маршалинг и запись обратно в файл.
updatedData, err := json.MarshalIndent(configFile, "", " ") updatedData, err := json.MarshalIndent(configMap, "", " ")
if err != nil { if err != nil {
log.Printf("Ошибка: не удалось преобразовать пустую конфигурацию в JSON: %v", err) log.Printf("Ошибка: не удалось преобразовать пустую конфигурацию в JSON: %v", err)
return return
@@ -472,20 +477,34 @@ func saveEmptyShtrihConfig() {
func saveConfiguration(polledDevices []PolledDevice) { func saveConfiguration(polledDevices []PolledDevice) {
log.Printf("Сохранение %d найденных конфигураций в файл '%s'...", len(polledDevices), configFileName) log.Printf("Сохранение %d найденных конфигураций в файл '%s'...", len(polledDevices), configFileName)
var configFile ConfigFile
// Используем map[string]interface{} для неразрушающего редактирования JSON.
configMap := make(map[string]interface{})
// Пытаемся прочитать существующий файл, чтобы не затереть другие секции.
data, err := os.ReadFile(configFileName) data, err := os.ReadFile(configFileName)
if err == nil { if err == nil {
if err := json.Unmarshal(data, &configFile); err != nil { // Если файл есть, парсим его в нашу карту.
if err := json.Unmarshal(data, &configMap); err != nil {
log.Printf("Предупреждение: файл '%s' поврежден (%v). Он будет перезаписан.", configFileName, err) log.Printf("Предупреждение: файл '%s' поврежден (%v). Он будет перезаписан.", configFileName, err)
configFile = ConfigFile{} // В случае ошибки парсинга, начинаем с пустой карты.
configMap = make(map[string]interface{})
} }
} else if !os.IsNotExist(err) {
log.Printf("Предупреждение: не удалось прочитать '%s' (%v). Файл будет создан заново.", configFileName, err)
} }
// Готовим новый срез с настройками для устройств Штрих-М.
var newShtrihSettings []ConnectionSettings var newShtrihSettings []ConnectionSettings
for _, pd := range polledDevices { for _, pd := range polledDevices {
newShtrihSettings = append(newShtrihSettings, convertConfigToSettings(pd.Config)) newShtrihSettings = append(newShtrihSettings, convertConfigToSettings(pd.Config))
} }
configFile.Shtrih = newShtrihSettings
updatedData, err := json.MarshalIndent(configFile, "", " ") // Обновляем в карте только ключ 'shtrih'. Все остальные ключи остаются нетронутыми.
configMap["shtrih"] = newShtrihSettings
// Маршалинг и запись обратно в файл.
updatedData, err := json.MarshalIndent(configMap, "", " ")
if err != nil { if err != nil {
log.Printf("Ошибка: не удалось преобразовать конфигурацию в JSON: %v", err) log.Printf("Ошибка: не удалось преобразовать конфигурацию в JSON: %v", err)
return return