From 0d39440e10a0a4e415bdb8201ee5ececc4a128ce Mon Sep 17 00:00:00 2001 From: "Vyacheslav.Vershinin" Date: Mon, 23 Sep 2019 09:40:44 +0000 Subject: [PATCH 1/4] added WithOverrideEmptySlice config flag --- merge.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/merge.go b/merge.go index 7413dfc..8899836 100644 --- a/merge.go +++ b/merge.go @@ -26,11 +26,12 @@ func hasExportedField(dst reflect.Value) (exported bool) { } type Config struct { - Overwrite bool - AppendSlice bool - TypeCheck bool - Transformers Transformers - overwriteWithEmptyValue bool + Overwrite bool + AppendSlice bool + TypeCheck bool + Transformers Transformers + overwriteWithEmptyValue bool + OverwriteSliceWithEmptyValue bool } type Transformers interface { @@ -44,6 +45,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co overwrite := config.Overwrite typeCheck := config.TypeCheck overwriteWithEmptySrc := config.overwriteWithEmptyValue + overwriteSliceWithEmptySrc := config.OverwriteSliceWithEmptyValue config.overwriteWithEmptyValue = false if !src.IsValid() { @@ -130,7 +132,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dstSlice = reflect.ValueOf(dstElement.Interface()) } - if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { if typeCheck && srcSlice.Type() != dstSlice.Type() { return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } @@ -244,6 +246,11 @@ func WithOverride(config *Config) { config.Overwrite = true } +// WithOverride will make merge override empty dst slice with empty src slice. +func WithOverrideEmptySlice(config *Config) { + config.OverwriteSliceWithEmptyValue = true +} + // WithAppendSlice will make merge append slices instead of overwriting it. func WithAppendSlice(config *Config) { config.AppendSlice = true From d157f48e950cf1e7ac21a44e8bc0596852397dc3 Mon Sep 17 00:00:00 2001 From: "Vyacheslav.Vershinin" Date: Mon, 23 Sep 2019 10:11:23 +0000 Subject: [PATCH 2/4] added WithOverrideEmptySlice config flag --- merge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/merge.go b/merge.go index 8899836..a985199 100644 --- a/merge.go +++ b/merge.go @@ -161,7 +161,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if !dst.CanSet() { break } - if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { dst.Set(src) } else if config.AppendSlice { if src.Type() != dst.Type() { From 3d621922943336502192e7764dc8ec6f3fcd38e2 Mon Sep 17 00:00:00 2001 From: "Vyacheslav.Vershinin" Date: Tue, 24 Sep 2019 11:29:13 +0000 Subject: [PATCH 3/4] unexported OverwriteSliceWithEmptyValue config flag --- merge.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/merge.go b/merge.go index a985199..3fb6c64 100644 --- a/merge.go +++ b/merge.go @@ -31,7 +31,7 @@ type Config struct { TypeCheck bool Transformers Transformers overwriteWithEmptyValue bool - OverwriteSliceWithEmptyValue bool + overwriteSliceWithEmptyValue bool } type Transformers interface { @@ -45,7 +45,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co overwrite := config.Overwrite typeCheck := config.TypeCheck overwriteWithEmptySrc := config.overwriteWithEmptyValue - overwriteSliceWithEmptySrc := config.OverwriteSliceWithEmptyValue + overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue config.overwriteWithEmptyValue = false if !src.IsValid() { @@ -248,7 +248,7 @@ func WithOverride(config *Config) { // WithOverride will make merge override empty dst slice with empty src slice. func WithOverrideEmptySlice(config *Config) { - config.OverwriteSliceWithEmptyValue = true + config.overwriteSliceWithEmptyValue = true } // WithAppendSlice will make merge append slices instead of overwriting it. From bee5429d61fb6cac928fcc21882ac78dce467dd4 Mon Sep 17 00:00:00 2001 From: "Vyacheslav.Vershinin" Date: Tue, 24 Sep 2019 12:28:18 +0000 Subject: [PATCH 4/4] added test case for issue #125 --- issue125_test.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 issue125_test.go diff --git a/issue125_test.go b/issue125_test.go new file mode 100644 index 0000000..69cc894 --- /dev/null +++ b/issue125_test.go @@ -0,0 +1,37 @@ +package mergo + +import ( + "encoding/json" + "testing" +) + +var ( + data = `{"FirstSlice":[], "SecondSlice": null}` +) + +type settings struct { + FirstSlice []string `json:"FirstSlice"` + SecondSlice []string `json:"SecondSlice"` +} + +func TestIssue125MergeWithOverwrite(t *testing.T) { + + defaultSettings := settings{ + FirstSlice: []string{}, + SecondSlice: []string{}, + } + + var something settings + if err := json.Unmarshal([]byte(data), &something); err != nil { + t.Errorf("Error while Unmarshalling maprequest: %s", err) + } + if err := Merge(&something, defaultSettings, WithOverrideEmptySlice); err != nil { + t.Errorf("Error while merging: %s", err) + } + if something.FirstSlice == nil { + t.Error("Invalid merging first slice") + } + if something.SecondSlice == nil { + t.Error("Invalid merging second slice") + } +}