From 2a8792be1ed8f7fcbea2c21aa61c018f951ba98b Mon Sep 17 00:00:00 2001 From: Danis Kirasirov <dbgbbu@gmail.com> Date: Mon, 7 Apr 2025 14:32:28 +0300 Subject: [PATCH] update array non-strict convert --- pkg/schema/field/array.go | 12 ++++++++++-- pkg/schema/field/array_test.go | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pkg/schema/field/array.go b/pkg/schema/field/array.go index cc3a903d..3d7fa47b 100644 --- a/pkg/schema/field/array.go +++ b/pkg/schema/field/array.go @@ -5,6 +5,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "git.perx.ru/perxis/perxis-go/pkg/errors" "github.com/hashicorp/go-multierror" @@ -138,8 +139,15 @@ func (ArrayType) Walk(ctx context.Context, field *Field, v interface{}, fn WalkF return nil, false, fmt.Errorf("incorrect type: %s, expected array or slice", arr.Kind()) } - // При использовании опции WalkNonStrict преобразовываем в слайс - arr = reflect.ValueOf([]interface{}{v}) + // При использовании опции WalkNonStrict + switch { + case arr.Kind() == reflect.String: + // В случае строки пытаемся разбить по пробелам + arr = reflect.ValueOf(strings.Split(arr.String(), " ")) + default: + // По умолчанию преобразуем в слайс из одного элемента + arr = reflect.ValueOf([]interface{}{v}) + } } var length int diff --git a/pkg/schema/field/array_test.go b/pkg/schema/field/array_test.go index 5685aa4a..fcf73b1f 100644 --- a/pkg/schema/field/array_test.go +++ b/pkg/schema/field/array_test.go @@ -118,8 +118,15 @@ func TestArrayField_DecodeNonStrict(t *testing.T) { false, }, { - "Incorrect data type", - Array(Number(NumberFormatInt)), + "String array", + Array(Number(NumberFormatFloat)), + "1 2 3.5", + []interface{}{1.0, 2.0, 3.5}, + false, + }, + { + "Incoorect type", + Array(Bool()), "1 2 3", nil, true, -- GitLab