gitee.com/quant1x/engine@v1.8.4/config/range.go (about)

     1  package config
     2  
     3  import (
     4  	"gitee.com/quant1x/gox/exception"
     5  	"gitee.com/quant1x/gox/logger"
     6  	"gitee.com/quant1x/num"
     7  	"regexp"
     8  	"strings"
     9  	_ "unsafe"
    10  )
    11  
    12  // 正则表达式
    13  var (
    14  	// 值范围正则表达式
    15  	valueRangePattern = "[~]\\s*"
    16  	valueRangeRegexp  = regexp.MustCompile(valueRangePattern)
    17  
    18  	// 数组正则表达式
    19  	arrayPattern = "[,]\\s*"
    20  	arrayRegexp  = regexp.MustCompile(arrayPattern)
    21  )
    22  
    23  // 错误信息
    24  var (
    25  	errnoConfig    = 0
    26  	ErrRangeFormat = exception.New(errnoConfig+0, "数值范围格式错误")
    27  )
    28  
    29  type ValueType interface {
    30  	~int | ~float64 | ~string
    31  }
    32  
    33  func ParseRange[T ValueType](text string) ValueRange[T] {
    34  	text = strings.TrimSpace(text)
    35  	arr := valueRangeRegexp.Split(text, -1)
    36  	if len(arr) != 2 {
    37  		logger.Fatalf("text=%s, %+v", text, ErrTimeFormat)
    38  	}
    39  	var begin, end T
    40  	begin = num.GenericParse[T](strings.TrimSpace(arr[0]))
    41  	end = num.GenericParse[T](strings.TrimSpace(arr[1]))
    42  	if begin > end {
    43  		begin, end = end, begin
    44  	}
    45  	r := ValueRange[T]{
    46  		begin: begin,
    47  		end:   end,
    48  	}
    49  	return r
    50  }
    51  
    52  // ValueRange 数值范围
    53  type ValueRange[T ValueType] struct {
    54  	begin T // 最小值
    55  	end   T // 最大值
    56  }
    57  
    58  // In 检查是否包含在范围内
    59  func (r ValueRange[T]) In(v T) bool {
    60  	if v < r.begin || v > r.end {
    61  		return false
    62  	}
    63  	return true
    64  }