fix: resource-generator Merge — union SubParams вместо first-seen-wins

This commit is contained in:
“Naeel”
2026-07-18 22:36:39 +04:00
parent cfb546651b
commit 6f0e2a9b81
@@ -16,6 +16,7 @@ import (
)
// Merge объединяет несколько наборов параметров, убирая дубликаты по Code.
// При совпадении Code SubParams объединяются union'ом (новые поля из modify добавляются к create).
func Merge(sets ...[]types.Param) []types.Param {
seen := map[string]types.Param{}
for _, s := range sets {
@@ -24,8 +25,13 @@ func Merge(sets ...[]types.Param) []types.Param {
if key == "" {
continue
}
if _, ok := seen[key]; !ok {
if existing, ok := seen[key]; !ok {
seen[key] = p
} else if p.HasSubParams && len(p.SubParams) > 0 {
merged := unionSubParams(existing.SubParams, p.SubParams)
existing.SubParams = merged
existing.HasSubParams = len(merged) > 0
seen[key] = existing
}
}
}
@@ -37,6 +43,22 @@ func Merge(sets ...[]types.Param) []types.Param {
return out
}
// unionSubParams добавляет sub-params из extra, которых ещё нет в base (сравнение по Code).
func unionSubParams(base, extra []types.Param) []types.Param {
inBase := make(map[string]struct{}, len(base))
for _, p := range base {
inBase[strings.ToLower(strings.TrimSpace(p.Code))] = struct{}{}
}
out := append([]types.Param(nil), base...)
for _, p := range extra {
if _, seen := inBase[strings.ToLower(strings.TrimSpace(p.Code))]; !seen {
out = append(out, p)
}
}
sort.Slice(out, func(i, j int) bool { return out[i].Code < out[j].Code })
return out
}
// AlignParamTypes выравнивает типы параметров по схеме.
func AlignParamTypes(params []types.Param, schema []types.Param) []types.Param {
if len(params) == 0 || len(schema) == 0 {