github.com/retailcrm/mg-bot-helper@v0.0.0-20201229112329-a17255681a84/src/validator.go (about)

     1  package main
     2  
     3  import (
     4  	"reflect"
     5  	"regexp"
     6  	"sync"
     7  
     8  	"github.com/gin-gonic/gin/binding"
     9  	"gopkg.in/go-playground/validator.v9"
    10  )
    11  
    12  var regCommandName = regexp.MustCompile(`^https://?[\da-z.-]+\.(retailcrm\.(ru|pro|es)|ecomlogic\.com|simlachat\.(com|ru))/?$`)
    13  
    14  type defaultValidator struct {
    15  	once     sync.Once
    16  	validate *validator.Validate
    17  }
    18  
    19  var _ binding.StructValidator = &defaultValidator{}
    20  
    21  func (v *defaultValidator) ValidateStruct(obj interface{}) error {
    22  
    23  	if kindOfData(obj) == reflect.Struct {
    24  		v.lazyinit()
    25  		if err := v.validate.Struct(obj); err != nil {
    26  			return error(err)
    27  		}
    28  	}
    29  
    30  	return nil
    31  }
    32  
    33  func (v *defaultValidator) Engine() interface{} {
    34  	v.lazyinit()
    35  	return v.validate
    36  }
    37  
    38  func (v *defaultValidator) lazyinit() {
    39  	v.once.Do(func() {
    40  		v.validate = validator.New()
    41  		v.validate.SetTagName("binding")
    42  	})
    43  }
    44  
    45  func kindOfData(data interface{}) reflect.Kind {
    46  	value := reflect.ValueOf(data)
    47  	valueType := value.Kind()
    48  
    49  	if valueType == reflect.Ptr {
    50  		valueType = value.Elem().Kind()
    51  	}
    52  	return valueType
    53  }
    54  
    55  func setValidation() {
    56  	binding.Validator = new(defaultValidator)
    57  
    58  	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
    59  		v.RegisterValidation("validatecrmurl", validateCrmURL)
    60  	}
    61  }
    62  
    63  func validateCrmURL(field validator.FieldLevel) bool {
    64  	return regCommandName.Match([]byte(field.Field().Interface().(string)))
    65  }