...
1 package filtering
2
3 import expr "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
4
5
6
7 type WalkFunc func(currExpr, parentExpr *expr.Expr) bool
8
9
10 func Walk(fn WalkFunc, currExpr *expr.Expr) {
11 walk(fn, currExpr, nil)
12 }
13
14 func walk(fn WalkFunc, currExpr, parentExpr *expr.Expr) {
15 if fn == nil || currExpr == nil {
16 return
17 }
18 if ok := fn(currExpr, parentExpr); !ok {
19 return
20 }
21 switch v := currExpr.GetExprKind().(type) {
22 case *expr.Expr_ConstExpr, *expr.Expr_IdentExpr:
23
24 case *expr.Expr_SelectExpr:
25 walk(fn, v.SelectExpr.GetOperand(), currExpr)
26 case *expr.Expr_CallExpr:
27 walk(fn, v.CallExpr.GetTarget(), currExpr)
28 for _, arg := range v.CallExpr.GetArgs() {
29 walk(fn, arg, currExpr)
30 }
31 case *expr.Expr_ListExpr:
32 for _, el := range v.ListExpr.GetElements() {
33 walk(fn, el, currExpr)
34 }
35 case *expr.Expr_StructExpr:
36 for _, entry := range v.StructExpr.GetEntries() {
37 walk(fn, entry.GetValue(), currExpr)
38 }
39 case *expr.Expr_ComprehensionExpr:
40 walk(fn, v.ComprehensionExpr.GetIterRange(), currExpr)
41 walk(fn, v.ComprehensionExpr.GetAccuInit(), currExpr)
42 walk(fn, v.ComprehensionExpr.GetLoopCondition(), currExpr)
43 walk(fn, v.ComprehensionExpr.GetLoopStep(), currExpr)
44 walk(fn, v.ComprehensionExpr.GetResult(), currExpr)
45 }
46 }
47
View as plain text