-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.go
68 lines (59 loc) · 1.32 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package opslevel_k8s_controller
import (
"encoding/json"
"strconv"
opslevel_jq_parser "github.com/opslevel/opslevel-jq-parser/v2024"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type K8SResource struct {
Metadata v1.ObjectMeta `json:"metadata"`
}
type K8SFilter struct {
namespaces []string
parser *opslevel_jq_parser.JQArrayParser
}
func NewK8SFilter(selector K8SSelector) *K8SFilter {
return &K8SFilter{
namespaces: selector.Namespaces,
parser: opslevel_jq_parser.NewJQArrayParser(selector.Excludes),
}
}
func (f *K8SFilter) MatchesNamespace(data any) bool {
j, err := json.Marshal(data)
if err != nil {
return false
}
if len(f.namespaces) <= 0 {
return true
}
var res K8SResource
if err = json.Unmarshal(j, &res); err == nil {
for _, namespace := range f.namespaces {
if res.Metadata.Namespace == namespace {
return true
}
}
}
return false
}
func (f *K8SFilter) MatchesFilter(data any) bool {
j, err := json.Marshal(data)
if err != nil {
return false
}
// TODO: handle error
results, _ := f.parser.Run(string(j))
return anyIsTrue(results)
}
func anyIsTrue(results []string) bool {
for _, result := range results {
boolValue, err := strconv.ParseBool(result)
if err != nil {
return false // TODO: is this a good idea?
}
if boolValue {
return true
}
}
return false
}