diff --git a/conflate_test.go b/conflate_test.go index da2fb48..34c0d28 100644 --- a/conflate_test.go +++ b/conflate_test.go @@ -21,6 +21,11 @@ type TestData struct { All string `json:"all"` } +type TestNulledData struct { + Foo string `yaml:"foo"` + Bar string `yaml:"bar"` +} + func TestFromFiles(t *testing.T) { c, err := FromFiles("testdata/valid_parent.json") assert.Nil(t, err) @@ -361,3 +366,14 @@ func TestConflate_mergeDataError(t *testing.T) { assert.NotNil(t, err) assert.Contains(t, err.Error(), "failed to merge") } + +func TestFromFilesNulled(t *testing.T) { + c, err := FromFiles("testdata/test_not_nulled.yaml", "testdata/test_nulled.yaml") + assert.Nil(t, err) + assert.NotNil(t, c) + var testData TestNulledData + err = c.Unmarshal(&testData) + assert.Nil(t, err) + assert.Equal(t, "foo", testData.Foo) + assert.Equal(t, "", testData.Bar) +} diff --git a/merge.go b/merge.go index f22cdab..c5c43c4 100644 --- a/merge.go +++ b/merge.go @@ -84,6 +84,11 @@ func mergeMapRecursive(ctx context, toData, fromData interface{}) error { } for name, fromProp := range fromProps { + // merge in explicit nil values + if fromProp == nil { + toProps[name] = nil + continue + } if val := toProps[name]; val == nil { toProps[name] = fromProp } else { diff --git a/testdata/test_not_nulled.yaml b/testdata/test_not_nulled.yaml new file mode 100644 index 0000000..e7b26c8 --- /dev/null +++ b/testdata/test_not_nulled.yaml @@ -0,0 +1,2 @@ +foo: foo +bar: bar \ No newline at end of file diff --git a/testdata/test_nulled.yaml b/testdata/test_nulled.yaml new file mode 100644 index 0000000..596e0e3 --- /dev/null +++ b/testdata/test_nulled.yaml @@ -0,0 +1,2 @@ +foo: foo +bar: null \ No newline at end of file