Skip to content

Commit b54ec82

Browse files
Merge pull request #71 from tuunit/feat/add-support-for-automatically-initializing-squashed-pointer-structs
feat: support for automatically initializing squashed pointer structs
2 parents f9d9e58 + 40dfde5 commit b54ec82

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

mapstructure.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,18 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
14921492
if !fieldVal.IsNil() {
14931493
structs = append(structs, fieldVal.Elem().Elem())
14941494
}
1495+
case reflect.Ptr:
1496+
if fieldVal.Type().Elem().Kind() == reflect.Struct {
1497+
if fieldVal.IsNil() {
1498+
fieldVal.Set(reflect.New(fieldVal.Type().Elem()))
1499+
}
1500+
structs = append(structs, fieldVal.Elem())
1501+
} else {
1502+
errs = append(errs, newDecodeError(
1503+
name+"."+fieldType.Name,
1504+
fmt.Errorf("unsupported type for squashed pointer: %s", fieldVal.Type().Elem().Kind()),
1505+
))
1506+
}
14951507
default:
14961508
errs = append(errs, newDecodeError(
14971509
name+"."+fieldType.Name,

mapstructure_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,29 @@ func TestDecode_EmbeddedPointerSquash_FromMapToStruct(t *testing.T) {
894894
}
895895
}
896896

897+
func TestDecode_EmbeddedPointerSquash_WithoutPreInitializedStructs_FromMapToStruct(t *testing.T) {
898+
t.Parallel()
899+
900+
input := map[string]interface{}{
901+
"Vstring": "foo",
902+
"Vunique": "bar",
903+
}
904+
905+
result := EmbeddedPointerSquash{}
906+
err := Decode(input, &result)
907+
if err != nil {
908+
t.Fatalf("got an err: %s", err.Error())
909+
}
910+
911+
if result.Vstring != "foo" {
912+
t.Errorf("vstring value should be 'foo': %#v", result.Vstring)
913+
}
914+
915+
if result.Vunique != "bar" {
916+
t.Errorf("vunique value should be 'bar': %#v", result.Vunique)
917+
}
918+
}
919+
897920
func TestDecode_EmbeddedPointerSquashWithNestedMapstructure_FromStructToMap(t *testing.T) {
898921
t.Parallel()
899922

0 commit comments

Comments
 (0)