Change behavior instead of error, we Indirect it to get the non-pointer value

pull/413/head
andreas 6 years ago
parent 9eeca29136
commit 8ed00e2e12
  1. 19
      validator_instance.go
  2. 15
      validator_test.go

@ -189,38 +189,31 @@ func (v *Validate) RegisterAlias(alias, tags string) {
// RegisterStructValidation registers a StructLevelFunc against a number of types.
//
// It returns error when type being passed is a pointer.
// NOTE:
// - this method is not thread-safe it is intended that these all be registered prior to any validation
func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) error {
return v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...)
func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) {
v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...)
}
// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing
// of contextual validation information via context.Context.
//
// It returns error when type being passed is a pointer.
// NOTE:
// - this method is not thread-safe it is intended that these all be registered prior to any validation
func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) error {
func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) {
if v.structLevelFuncs == nil {
v.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx)
}
for _, t := range types {
if reflect.ValueOf(t).Kind() == reflect.Ptr {
return fmt.Errorf(
"Type must be a non-pointer, %s is a pointer",
reflect.TypeOf(t))
tv := reflect.ValueOf(t)
if tv.Kind() == reflect.Ptr {
t = reflect.Indirect(tv).Interface()
}
}
for _, t := range types {
v.structLevelFuncs[reflect.TypeOf(t)] = fn
}
return nil
}
// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types

@ -8152,12 +8152,13 @@ func TestKeyOrs(t *testing.T) {
func TestStructLevelValidationsPointerPassing(t *testing.T) {
v1 := New()
err1 := v1.RegisterStructValidation(StructValidationTestStruct, &TestStruct{})
NotEqual(t, err1, nil)
Equal(t, err1.Error(),
"Type must be a non-pointer, *validator.TestStruct is a pointer")
v1.RegisterStructValidation(StructValidationTestStruct, &TestStruct{})
v2 := New()
err2 := v2.RegisterStructValidation(StructValidationTestStruct, TestStruct{})
Equal(t, err2, nil)
tst := &TestStruct{
String: "good value",
}
errs := v1.Struct(tst)
NotEqual(t, errs, nil)
AssertError(t, errs, "TestStruct.StringVal", "TestStruct.String", "StringVal", "String", "badvalueteststruct")
}

Loading…
Cancel
Save