github.com/qiniu/go-sdk/v7@v7.27.0/pili/validate.go (about) 1 package pili 2 3 import ( 4 "net/http" 5 "reflect" 6 "sync" 7 8 "github.com/go-playground/validator/v10" 9 ) 10 11 const ( 12 TagName = "validate" 13 ) 14 15 var defaultValidator = &Validator{} 16 17 type Validator struct { 18 once sync.Once 19 validate *validator.Validate 20 } 21 22 // Validate 参数验证 23 func (v *Validator) Validate(obj interface{}) error { 24 if obj == nil { 25 return nil 26 } 27 value := reflect.ValueOf(obj) 28 switch value.Kind() { 29 case reflect.Ptr: 30 return v.Validate(value.Elem().Interface()) 31 case reflect.Slice, reflect.Array: 32 for i := 0; i < value.Len(); i++ { 33 if err := v.Validate(value.Index(i).Interface()); err != nil { 34 return err 35 } 36 } 37 case reflect.Struct: 38 v.lazyInit() 39 if err := v.validate.Struct(obj); err != nil { 40 return ErrInfo(http.StatusBadRequest, err.Error()) 41 } 42 } 43 44 return nil 45 } 46 47 // lazyInit 延迟初始化 48 func (v *Validator) lazyInit() { 49 v.once.Do(func() { 50 v.validate = validator.New() 51 v.validate.SetTagName(TagName) 52 }) 53 }