From c56a4981289172005d44b7b9c1cb5ef4376c8f4d Mon Sep 17 00:00:00 2001 From: Laurianti Date: Fri, 2 Oct 2026 20:53:04 +0200 Subject: [PATCH] fix(strvals): parse {} as an empty list Signed-off-by: Laurianti --- pkg/strvals/parser.go | 4 ++++ pkg/strvals/parser_test.go | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index be3b1e71b..abe9acb09 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -485,6 +485,10 @@ func (t *parser) valList() ([]any, error) { if r, _, e := t.sc.ReadRune(); e == nil && r != ',' { t.sc.UnreadRune() } + // {} is an empty list. + if len(list) == 0 && len(rs) == 0 { + return list, nil + } v, e := t.reader(rs) list = append(list, v) return list, e diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index 73fc3f206..ac262d2f6 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -131,6 +131,11 @@ func TestParseSet(t *testing.T) { expect: map[string]any{"zero": "0"}, err: false, }, + { + str: "empty_list={}", + expect: map[string]any{"empty_list": []any{}}, + err: false, + }, } tests := []struct { str string @@ -287,6 +292,26 @@ func TestParseSet(t *testing.T) { map[string]any{"name1": map[string]any{"name2": []string{"value1", "value2"}}}, false, }, + { + str: "name1={value1}", + expect: map[string]any{"name1": []string{"value1"}}, + }, + { + str: "name1={value1,}", + expect: map[string]any{"name1": []string{"value1", ""}}, + }, + { + str: "name1={}", + expect: map[string]any{"name1": []any{}}, + }, + { + str: "name1={},name2=value2", + expect: map[string]any{"name1": []any{}, "name2": "value2"}, + }, + { + str: "name1.name2={}", + expect: map[string]any{"name1": map[string]any{"name2": []any{}}}, + }, { str: "name1={1021,902", err: true, @@ -344,6 +369,10 @@ func TestParseSet(t *testing.T) { str: "noval[0]=", expect: map[string]any{"noval": []any{""}}, }, + { + str: "list[0]={}", + expect: map[string]any{"list": []any{[]any{}}}, + }, { str: "nested[0][0]=1", expect: map[string]any{"nested": []any{[]any{1}}}, @@ -667,6 +696,17 @@ func TestParseFile(t *testing.T) { assert.YAMLEq(t, string(y1), string(y2), input) } +func TestParseFileEmptyList(t *testing.T) { + input := "name1={}" + rs2v := func(rs []rune) (any, error) { + return nil, fmt.Errorf("unexpected read of %q", string(rs)) + } + + got, err := ParseFile(input, rs2v) + require.NoError(t, err) + assert.Equal(t, map[string]any{"name1": []any{}}, got, input) +} + func TestParseIntoFile(t *testing.T) { got := map[string]any{} input := "name1=path1"