Files
KubePi/pkg/storm/matcher.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})
}