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

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

Loading…
Cancel
Save