...

Source file src/go.einride.tech/aip/filtering/walk.go

Documentation: go.einride.tech/aip/filtering

     1  package filtering
     2  
     3  import expr "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
     4  
     5  // WalkFunc is called for every expression while calling Walk.
     6  // Return false to stop Walk.
     7  type WalkFunc func(currExpr, parentExpr *expr.Expr) bool
     8  
     9  // Walk an expression in depth-first order.
    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  		// Nothing to do here.
    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