Skip to content

Commit 20db0ef

Browse files
committed
part: Fix MarshalYAML on empty maps
MarshalYAML nil deref'd the 'm.tree' when the map was empty. Fix this and extend test coverage. Signed-off-by: Jussi Maki <[email protected]>
1 parent ddc4f15 commit 20db0ef

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

part/map.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,11 @@ func (m *Map[K, V]) UnmarshalJSON(data []byte) error {
243243

244244
func (m Map[K, V]) MarshalYAML() (any, error) {
245245
kvs := make([]mapKVPair[K, V], 0, m.Len())
246-
iter := m.tree.Iterator()
247-
for _, kv, ok := iter.Next(); ok; _, kv, ok = iter.Next() {
248-
kvs = append(kvs, kv)
246+
if m.tree != nil {
247+
iter := m.tree.Iterator()
248+
for _, kv, ok := iter.Next(); ok; _, kv, ok = iter.Next() {
249+
kvs = append(kvs, kv)
250+
}
249251
}
250252
return kvs, nil
251253
}

part/map_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,16 @@ func TestMapJSON(t *testing.T) {
176176

177177
func TestMapYAMLStringKey(t *testing.T) {
178178
var m part.Map[string, int]
179-
m = m.Set("foo", 1).Set("bar", 2).Set("baz", 3)
180179

181180
bs, err := yaml.Marshal(m)
182181
require.NoError(t, err, "Marshal")
182+
require.Equal(t, "[]\n", string(bs))
183+
184+
m = m.Set("foo", 1).Set("bar", 2).Set("baz", 3)
185+
186+
bs, err = yaml.Marshal(m)
187+
require.NoError(t, err, "Marshal")
188+
require.Equal(t, "- k: bar\n v: 2\n- k: baz\n v: 3\n- k: foo\n v: 1\n", string(bs))
183189

184190
var m2 part.Map[string, int]
185191
err = yaml.Unmarshal(bs, &m2)

part/set_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,16 @@ func TestSetYAML(t *testing.T) {
7575

7676
bs, err := yaml.Marshal(s)
7777
require.NoError(t, err, "Marshal")
78+
require.Equal(t, "- bar\n- baz\n- foo\n", string(bs))
7879

7980
var s2 part.Set[string]
8081
err = yaml.Unmarshal(bs, &s2)
8182
require.NoError(t, err, "Unmarshal")
8283
require.True(t, s.Equal(s2), "Equal")
84+
85+
var empty part.Set[string]
86+
bs, err = yaml.Marshal(empty)
87+
require.NoError(t, err, "Unmarshal")
88+
require.Equal(t, "[]\n", string(bs))
89+
require.True(t, s.Equal(s2), "Equal")
8390
}

0 commit comments

Comments
 (0)