@@ -60,6 +60,7 @@ func (r MergoFunction) Run(ctx context.Context, req function.RunRequest, resp *f
60
60
opts := make ([]func (* mergo.Config ), 0 )
61
61
with_override := true
62
62
no_null_override := false
63
+ with_append := false
63
64
64
65
for i , arg := range args {
65
66
if arg .IsNull () {
@@ -82,6 +83,7 @@ func (r MergoFunction) Run(ctx context.Context, req function.RunRequest, resp *f
82
83
83
84
case "append" , "append_lists" :
84
85
opts = append (opts , mergo .WithAppendSlice )
86
+ with_append = true
85
87
86
88
default :
87
89
resp .Error = function .NewArgumentFuncError (int64 (i ), "unrecognised option" )
@@ -105,7 +107,7 @@ func (r MergoFunction) Run(ctx context.Context, req function.RunRequest, resp *f
105
107
}
106
108
107
109
if no_null_override {
108
- opts = append (opts , mergo .WithTransformers (noNullOverrideTransformer {}))
110
+ opts = append (opts , mergo .WithTransformers (noNullOverrideTransformer { with_append : with_append }))
109
111
}
110
112
111
113
merged , diags := helpers .Mergo (ctx , objs , opts ... )
@@ -117,19 +119,21 @@ func (r MergoFunction) Run(ctx context.Context, req function.RunRequest, resp *f
117
119
resp .Error = function .ConcatFuncErrors (resp .Result .Set (ctx , & merged ))
118
120
}
119
121
120
- type noNullOverrideTransformer struct {}
122
+ type noNullOverrideTransformer struct {
123
+ with_append bool
124
+ }
121
125
122
126
func (t noNullOverrideTransformer ) Transformer (typ reflect.Type ) func (dst , src reflect.Value ) error {
123
127
if typ .Kind () == reflect .Map {
124
128
return func (dst , src reflect.Value ) error {
125
- deepMergeMaps (dst , src )
129
+ deepMergeMaps (dst , src , t . with_append )
126
130
return nil
127
131
}
128
132
}
129
133
return nil
130
134
}
131
135
132
- func deepMergeMaps (dst , src reflect.Value ) reflect.Value {
136
+ func deepMergeMaps (dst , src reflect.Value , appendSlice bool ) reflect.Value {
133
137
for _ , key := range src .MapKeys () {
134
138
srcElem := src .MapIndex (key )
135
139
dstElem := dst .MapIndex (key )
@@ -145,13 +149,13 @@ func deepMergeMaps(dst, src reflect.Value) reflect.Value {
145
149
146
150
if srcElem .Kind () == reflect .Map && dstElem .Kind () == reflect .Map {
147
151
// recursive call
148
- newValue := deepMergeMaps (dstElem , srcElem )
152
+ newValue := deepMergeMaps (dstElem , srcElem , appendSlice )
149
153
dst .SetMapIndex (key , newValue )
154
+ } else if ! srcElem .IsValid () { // skip override of nil values
155
+ continue ;
156
+ } else if srcElem .Kind () == reflect .Slice && dstElem .Kind () == reflect .Slice && appendSlice { // handle append
157
+ dst .SetMapIndex (key , reflect .AppendSlice (dstElem , srcElem ))
150
158
} else {
151
- if ! srcElem .IsValid () { // skip override of nil values
152
- continue
153
- }
154
-
155
159
dst .SetMapIndex (key , srcElem )
156
160
}
157
161
}
0 commit comments