Files
path/op.go
Ian Gulliver f50e6e228c Module split
2023-04-20 18:01:36 +00:00

57 lines
1.1 KiB
Go

package path
import (
"strings"
)
func op(obj any, path string, matchStr string, cb func(any, any, string) bool) (bool, error) {
objVal, err := Get(obj, path)
if err != nil {
return false, err
}
matchVal, err := parse(matchStr, objVal)
if err != nil {
return false, err
}
if isSlice(objVal) {
return anyTrue(objVal, func(x any, _ int) bool { return cb(x, matchVal, matchStr) }), nil
}
return cb(objVal, matchVal, matchStr), nil
}
func opList(obj any, path string, matchStr string, cb func(any, any, string) bool) (bool, error) {
objVal, err := Get(obj, path)
if err != nil {
return false, err
}
if objVal == nil {
return false, nil
}
matchVal := []any{}
matchParts := strings.Split(matchStr, ",")
for _, matchPart := range matchParts {
matchTmp, err := parse(matchPart, objVal)
if err != nil {
return false, err
}
matchVal = append(matchVal, matchTmp)
}
return anyTrue(matchVal, func(y any, i int) bool {
str := matchParts[i]
if isSlice(objVal) {
return anyTrue(objVal, func(x any, _ int) bool { return cb(x, y, str) })
}
return cb(objVal, y, str)
}), nil
}