diff --git a/marshaler.go b/marshaler.go index 91f3b3c2..8317884d 100644 --- a/marshaler.go +++ b/marshaler.go @@ -652,10 +652,19 @@ func (enc *Encoder) encodeStruct(b []byte, ctx encoderCtx, v reflect.Value) ([]b } func (enc *Encoder) encodeComment(indent int, comment string, b []byte) []byte { - if comment != "" { + for len(comment) > 0 { + var line string + idx := strings.IndexByte(comment, '\n') + if idx >= 0 { + line = comment[:idx] + comment = comment[idx+1:] + } else { + line = comment + comment = "" + } b = enc.indent(indent, b) b = append(b, "# "...) - b = append(b, comment...) + b = append(b, line...) b = append(b, '\n') } return b diff --git a/marshaler_test.go b/marshaler_test.go index 10facb89..468546cc 100644 --- a/marshaler_test.go +++ b/marshaler_test.go @@ -1004,6 +1004,22 @@ func TestIssue752(t *testing.T) { require.Equal(t, "", string(out)) } +func TestIssue768(t *testing.T) { + type cfg struct { + Name string `comment:"This is a multiline comment.\nThis is line 2."` + } + + out, err := toml.Marshal(&cfg{}) + require.NoError(t, err) + + expected := `# This is a multiline comment. +# This is line 2. +Name = '' +` + + require.Equal(t, expected, string(out)) +} + func TestMarshalNestedAnonymousStructs(t *testing.T) { type Embedded struct { Value string `toml:"value" json:"value"`