From eb645e24726e51d41d4980559df4babd0f3a2cd0 Mon Sep 17 00:00:00 2001 From: Sem Rekkers Date: Sun, 14 Feb 2021 14:44:58 +0100 Subject: [PATCH] Fix empty keyName when decoding struct -> map with omitempty Fixes #238 --- mapstructure.go | 4 +++- mapstructure_bugs_test.go | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/mapstructure.go b/mapstructure.go index 3643901f..36d591fe 100644 --- a/mapstructure.go +++ b/mapstructure.go @@ -927,7 +927,9 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) } } - keyName = tagValue[:index] + if keyNameTagValue := tagValue[:index]; keyNameTagValue != "" { + keyName = keyNameTagValue + } } else if len(tagValue) > 0 { if tagValue == "-" { continue diff --git a/mapstructure_bugs_test.go b/mapstructure_bugs_test.go index bcfc5054..7477c740 100644 --- a/mapstructure_bugs_test.go +++ b/mapstructure_bugs_test.go @@ -1,6 +1,7 @@ package mapstructure import ( + "fmt" "reflect" "testing" "time" @@ -601,3 +602,25 @@ func TestMapSquash(t *testing.T) { t.Fatal("expected false") } } + +// GH-238: Empty key name when decoding map from struct with only omitempty flag +func TestMapOmitEmptyWithEmptyFieldnameInTag(t *testing.T) { + type Struct struct { + Username string `mapstructure:",omitempty"` + Age int `mapstructure:",omitempty"` + } + + s := Struct{ + Username: "Joe", + } + var m map[string]interface{} + + if err := Decode(s, &m); err != nil { + t.Fatal(err) + } + + expect := "map[Username:Joe]" + if got := fmt.Sprintf("%+v", m); expect != got { + t.Fatalf("expect %q, got: %s", expect, got) + } +}