Skip to content

Commit 305e112

Browse files
author
Antoine Pelisse
committed
Don't include empty objects in fieldsets, improve errors
1 parent 6a44ab7 commit 305e112

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

typed/union.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package typed
1818

1919
import (
2020
"fmt"
21+
"strings"
2122

2223
"sigs.k8s.io/structured-merge-diff/schema"
2324
"sigs.k8s.io/structured-merge-diff/value"
@@ -108,7 +109,7 @@ func newFieldsSet(m *value.Map, fields []field) fieldsSet {
108109
}
109110
set := fieldsSet{}
110111
for _, f := range fields {
111-
if _, ok := m.Get(string(f)); ok {
112+
if subField, ok := m.Get(string(f)); ok && !subField.Value.Null {
112113
set.Add(f)
113114
}
114115
}
@@ -152,6 +153,14 @@ func (fs fieldsSet) Difference(o fieldsSet) fieldsSet {
152153
return n
153154
}
154155

156+
func (fs fieldsSet) String() string {
157+
s := []string{}
158+
for k := range fs {
159+
s = append(s, string(k))
160+
}
161+
return strings.Join(s, ", ")
162+
}
163+
155164
type union struct {
156165
d *discriminator
157166
dn discriminatedNames
@@ -188,7 +197,7 @@ func (u *union) Normalize(old, new, out *value.Map) error {
188197
diff := ns.Difference(os)
189198

190199
if len(ns) > 1 && len(diff) != 1 {
191-
return fmt.Errorf("unable to guess new discriminator: %v", diff)
200+
return fmt.Errorf("unable to guess new discriminator amongst new fields: %v", diff)
192201
}
193202

194203
discriminator := field("")
@@ -200,7 +209,7 @@ func (u *union) Normalize(old, new, out *value.Map) error {
200209

201210
if u.d.Get(old) != u.d.Get(new) && u.d.Get(new) != "" {
202211
if len(diff) == 1 && u.d.Get(new) != u.dn.toDiscriminated(discriminator) {
203-
return fmt.Errorf("discriminator and field changed: %v/%v", discriminator, u.d.Get(new))
212+
return fmt.Errorf("discriminator (%v) and field changed (%v)", u.d.Get(new), discriminator)
204213
}
205214
u.clear(out, u.dn.toField(u.d.Get(new)))
206215
return nil

typed/union_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,12 @@ func TestNormalizeUnions(t *testing.T) {
198198
new: `{"one": 1}`,
199199
out: `{"one": 1, "discriminator": "One"}`,
200200
},
201+
{
202+
name: "new object has three of same union set but one is null",
203+
old: `{"one": 1}`,
204+
new: `{"one": 2, "two": 1, "three": null}`,
205+
out: `{"two": 1, "discriminator": "TWO"}`,
206+
},
201207
// These use-cases shouldn't happen:
202208
{
203209
name: "one field removed, discriminator unchanged",

0 commit comments

Comments
 (0)