mirror of
https://github.com/1Panel-dev/KubePi.git
synced 2025-10-05 07:16:55 +08:00
119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
package storm
|
|
|
|
import (
|
|
"github.com/asdine/storm/v3/q"
|
|
"go/token"
|
|
"reflect"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type contains struct {
|
|
val interface{}
|
|
}
|
|
|
|
func (c *contains) MatchField(v interface{}) (bool, error) {
|
|
refV := reflect.ValueOf(v)
|
|
if refV.Kind() != reflect.Slice {
|
|
return false, nil
|
|
}
|
|
t := token.EQL
|
|
for i := 0; i < refV.Len(); i++ {
|
|
if compare(c.val, refV.Index(i).Interface(), t) {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func Contains(fieldName string, val interface{}) q.Matcher {
|
|
return q.NewFieldMatcher(fieldName, &contains{val: val})
|
|
}
|
|
|
|
type arrayValueLike struct {
|
|
val string
|
|
}
|
|
|
|
func (a *arrayValueLike) MatchField(v interface{}) (bool, error) {
|
|
refV := reflect.ValueOf(v)
|
|
if refV.Kind() != reflect.Slice {
|
|
return false, nil
|
|
}
|
|
vs := strings.Split(a.val, ",")
|
|
for i := range vs {
|
|
var flag = false
|
|
for j := 0; j < refV.Len(); j++ {
|
|
v, ok := refV.Index(j).Interface().(string)
|
|
if ok {
|
|
if v == vs[i] {
|
|
flag = true
|
|
}
|
|
}
|
|
}
|
|
if !flag {
|
|
return false, nil
|
|
}
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func ArrayValueLike(fieldName, val string) q.Matcher {
|
|
return q.NewFieldMatcher(fieldName, &arrayValueLike{val: val})
|
|
}
|
|
|
|
type arrayValueEq struct {
|
|
val string
|
|
}
|
|
|
|
func (c *arrayValueEq) MatchField(v interface{}) (bool, error) {
|
|
refV := reflect.ValueOf(v)
|
|
if refV.Kind() != reflect.Slice {
|
|
return false, nil
|
|
}
|
|
valArray := strings.Split(c.val, ",")
|
|
if len(valArray) != refV.Len() {
|
|
return false, nil
|
|
}
|
|
|
|
var fieldArray []string
|
|
for i := 0; i < refV.Len(); i++ {
|
|
if refV.Index(i).Kind() == reflect.String {
|
|
fieldArray = append(fieldArray, refV.Index(i).Interface().(string))
|
|
} else {
|
|
return false, nil
|
|
}
|
|
}
|
|
sort.Strings(fieldArray)
|
|
sort.Strings(valArray)
|
|
|
|
for i := range fieldArray {
|
|
if fieldArray[i] != valArray[i] {
|
|
return false, nil
|
|
}
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func ArrayValueEq(fieldName, val string) q.Matcher {
|
|
return q.NewFieldMatcher(fieldName, &arrayValueEq{val: val})
|
|
}
|
|
|
|
type like struct {
|
|
val string
|
|
}
|
|
|
|
func (l *like) MatchField(v interface{}) (bool, error) {
|
|
refV := reflect.ValueOf(v)
|
|
if refV.Kind() == reflect.String {
|
|
vs := v.(string)
|
|
if strings.Contains(vs, l.val) {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func Like(fieldName string, val string) q.Matcher {
|
|
return q.NewFieldMatcher(fieldName, &like{val: val})
|
|
}
|