From b308c8b0a9969044dfd06b3f09faa801577bb60a Mon Sep 17 00:00:00 2001 From: Suhas Karanth Date: Sat, 10 Mar 2018 08:35:08 +0530 Subject: [PATCH] fix(binding): Move validator engine getter inside interface --- README.md | 8 ++++---- binding/binding.go | 21 ++++----------------- binding/default_validator.go | 9 +++++++++ binding/validate_test.go | 4 ++-- examples/custom-validation/server.go | 8 ++++---- examples/struct-lvl-validations/server.go | 8 ++++---- 6 files changed, 27 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index cc2d653a..d3f85fa9 100644 --- a/README.md +++ b/README.md @@ -564,11 +564,11 @@ func bookableDate( func main() { route := gin.Default() - v := binding.ValidatorEngine() - if v == nil { - panic("validator engine is nil") + + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + v.RegisterValidation("bookabledate", bookableDate) } - v.RegisterValidation("bookabledate", bookableDate) + route.GET("/bookable", getBookable) route.Run(":8085") } diff --git a/binding/binding.go b/binding/binding.go index 20ee6f86..646eb80a 100644 --- a/binding/binding.go +++ b/binding/binding.go @@ -6,8 +6,6 @@ package binding import ( "net/http" - - validator "gopkg.in/go-playground/validator.v8" ) const ( @@ -42,6 +40,10 @@ type StructValidator interface { // If the struct is not valid or the validation itself fails, a descriptive error should be returned. // Otherwise nil must be returned. ValidateStruct(interface{}) error + + // Engine returns the underlying validator engine which powers the + // StructValidator implementation. + Engine() interface{} } // Validator is the default validator which implements the StructValidator @@ -89,18 +91,3 @@ func validate(obj interface{}) error { } return Validator.ValidateStruct(obj) } - -// ValidatorEngine returns the underlying validator engine which powers the -// default Validator instance. This is useful if you want to register custom -// validations or struct level validations. See validator GoDoc for more info - -// https://godoc.org/gopkg.in/go-playground/validator.v8 -func ValidatorEngine() *validator.Validate { - if Validator == nil { - return nil - } - if v, ok := Validator.(*defaultValidator); ok { - v.lazyinit() - return v.validate - } - return nil -} diff --git a/binding/default_validator.go b/binding/default_validator.go index 19885f16..c67aa8a3 100644 --- a/binding/default_validator.go +++ b/binding/default_validator.go @@ -28,6 +28,15 @@ func (v *defaultValidator) ValidateStruct(obj interface{}) error { return nil } +// Engine returns the underlying validator engine which powers the default +// Validator instance. This is useful if you want to register custom validations +// or struct level validations. See validator GoDoc for more info - +// https://godoc.org/gopkg.in/go-playground/validator.v8 +func (v *defaultValidator) Engine() interface{} { + v.lazyinit() + return v.validate +} + func (v *defaultValidator) lazyinit() { v.once.Do(func() { config := &validator.Config{TagName: "binding"} diff --git a/binding/validate_test.go b/binding/validate_test.go index 76ef89c3..cb76063c 100644 --- a/binding/validate_test.go +++ b/binding/validate_test.go @@ -218,8 +218,8 @@ func TestValidatorEngine(t *testing.T) { // This validates that the function `notOne` matches // the expected function signature by `defaultValidator` // and by extension the validator library. - engine := ValidatorEngine() - assert.NotNil(t, engine) + engine, ok := Validator.Engine().(*validator.Validate) + assert.True(t, ok) err := engine.RegisterValidation("notone", notOne) // Check that we can register custom validation without error diff --git a/examples/custom-validation/server.go b/examples/custom-validation/server.go index 28cdad97..dea0c302 100644 --- a/examples/custom-validation/server.go +++ b/examples/custom-validation/server.go @@ -30,11 +30,11 @@ func bookableDate( func main() { route := gin.Default() - v := binding.ValidatorEngine() - if v == nil { - panic("validator engine is nil") + + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + v.RegisterValidation("bookabledate", bookableDate) } - v.RegisterValidation("bookabledate", bookableDate) + route.GET("/bookable", getBookable) route.Run(":8085") } diff --git a/examples/struct-lvl-validations/server.go b/examples/struct-lvl-validations/server.go index 2027940e..be807b78 100644 --- a/examples/struct-lvl-validations/server.go +++ b/examples/struct-lvl-validations/server.go @@ -42,11 +42,11 @@ func UserStructLevelValidation(v *validator.Validate, structLevel *validator.Str func main() { route := gin.Default() - v := binding.ValidatorEngine() - if v == nil { - panic("validator engine is nil") + + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + v.RegisterStructValidation(UserStructLevelValidation, User{}) } - v.RegisterStructValidation(UserStructLevelValidation, User{}) + route.POST("/user", validateUser) route.Run(":8085") }