text: package validator
  
  
  import (
  	"reflect"
  	"sync"
  
  	"github.com/gin-gonic/gin/binding"
  	"gopkg.in/go-playground/validator.v9"
  )
  // Setup v8 to v9
  func Setup() {
  	binding.Validator = new(defaultValidator)
  }
  
  
  type defaultValidator struct {
  	once     sync.Once
  	validate *validator.Validate
  }
  
  var _ binding.StructValidator = &defaultValidator{}
  
  func (v *defaultValidator) ValidateStruct(obj interface{}) error {
  
  	if kindOfData(obj) == reflect.Struct {
  
  		v.lazyinit()
  
  		if err := v.validate.Struct(obj); err != nil {
  			return error(err)
  		}
  	}
  
  	return nil
  }
  
  func (v *defaultValidator) Engine() interface{} {
  	v.lazyinit()
  	return v.validate
  }
  
  func (v *defaultValidator) lazyinit() {
  	v.once.Do(func() {
  		v.validate = validator.New()
  		v.validate.SetTagName("binding")
  
  		// add any custom validations etc. here
  	})
  }
  
  func kindOfData(data interface{}) reflect.Kind {
  
  	value := reflect.ValueOf(data)
  	valueType := value.Kind()
  
  	if valueType == reflect.Ptr {
  		valueType = value.Elem().Kind()
  	}
  	return valueType
  }