diff --git a/pkg/schema/field/encode.go b/pkg/schema/field/encode.go index 0ece800f178dee4816df6b945954d4b2cd4cfb8e..d9eee6c6b2160cee2684227de6f3216061687909 100644 --- a/pkg/schema/field/encode.go +++ b/pkg/schema/field/encode.go @@ -16,7 +16,7 @@ type Encoder interface { // NonStrictConverter определяет метод для преобразования данных в нестрогом режиме. type NonStrictConverter interface { - NonStrictConverter(ctx context.Context, field *Field, v interface{}) interface{} + NonStrictConvert(ctx context.Context, field *Field, v interface{}) interface{} } type EncodeOptions struct { @@ -48,21 +48,23 @@ func Decode(ctx context.Context, w Walker, v interface{}, opts ...EncodeOption) } val, _, err := w.Walk(ctx, v, func(ctx context.Context, f *Field, v interface{}) (res WalkFuncResult, err error) { + decoder, ok := f.GetType().(Decoder) + if !ok { + res.Value = v + return res, nil + } + if opt.NonStrictMode { - if converter, ok := f.GetType().(NonStrictConverter); ok { - v = converter.NonStrictConverter(ctx, f, v) + if converter, hasConv := f.GetType().(NonStrictConverter); hasConv { + v = converter.NonStrictConvert(ctx, f, v) } } - if decoder, ok := f.GetType().(Decoder); ok { - if v, err = decoder.Decode(ctx, f, v); err != nil { - return - } - res.Value = v - res.Changed = true + if v, err = decoder.Decode(ctx, f, v); err != nil { return } res.Value = v + res.Changed = true return }, walkOpts...) diff --git a/pkg/schema/field/number.go b/pkg/schema/field/number.go index 1e782af179da9269b2200b7dd4c378a1b97a4280..c7fe262d0667ed49f5f89b0f39f505a3b0ee44a3 100644 --- a/pkg/schema/field/number.go +++ b/pkg/schema/field/number.go @@ -139,7 +139,7 @@ func (n NumberType) Encode(ctx context.Context, field *Field, v interface{}) (in return n.decode(ctx, field, v) } -func (NumberType) NonStrictConverter(_ context.Context, _ *Field, v interface{}) interface{} { +func (NumberType) NonStrictConvert(_ context.Context, _ *Field, v interface{}) interface{} { if v == nil { return nil } diff --git a/pkg/schema/field/string.go b/pkg/schema/field/string.go index 8fa4076eb32e327716a7bf65ed0ec1135ff4d088..e741b3e3c653becb6f6417c5d06abab2f68a33e6 100644 --- a/pkg/schema/field/string.go +++ b/pkg/schema/field/string.go @@ -58,7 +58,7 @@ func (StringType) Encode(_ context.Context, _ *Field, v interface{}) (interface{ return nil, fmt.Errorf("StringField encode error: unsupported value type : \"%s\"", reflect.ValueOf(v).Kind()) } -func (StringType) NonStrictConverter(_ context.Context, _ *Field, v interface{}) interface{} { +func (StringType) NonStrictConvert(_ context.Context, _ *Field, v interface{}) interface{} { if v == nil { return nil } diff --git a/pkg/schema/field/walk.go b/pkg/schema/field/walk.go index d394c64a7da5b5b7f9d837cf0e362201adec9aca..3e18fd65447bc26138444b2a42ec54e462d6c9b4 100644 --- a/pkg/schema/field/walk.go +++ b/pkg/schema/field/walk.go @@ -37,9 +37,9 @@ func WalkSchema() WalkOption { } } -// WalkNonStrict указывает что обход может выполняться в нестрогом режиме. -// При обходе по данным в случае несоответствия их типа будет выполнена -// попытка преобразования типа с использованием NonStrictConverter. +// WalkNonStrict указывает что обход выполняется в нестрогом режиме. +// В случае несоответствия типа данных ожидаемому, по возможности данные +// будут преобразованы в соответствии с ожидаемым типом. func WalkNonStrict() WalkOption { return func(opts *WalkOptions) { opts.WalkNonStrict = true