From 2ca21fb7b42917ea6dab0787d7990f61630b1a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gra=C3=B1a?= Date: Tue, 23 Jan 2024 15:06:33 -0300 Subject: [PATCH] Support encoding of pointers to embedded structs (#924) --- marshaler.go | 2 ++ marshaler_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/marshaler.go b/marshaler.go index 6fe7853..5aaff3b 100644 --- a/marshaler.go +++ b/marshaler.go @@ -707,6 +707,8 @@ func walkStruct(ctx encoderCtx, t *table, v reflect.Value) { if fieldType.Anonymous { if fieldType.Type.Kind() == reflect.Struct { walkStruct(ctx, t, f) + } else if fieldType.Type.Kind() == reflect.Pointer && !f.IsNil() && f.Elem().Kind() == reflect.Struct { + walkStruct(ctx, t, f.Elem()) } continue } else { diff --git a/marshaler_test.go b/marshaler_test.go index c4869c8..d984010 100644 --- a/marshaler_test.go +++ b/marshaler_test.go @@ -1304,6 +1304,38 @@ value = '' require.Equal(t, expected, string(result)) } +func TestMarshalNestedAnonymousStructs_PointerEmbedded(t *testing.T) { + type Embedded struct { + Value string `toml:"value" json:"value"` + Omitted string `toml:"omitted,omitempty"` + Ptr *string `toml:"ptr"` + } + + type Named struct { + Value string `toml:"value" json:"value"` + } + + type Doc struct { + *Embedded + *Named `toml:"named" json:"named"` + Anonymous struct { + *Embedded + Value *string `toml:"value" json:"value"` + } `toml:"anonymous,omitempty" json:"anonymous,omitempty"` + } + + doc := &Doc{ + Embedded: &Embedded{Value: "foo"}, + } + + expected := `value = 'foo' +` + + result, err := toml.Marshal(doc) + require.NoError(t, err) + require.Equal(t, expected, string(result)) +} + func TestLocalTime(t *testing.T) { v := map[string]toml.LocalTime{ "a": {