summaryrefslogtreecommitdiff
path: root/vendor/github.com/authzed/spicedb/pkg/caveats/structure.go
blob: d27602ace905acb0a41f4e56f1f8e242829a3b76 (plain)
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
package caveats

import (
	"fmt"

	exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"

	"github.com/authzed/spicedb/pkg/genutil/mapz"
)

// referencedParameters traverses the expression given and finds all parameters which are referenced
// in the expression for the purpose of usage tracking.
func referencedParameters(definedParameters *mapz.Set[string], expr *exprpb.Expr, referencedParams *mapz.Set[string]) {
	if expr == nil {
		return
	}

	switch t := expr.ExprKind.(type) {
	case *exprpb.Expr_ConstExpr:
		// nothing to do

	case *exprpb.Expr_IdentExpr:
		if definedParameters.Has(t.IdentExpr.Name) {
			referencedParams.Add(t.IdentExpr.Name)
		}

	case *exprpb.Expr_SelectExpr:
		referencedParameters(definedParameters, t.SelectExpr.Operand, referencedParams)

	case *exprpb.Expr_CallExpr:
		referencedParameters(definedParameters, t.CallExpr.Target, referencedParams)
		for _, arg := range t.CallExpr.Args {
			referencedParameters(definedParameters, arg, referencedParams)
		}

	case *exprpb.Expr_ListExpr:
		for _, elem := range t.ListExpr.Elements {
			referencedParameters(definedParameters, elem, referencedParams)
		}

	case *exprpb.Expr_StructExpr:
		for _, entry := range t.StructExpr.Entries {
			referencedParameters(definedParameters, entry.Value, referencedParams)
		}

	case *exprpb.Expr_ComprehensionExpr:
		referencedParameters(definedParameters, t.ComprehensionExpr.AccuInit, referencedParams)
		referencedParameters(definedParameters, t.ComprehensionExpr.IterRange, referencedParams)
		referencedParameters(definedParameters, t.ComprehensionExpr.LoopCondition, referencedParams)
		referencedParameters(definedParameters, t.ComprehensionExpr.LoopStep, referencedParams)
		referencedParameters(definedParameters, t.ComprehensionExpr.Result, referencedParams)

	default:
		panic(fmt.Sprintf("unknown CEL expression kind: %T", t))
	}
}