diff --git a/pkg/schema/field/array.go b/pkg/schema/field/array.go index cc3a903d8b5eb91146b0e44c6836b81759041502..3d7fa47ba8facb7c2b632a262ef5879705e6ba86 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 5685aa4ada41e33444c0ea589681cc2497dcc3f8..fcf73b1ff7c8664200ef91bc56669a157ff419a6 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,