diff --git a/pkg/data/data.go b/pkg/data/data.go index c1d0f63f958209147137cfee6829e531a2f5a87d..c94a7e250e0902caa07e37a40a89209f9a410480 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -3,6 +3,8 @@ package data import ( "strconv" "strings" + + "git.perx.ru/perxis/perxis-go/pkg/errors" ) const DefaultFieldDelimiter = "." @@ -178,7 +180,7 @@ func set(path []string, data, value any) error { switch v := data.(type) { case map[string]interface{}: if v == nil { - return nil + return errors.New("assignment to nil map") } if len(path) == 1 { diff --git a/pkg/data/data_test.go b/pkg/data/data_test.go index 4a54ff0aa7f01d4410e0255c2471f5e6dfe07a61..6d4ccfbddc3cfb364bbc3ed1c5684d9a4978cc38 100644 --- a/pkg/data/data_test.go +++ b/pkg/data/data_test.go @@ -83,7 +83,7 @@ func TestDelete(t *testing.T) { }, "a.b", map[string]any{ - "a": []any{uninitializedMap, map[string]any{"a": "1"}}, + "a": []any{uninitializedMap, map[string]any{"a": "1", "b": "2"}}, }, }, { @@ -105,7 +105,7 @@ func TestDelete(t *testing.T) { "a", []any{ uninitializedMap, - map[string]any{"b": "2"}, + map[string]any{"a": 1, "b": "2"}, }, }, // Решили что автоматически удалять пустые объекты/слайсы не нужно @@ -300,27 +300,25 @@ func TestSet(t *testing.T) { {"Map value", args{"a", map[string]interface{}{"a": "0"}, map[string]interface{}{"a": "a"}}, map[string]interface{}{"a": map[string]interface{}{"a": "a"}}, assert.NoError}, {"Slice", args{"a.a", map[string]interface{}{"a": []any{map[string]any{"a": "0"}, map[string]any{"a": "0", "b": "b"}}}, "a"}, map[string]interface{}{"a": []any{map[string]any{"a": "a"}, map[string]any{"a": "a", "b": "b"}}}, assert.NoError}, {"Slice", args{"a.0.a", map[string]interface{}{"a": []any{map[string]any{"a": "0"}, map[string]any{"a": "0", "b": "b"}}}, "a"}, map[string]interface{}{"a": []any{map[string]any{"a": "a"}, map[string]any{"a": "0", "b": "b"}}}, assert.NoError}, - {"Set the object for the uninitialized map", args{"a", uninitializedMap, "a"}, uninitializedMap, assert.NoError}, - {"Set the object field for the uninitialized map", args{"a.b", uninitializedMap, "a"}, uninitializedMap, assert.NoError}, + {"Set the object for the uninitialized map", args{"a", uninitializedMap, "a"}, uninitializedMap, assert.Error}, + {"Set the object field for the uninitialized map", args{"a.b", uninitializedMap, "a"}, uninitializedMap, assert.Error}, { - "object field from first level array with uninitialized map", + "Set object field from first level array with uninitialized map", args{"a.b", map[string]any{"a": []any{uninitializedMap, map[string]any{"a": "1"}}}, "2"}, - map[string]any{"a": []any{uninitializedMap, map[string]any{"a": "1", "b": "2"}}}, - assert.NoError, + map[string]any{"a": []any{uninitializedMap, map[string]any{"a": "1"}}}, + assert.Error, }, { - "object field from second level uninitialized map", + "Set object field from second level uninitialized map", args{"a.b.a", map[string]any{"a": map[string]any{"a": uninitializedMap, "b": map[string]any{"b": "2"}}}, "1"}, - map[string]any{ - "a": map[string]any{"a": uninitializedMap, "b": map[string]any{"a": "1", "b": "2"}}, - }, + map[string]any{"a": map[string]any{"a": uninitializedMap, "b": map[string]any{"a": "1", "b": "2"}}}, assert.NoError, }, { - "object from array with uninitialized map", + "Set object from array with uninitialized map", args{"a", []any{uninitializedMap, map[string]any{"b": "2"}}, "1"}, - []any{uninitializedMap, map[string]any{"a": "1", "b": "2"}}, - assert.NoError, + []any{uninitializedMap, map[string]any{"b": "2"}}, + assert.Error, }, } for _, tt := range tests {