diff --git a/internal/serialization/serialization.go b/internal/serialization/serialization.go index 7a46851d..920abbb9 100644 --- a/internal/serialization/serialization.go +++ b/internal/serialization/serialization.go @@ -315,7 +315,7 @@ func mapUnmarshalValidate(src SerializedObject, dstV reflect.Value, checkValidat info := getTypeInfo(dstT) for k, v := range src { if field, ok := info.getField(dstV, k); ok { - err := Convert(reflect.ValueOf(v), field, !info.hasValidateTag) + err := Convert(reflect.ValueOf(v), field, checkValidateTag) if err != nil { errs.Add(err.Subject(k)) } diff --git a/internal/serialization/validation.go b/internal/serialization/validation.go index c0040dc2..bebd9370 100644 --- a/internal/serialization/validation.go +++ b/internal/serialization/validation.go @@ -29,17 +29,19 @@ type CustomValidator interface { var validatorType = reflect.TypeFor[CustomValidator]() func ValidateWithCustomValidator(v reflect.Value) gperr.Error { + vt := v.Type() if v.Kind() == reflect.Pointer { - if v.IsNil() { - // return nil - return validateWithValidator(reflect.New(v.Type().Elem())) - } - if v.Type().Implements(validatorType) { + elemType := vt.Elem() + if vt.Implements(validatorType) { + if v.IsNil() { + return reflect.New(elemType).Interface().(CustomValidator).Validate() + } return v.Interface().(CustomValidator).Validate() } - return validateWithValidator(v.Elem()) + if elemType.Implements(validatorType) { + return v.Elem().Interface().(CustomValidator).Validate() + } } else { - vt := v.Type() if vt.PkgPath() != "" { // not a builtin type // prioritize pointer method if v.CanAddr() { @@ -56,10 +58,3 @@ func ValidateWithCustomValidator(v reflect.Value) gperr.Error { } return nil } - -func validateWithValidator(v reflect.Value) gperr.Error { - if v.Type().Implements(validatorType) { - return v.Interface().(CustomValidator).Validate() - } - return nil -}