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 }