diff --git a/.editorconfig b/.editorconfig index 433be2a..4a2d918 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,3 +7,6 @@ charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true + +[*_test.go] +trim_trailing_whitespace = false diff --git a/file.go b/file.go index 7b4e560..9d91c31 100644 --- a/file.go +++ b/file.go @@ -442,16 +442,16 @@ func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) { kname = `"""` + kname + `"""` } - for _, val := range key.ValueWithShadows() { + writeKeyValue := func(val string) (bool, error) { if _, err := buf.WriteString(kname); err != nil { - return nil, err + return false, err } if key.isBooleanType { if kname != sec.keyList[len(sec.keyList)-1] { buf.WriteString(LineBreak) } - continue KeyList + return true, nil } // Write out alignment spaces before "=" sign @@ -468,10 +468,27 @@ func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) { val = `"` + val + `"` } if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil { + return false, err + } + return false, nil + } + + shadows := key.ValueWithShadows() + if len(shadows) == 0 { + if _, err := writeKeyValue(""); err != nil { return nil, err } } + for _, val := range shadows { + exitLoop, err := writeKeyValue(val) + if err != nil { + return nil, err + } else if exitLoop { + continue KeyList + } + } + for _, val := range key.nestedValues { if _, err := buf.WriteString(indent + " " + val + LineBreak); err != nil { return nil, err diff --git a/key.go b/key.go index 0302c29..2147974 100644 --- a/key.go +++ b/key.go @@ -113,6 +113,9 @@ func (k *Key) Value() string { // ValueWithShadows returns raw values of key and its shadows if any. func (k *Key) ValueWithShadows() []string { if len(k.shadows) == 0 { + if k.value == "" { + return []string{} + } return []string{k.value} } vals := make([]string, len(k.shadows)+1) diff --git a/key_test.go b/key_test.go index 5a842ad..69ce2db 100644 --- a/key_test.go +++ b/key_test.go @@ -521,6 +521,25 @@ func TestKey_Helpers(t *testing.T) { }) } +func TestKey_ValueWithShadows(t *testing.T) { + t.Run("", func(t *testing.T) { + f, err := ShadowLoad([]byte(` +keyName = value1 +keyName = value2 +`)) + require.NoError(t, err) + require.NotNil(t, f) + + k := f.Section("").Key("FakeKey") + require.NotNil(t, k) + assert.Equal(t, []string{}, k.ValueWithShadows()) + + k = f.Section("").Key("keyName") + require.NotNil(t, k) + assert.Equal(t, []string{"value1", "value2"}, k.ValueWithShadows()) + }) +} + func TestKey_StringsWithShadows(t *testing.T) { t.Run("get strings of shadows of a key", func(t *testing.T) { f, err := ShadowLoad([]byte(""))