fix: resource-generator Merge — union SubParams вместо first-seen-wins
This commit is contained in:
@@ -16,6 +16,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Merge объединяет несколько наборов параметров, убирая дубликаты по Code.
|
// Merge объединяет несколько наборов параметров, убирая дубликаты по Code.
|
||||||
|
// При совпадении Code SubParams объединяются union'ом (новые поля из modify добавляются к create).
|
||||||
func Merge(sets ...[]types.Param) []types.Param {
|
func Merge(sets ...[]types.Param) []types.Param {
|
||||||
seen := map[string]types.Param{}
|
seen := map[string]types.Param{}
|
||||||
for _, s := range sets {
|
for _, s := range sets {
|
||||||
@@ -24,8 +25,13 @@ func Merge(sets ...[]types.Param) []types.Param {
|
|||||||
if key == "" {
|
if key == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if _, ok := seen[key]; !ok {
|
if existing, ok := seen[key]; !ok {
|
||||||
seen[key] = p
|
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
|
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 выравнивает типы параметров по схеме.
|
// AlignParamTypes выравнивает типы параметров по схеме.
|
||||||
func AlignParamTypes(params []types.Param, schema []types.Param) []types.Param {
|
func AlignParamTypes(params []types.Param, schema []types.Param) []types.Param {
|
||||||
if len(params) == 0 || len(schema) == 0 {
|
if len(params) == 0 || len(schema) == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user