diff --git a/internal/utils/serialization.go b/internal/utils/serialization.go index f7cb167..1312957 100644 --- a/internal/utils/serialization.go +++ b/internal/utils/serialization.go @@ -33,11 +33,8 @@ var ( ErrMapMissingColon = E.New("map missing colon") ErrMapTooManyColons = E.New("map too many colons") ErrUnknownField = E.New("unknown field") - ErrValidationError = E.New("validation error") ) -var validate = validator.New() - func ValidateYaml(schema *jsonschema.Schema, data []byte) E.Error { var i any @@ -185,6 +182,7 @@ func Deserialize(src SerializedObject, dst any) E.Error { case reflect.Struct: needValidate := false mapping := make(map[string]reflect.Value) + fieldName := make(map[string]string) for _, field := range reflect.VisibleFields(dstT) { var key string if jsonTag, ok := field.Tag.Lookup("json"); ok { @@ -192,7 +190,9 @@ func Deserialize(src SerializedObject, dst any) E.Error { } else { key = field.Name } - mapping[strutils.ToLowerNoSnake(key)] = dstV.FieldByName(field.Name) + key = strutils.ToLowerNoSnake(key) + mapping[key] = dstV.FieldByName(field.Name) + fieldName[field.Name] = key _, ok := field.Tag.Lookup("validate") if ok { needValidate = true @@ -218,7 +218,7 @@ func Deserialize(src SerializedObject, dst any) E.Error { detail += ":" + e.Param() } errs.Add(ErrValidationError. - Subject(strutils.ToLowerNoSnake(e.Field())). + Subject(fieldName[e.Field()]). Withf("require %q", detail)) } } diff --git a/internal/utils/validation.go b/internal/utils/validation.go new file mode 100644 index 0000000..f27c44c --- /dev/null +++ b/internal/utils/validation.go @@ -0,0 +1,14 @@ +package utils + +import ( + "github.com/go-playground/validator/v10" + E "github.com/yusing/go-proxy/internal/error" +) + +var validate = validator.New() + +var ErrValidationError = E.New("validation error") + +func Validator() *validator.Validate { + return validate +}