From f7e7aa34b6d95f57cc4f4a5543aa8ad14ce2e5d9 Mon Sep 17 00:00:00 2001
From: Danis Kirasirov <dbgbbu@gmail.com>
Date: Tue, 18 Mar 2025 15:07:21 +0300
Subject: [PATCH] refactoring

---
 pkg/schema/field/encode.go | 20 +++++++++++---------
 pkg/schema/field/number.go |  2 +-
 pkg/schema/field/string.go |  2 +-
 pkg/schema/field/walk.go   |  6 +++---
 4 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/pkg/schema/field/encode.go b/pkg/schema/field/encode.go
index 0ece800f..d9eee6c6 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 1e782af1..c7fe262d 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 8fa4076e..e741b3e3 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 d394c64a..3e18fd65 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
-- 
GitLab