From 1537af979e2f9e2e11e6002211b8a684793ec34e Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Mon, 15 Aug 2022 11:25:32 -0400 Subject: [PATCH] Encode: don't inherit omitempty Fixes #786. --- marshaler.go | 10 +++++----- marshaler_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/marshaler.go b/marshaler.go index 76896691..acb28831 100644 --- a/marshaler.go +++ b/marshaler.go @@ -346,8 +346,8 @@ func isNil(v reflect.Value) bool { } } -func shouldOmitEmpty(ctx encoderCtx, options valueOptions, v reflect.Value) bool { - return (ctx.options.omitempty || options.omitempty) && isEmptyValue(v) +func shouldOmitEmpty(options valueOptions, v reflect.Value) bool { + return options.omitempty && isEmptyValue(v) } func (enc *Encoder) encodeKv(b []byte, ctx encoderCtx, options valueOptions, v reflect.Value) ([]byte, error) { @@ -801,7 +801,7 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro hasNonEmptyKV := false for _, kv := range t.kvs { - if shouldOmitEmpty(ctx, kv.Options, kv.Value) { + if shouldOmitEmpty(kv.Options, kv.Value) { continue } hasNonEmptyKV = true @@ -818,7 +818,7 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro first := true for _, table := range t.tables { - if shouldOmitEmpty(ctx, table.Options, table.Value) { + if shouldOmitEmpty(table.Options, table.Value) { continue } if first { @@ -850,7 +850,7 @@ func (enc *Encoder) encodeTableInline(b []byte, ctx encoderCtx, t table) ([]byte first := true for _, kv := range t.kvs { - if shouldOmitEmpty(ctx, kv.Options, kv.Value) { + if shouldOmitEmpty(kv.Options, kv.Value) { continue } diff --git a/marshaler_test.go b/marshaler_test.go index ef444b7d..d7b4e520 100644 --- a/marshaler_test.go +++ b/marshaler_test.go @@ -1048,6 +1048,51 @@ func TestIssue786(t *testing.T) { require.NoError(t, err) require.Equal(t, "", string(b)) + + type General struct { + From string `toml:"from,omitempty" json:"from,omitempty" comment:"from in graphite-web format, the local TZ is used"` + Randomize bool `toml:"randomize" json:"randomize" comment:"randomize starting time with [0,step)"` + } + + type Custom struct { + Name string `toml:"name" json:"name,omitempty" comment:"names for generator, braces are expanded like in shell"` + Type string `toml:"type,omitempty" json:"type,omitempty" comment:"type of generator"` + General + } + type Config struct { + General + Custom []Custom `toml:"custom,omitempty" json:"custom,omitempty" comment:"generators with custom parameters can be specified separately"` + } + + buf := new(bytes.Buffer) + config := &Config{General: General{From: "-2d", Randomize: true}} + config.Custom = []Custom{{Name: "omit", General: General{Randomize: false}}} + config.Custom = append(config.Custom, Custom{Name: "present", General: General{From: "-2d", Randomize: true}}) + encoder := toml.NewEncoder(buf) + encoder.Encode(config) + + expected := `# from in graphite-web format, the local TZ is used +from = '-2d' +# randomize starting time with [0,step) +randomize = true + +# generators with custom parameters can be specified separately +[[custom]] +# names for generator, braces are expanded like in shell +name = 'omit' +# randomize starting time with [0,step) +randomize = false + +[[custom]] +# names for generator, braces are expanded like in shell +name = 'present' +# from in graphite-web format, the local TZ is used +from = '-2d' +# randomize starting time with [0,step) +randomize = true +` + + require.Equal(t, expected, buf.String()) } func TestMarshalNestedAnonymousStructs(t *testing.T) {