Skip to content

Commit 519c0f1

Browse files
committed
fix(anyjson): when right prop not exists should as false when left prop is boolean value
1 parent 8be04f9 commit 519c0f1

File tree

4 files changed

+33
-9
lines changed

4 files changed

+33
-9
lines changed

anyjson/op__diff.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ func (d *differ) diffObject(left *Object, right *Object) Valuer {
6666
merged := &Object{}
6767

6868
for key, valuer := range left.KeyValues() {
69-
if rightValue, ok := right.Get(key); ok {
69+
rightValue, rightExists := right.Get(key)
70+
if rightExists {
7071
switch x := rightValue.(type) {
7172
case *Array:
7273
if leftValue, ok := valuer.(*Array); ok {
@@ -93,6 +94,15 @@ func (d *differ) diffObject(left *Object, right *Object) Valuer {
9394
}
9495

9596
if _, ok := valuer.(*Null); !ok {
97+
if !rightExists {
98+
// when right value is not exists , and left prop is bool
99+
// right as false
100+
if _, ok := valuer.(*Boolean); ok {
101+
merged.Set(key, BooleanOf(false))
102+
continue
103+
}
104+
}
105+
96106
merged.Set(key, valuer)
97107
}
98108
}

anyjson/op__diff_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import (
1010
func TestDiff(t *testing.T) {
1111
t.Run("normal diff", func(t *testing.T) {
1212
base := MustFromValue(Obj{
13-
"int_changed": 1,
14-
"str_not_changed": "string",
15-
"list_not_changed": List{"1", "2"},
16-
"list_changed": List{"2"},
13+
"int_changed": 1,
14+
"str_not_changed": "string",
15+
"list_not_changed": List{"1", "2"},
16+
"list_changed": List{"2"},
17+
"bool_not_exists_as_changed": true,
1718
}).(*Object)
1819

1920
target := MustFromValue(Obj{
@@ -27,8 +28,9 @@ func TestDiff(t *testing.T) {
2728
testingx.Expect(t, err, testingx.Be[error](nil))
2829

2930
testingx.Expect(t, diffed.Value(), testingx.Equal[any](Obj{
30-
"int_changed": 2,
31-
"list_changed": List{"1"},
31+
"int_changed": 2,
32+
"list_changed": List{"1"},
33+
"bool_not_exists_as_changed": false,
3234
}))
3335
})
3436

anyjson/op__merge.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ func (m *merger) mergeObject(left *Object, right *Object) Valuer {
5555
merged := &Object{}
5656

5757
for key, valuer := range left.KeyValues() {
58-
if rightValue, ok := right.Get(key); ok {
58+
rightValue, rightExists := right.Get(key)
59+
if rightExists {
5960
switch x := rightValue.(type) {
6061
case *Array:
6162
if leftValue, ok := valuer.(*Array); ok {
@@ -71,7 +72,7 @@ func (m *merger) mergeObject(left *Object, right *Object) Valuer {
7172
}
7273
case *Null:
7374
if m.nullOp == NullAsRemover {
74-
// don't merger null valuer
75+
// don't merge null valuer
7576
valuer = &Null{}
7677
continue
7778
}
@@ -81,8 +82,18 @@ func (m *merger) mergeObject(left *Object, right *Object) Valuer {
8182
}
8283

8384
if _, ok := valuer.(*Null); !ok {
85+
if !rightExists {
86+
// when right value is not exists , and left prop is bool
87+
// drop left value
88+
if _, ok := valuer.(*Boolean); ok {
89+
merged.Delete(key)
90+
continue
91+
}
92+
}
93+
8494
merged.Set(key, valuer)
8595
}
96+
8697
}
8798

8899
for key, value := range right.KeyValues() {

anyjson/op__merge_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ func TestMerge(t *testing.T) {
1515
"arr": List{
1616
"1", "2",
1717
},
18+
"boolRemoveWhenNotExists": true,
1819
}).(*Object)
1920

2021
patch := MustFromValue(Obj{

0 commit comments

Comments
 (0)