fix: resource-generator Merge — union SubParams вместо first-seen-wins
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user