Skip to content

Commit 47e353d

Browse files
committed
feat: support for automatically initializing squashed pointer structs
1 parent 7aa50a4 commit 47e353d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

mapstructure.go

+9
Original file line numberDiff line numberDiff line change
@@ -1409,6 +1409,15 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
14091409
if !fieldVal.IsNil() {
14101410
structs = append(structs, fieldVal.Elem().Elem())
14111411
}
1412+
case reflect.Ptr:
1413+
if fieldVal.Type().Elem().Kind() == reflect.Struct {
1414+
if fieldVal.IsNil() {
1415+
fieldVal.Set(reflect.New(fieldVal.Type().Elem()))
1416+
}
1417+
structs = append(structs, fieldVal.Elem())
1418+
} else {
1419+
errs = append(errs, fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind()))
1420+
}
14121421
default:
14131422
errs = append(errs, fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind()))
14141423
}

mapstructure_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,29 @@ func TestDecode_EmbeddedPointerSquash_FromMapToStruct(t *testing.T) {
878878
}
879879
}
880880

881+
func TestDecode_EmbeddedPointerSquash_WithoutPreInitializedStructs_FromMapToStruct(t *testing.T) {
882+
t.Parallel()
883+
884+
input := map[string]interface{}{
885+
"Vstring": "foo",
886+
"Vunique": "bar",
887+
}
888+
889+
result := EmbeddedPointerSquash{}
890+
err := Decode(input, &result)
891+
if err != nil {
892+
t.Fatalf("got an err: %s", err.Error())
893+
}
894+
895+
if result.Vstring != "foo" {
896+
t.Errorf("vstring value should be 'foo': %#v", result.Vstring)
897+
}
898+
899+
if result.Vunique != "bar" {
900+
t.Errorf("vunique value should be 'bar': %#v", result.Vunique)
901+
}
902+
}
903+
881904
func TestDecode_EmbeddedPointerSquashWithNestedMapstructure_FromStructToMap(t *testing.T) {
882905
t.Parallel()
883906

0 commit comments

Comments
 (0)