Skip to content

Commit c512b06

Browse files
committed
Mergo reviewed and ready for release
1 parent 60f2262 commit c512b06

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed
File renamed without changes.

merge.go

+18-15
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import (
1313
"reflect"
1414
)
1515

16-
func isMergeableField(dst reflect.Value) (exported bool) {
16+
func hasMergeableFields(dst reflect.Value) (exported bool) {
1717
for i, n := 0, dst.NumField(); i < n; i++ {
1818
field := dst.Type().Field(i)
1919
if field.Anonymous && dst.Field(i).Kind() == reflect.Struct {
20-
exported = exported || isMergeableField(dst.Field(i))
20+
exported = exported || hasMergeableFields(dst.Field(i))
2121
} else if isExportedComponent(&field) {
2222
exported = exported || len(field.PkgPath) == 0
2323
}
@@ -45,6 +45,7 @@ type Config struct {
4545
overwriteWithEmptyValue bool
4646
overwriteSliceWithEmptyValue bool
4747
sliceDeepCopy bool
48+
debug bool
4849
}
4950

5051
type Transformers interface {
@@ -87,7 +88,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co
8788

8889
switch dst.Kind() {
8990
case reflect.Struct:
90-
if isMergeableField(dst) {
91+
if hasMergeableFields(dst) {
9192
for i, n := 0, dst.NumField(); i < n; i++ {
9293
if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil {
9394
return
@@ -236,15 +237,6 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co
236237
break
237238
}
238239

239-
if dst.Kind() != reflect.Ptr && src.Type().AssignableTo(dst.Type()) {
240-
if dst.IsNil() || overwrite {
241-
if dst.CanSet() && (overwrite || isEmptyValue(dst)) {
242-
dst.Set(src)
243-
}
244-
}
245-
break
246-
}
247-
248240
if src.Kind() != reflect.Interface {
249241
if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) {
250242
if dst.CanSet() && (overwrite || isEmptyValue(dst)) {
@@ -268,11 +260,22 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co
268260
if dst.CanSet() && (overwrite || isEmptyValue(dst)) {
269261
dst.Set(src)
270262
}
271-
} else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil {
272-
return
263+
break
264+
}
265+
266+
if dst.Elem().Kind() == src.Elem().Kind() {
267+
if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil {
268+
return
269+
}
270+
break
273271
}
274272
default:
275-
mustSet := (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst))
273+
mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc)
274+
v := fmt.Sprintf("%v", src)
275+
if v == "TestIssue106" {
276+
fmt.Println(mustSet)
277+
fmt.Println(dst.CanSet())
278+
}
276279
if mustSet {
277280
if dst.CanSet() {
278281
dst.Set(src)

0 commit comments

Comments
 (0)