/
json.go
29 lines (26 loc) · 845 Bytes
/
json.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
package predicate
import (
"strings"
"k8s.io/apimachinery/pkg/util/json"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// ReadyWhen returns the provided wrapped predicate condition, passing the object specified
// by jsonPath to condition
func ReadyWhen(jsonPath string, condition func(v interface{}) bool) func(client.Object) bool {
return func(obj client.Object) bool {
parts := strings.Split(jsonPath, ".")
raw, err := json.Marshal(obj)
if err != nil {
panic(err)
}
m := make(map[string]interface{})
if err := json.Unmarshal(raw, &m); err != nil {
panic(err)
}
for _, part := range parts[:len(parts)-1] {
m = m[part].(map[string]interface{})
}
v := m[parts[len(parts)-1]]
return condition(v)
}
}