Skip to content

Commit be463c9

Browse files
authored
chore: improve null merging behaviour (#10)
1 parent 534f686 commit be463c9

File tree

2 files changed

+32
-25
lines changed

2 files changed

+32
-25
lines changed

mergevalues.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ func MergeValues(a, b *Value) (v *Value, changed bool, err error) {
1818
if b == nil {
1919
return a, false, nil
2020
}
21+
if b.Type() == TypeNull && a.Type() == TypeObject {
22+
// we assume that null was returned in an error case for resolving a nested object field
23+
// as we've got an object on the left side, we don't override the whole object with null
24+
// instead, we keep the left object and discard the null on the right side
25+
return a, false, nil
26+
}
2127
aBool, bBool := a.Type() == TypeTrue || a.Type() == TypeFalse, b.Type() == TypeTrue || b.Type() == TypeFalse
2228
booleans := aBool && bBool
23-
oneIsNull := a.Type() == TypeNull || b.Type() == TypeNull
24-
if a.Type() != b.Type() && !booleans && !oneIsNull {
29+
if a.Type() != b.Type() && !booleans {
2530
return nil, false, ErrMergeDifferentTypes
2631
}
27-
if b.Type() == TypeNull && a.Type() != TypeNull {
28-
return b, true, nil
29-
}
3032
switch a.Type() {
3133
case TypeObject:
3234
ao, _ := a.Object()

mergevalues_test.go

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -183,20 +183,14 @@ func TestMergeValues(t *testing.T) {
183183
t.Run("null not null", func(t *testing.T) {
184184
t.Parallel()
185185
a, b := MustParse(`null`), MustParse(`1`)
186-
merged, changed, err := MergeValues(a, b)
187-
require.NoError(t, err)
188-
require.Equal(t, true, changed)
189-
out := merged.MarshalTo(nil)
190-
require.Equal(t, `1`, string(out))
186+
_, _, err := MergeValues(a, b)
187+
require.Error(t, err)
191188
})
192189
t.Run("null not null reverse", func(t *testing.T) {
193190
t.Parallel()
194191
a, b := MustParse(`1`), MustParse(`null`)
195-
merged, changed, err := MergeValues(a, b)
196-
require.NoError(t, err)
197-
require.Equal(t, true, changed)
198-
out := merged.MarshalTo(nil)
199-
require.Equal(t, `null`, string(out))
192+
_, _, err := MergeValues(a, b)
193+
require.Error(t, err)
200194
})
201195
t.Run("array objects", func(t *testing.T) {
202196
t.Parallel()
@@ -272,32 +266,43 @@ func TestMergeValues(t *testing.T) {
272266
t.Parallel()
273267
left := MustParse(`null`)
274268
right := MustParse(`true`)
275-
out, _, err := MergeValues(left, right)
276-
require.NoError(t, err)
277-
require.Equal(t, `true`, out.String())
269+
_, _, err := MergeValues(left, right)
270+
require.Error(t, err)
278271
})
279272
t.Run("true null", func(t *testing.T) {
280273
t.Parallel()
281274
left := MustParse(`true`)
282275
right := MustParse(`null`)
283-
out, _, err := MergeValues(left, right)
284-
require.NoError(t, err)
285-
require.Equal(t, `null`, out.String())
276+
_, _, err := MergeValues(left, right)
277+
require.Error(t, err)
286278
})
287279
t.Run("nested null true", func(t *testing.T) {
288280
t.Parallel()
289281
left := MustParse(`{"a":null}`)
290282
right := MustParse(`{"a":true}`)
291-
out, _, err := MergeValues(left, right)
292-
require.NoError(t, err)
293-
require.Equal(t, `{"a":true}`, out.String())
283+
_, _, err := MergeValues(left, right)
284+
require.Error(t, err)
294285
})
295286
t.Run("nested true null", func(t *testing.T) {
296287
t.Parallel()
297288
left := MustParse(`{"a":true}`)
298289
right := MustParse(`{"a":null}`)
290+
_, _, err := MergeValues(left, right)
291+
require.Error(t, err)
292+
})
293+
t.Run("nested null into nested object", func(t *testing.T) {
294+
t.Parallel()
295+
left := MustParse(`{"a":{"b":"c"}}`)
296+
right := MustParse(`{"a":null}`)
299297
out, _, err := MergeValues(left, right)
300298
require.NoError(t, err)
301-
require.Equal(t, `{"a":null}`, out.String())
299+
require.Equal(t, `{"a":{"b":"c"}}`, out.String())
300+
})
301+
t.Run("nested object into nested null", func(t *testing.T) {
302+
t.Parallel()
303+
left := MustParse(`{"a":null}`)
304+
right := MustParse(`{"a":{"b":"c"}}`)
305+
_, _, err := MergeValues(left, right)
306+
require.Error(t, err)
302307
})
303308
}

0 commit comments

Comments
 (0)