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  }