github.com/profzone/eden-framework@v1.0.10/pkg/validate/validatetpl/slice.go (about)

     1  package validatetpl
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  func NewValidateSlice(min uint64, max uint64, elemValidateFunc func(v interface{}) (bool, string)) func(v interface{}) (bool, string) {
     9  	return func(v interface{}) (bool, string) {
    10  		if reflect.TypeOf(v).Kind() == reflect.Slice {
    11  			sliceValue := reflect.ValueOf(v)
    12  			elemCount := sliceValue.Len()
    13  			if uint64(elemCount) < min || (max > 0 && uint64(elemCount) > max) {
    14  				return false, fmt.Sprintf(SLICE_ELEM_NUM_NOT_IN_RANGE, min, max, elemCount)
    15  			}
    16  			if elemValidateFunc != nil {
    17  				for i := 0; i < elemCount; i++ {
    18  					elemValue := sliceValue.Index(i)
    19  					if ok, errMsg := elemValidateFunc(elemValue.Interface()); !ok {
    20  						return false, fmt.Sprintf(SLICE_ELEM_INVALID, errMsg)
    21  					}
    22  				}
    23  			}
    24  			return true, ""
    25  		}
    26  		return false, TYPE_NOT_SLICE
    27  	}
    28  }