package transportcfg import ( "encoding/json" "os" "path/filepath" "sort" "strings" ) func NormalizeSecretUpdates(in map[string]string) map[string]string { if in == nil { return nil } out := make(map[string]string, len(in)) for k, v := range in { key := strings.TrimSpace(k) if key == "" { continue } out[key] = v } return out } func CloneStringMap(in map[string]string) map[string]string { if len(in) == 0 { return nil } out := make(map[string]string, len(in)) for k, v := range in { out[k] = v } return out } func EqualStringMap(a, b map[string]string) bool { if len(a) != len(b) { return false } for k, av := range a { if bv, ok := b[k]; !ok || av != bv { return false } } return true } func MaskStringMap(in map[string]string, mask string) map[string]string { if len(in) == 0 { return nil } keys := make([]string, 0, len(in)) for k := range in { keys = append(keys, k) } sort.Strings(keys) out := make(map[string]string, len(keys)) for _, k := range keys { out[k] = mask } return out } func ReadStringMapJSON(path string) (map[string]string, error) { data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { return map[string]string{}, nil } return nil, err } var raw map[string]string if err := json.Unmarshal(data, &raw); err != nil { return nil, err } return NormalizeSecretUpdates(raw), nil } func WriteStringMapJSON(path string, values map[string]string, dirPerm, filePerm os.FileMode) error { normalized := NormalizeSecretUpdates(values) if len(normalized) == 0 { if err := os.Remove(path); err != nil && !os.IsNotExist(err) { return err } return nil } if err := os.MkdirAll(filepath.Dir(path), dirPerm); err != nil { return err } data, err := json.MarshalIndent(normalized, "", " ") if err != nil { return err } tmp := path + ".tmp" if err := os.WriteFile(tmp, data, filePerm); err != nil { return err } return os.Rename(tmp, path) }