diff --git a/validator_instance.go b/validator_instance.go index 08638ae..fc9db5a 100644 --- a/validator_instance.go +++ b/validator_instance.go @@ -207,6 +207,11 @@ func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...i } for _, t := range types { + tv := reflect.ValueOf(t) + if tv.Kind() == reflect.Ptr { + t = reflect.Indirect(tv).Interface() + } + v.structLevelFuncs[reflect.TypeOf(t)] = fn } } diff --git a/validator_test.go b/validator_test.go index 2efabc5..3a4b8f0 100644 --- a/validator_test.go +++ b/validator_test.go @@ -8149,3 +8149,16 @@ func TestKeyOrs(t *testing.T) { AssertDeepError(t, errs, "Test2.Test1[badtestkey]", "Test2.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "okkey", "eq=testkey|eq=testkeyok") AssertDeepError(t, errs, "Test2.Test1[badtestkey]", "Test2.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq", "eq") } + +func TestStructLevelValidationsPointerPassing(t *testing.T) { + v1 := New() + v1.RegisterStructValidation(StructValidationTestStruct, &TestStruct{}) + + tst := &TestStruct{ + String: "good value", + } + + errs := v1.Struct(tst) + NotEqual(t, errs, nil) + AssertError(t, errs, "TestStruct.StringVal", "TestStruct.String", "StringVal", "String", "badvalueteststruct") +}