fix(serialization): correct validation parameter

- Fix bug in mapUnmarshalValidate where checkValidateTag parameter
  was incorrectly negated when passed to Convert()
- Remove obsolete validateWithValidator helper function
This commit is contained in:
yusing
2026-01-29 18:06:05 +08:00
parent 4c7d52d89d
commit d39660e6fa
2 changed files with 10 additions and 15 deletions

View File

@@ -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))
}

View File

@@ -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
}