-
Notifications
You must be signed in to change notification settings - Fork 245
/
tree.go
50 lines (44 loc) · 1.66 KB
/
tree.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
package graph
import (
core "github.com/authzed/spicedb/pkg/proto/core/v1"
)
// Leaf constructs a RelationTupleTreeNode leaf.
func Leaf(start *core.ObjectAndRelation, subjects ...*core.DirectSubject) *core.RelationTupleTreeNode {
return &core.RelationTupleTreeNode{
NodeType: &core.RelationTupleTreeNode_LeafNode{
LeafNode: &core.DirectSubjects{
Subjects: subjects,
},
},
Expanded: start,
CaveatExpression: nil, // Set by caller if necessary
}
}
func setResult(
op core.SetOperationUserset_Operation,
start *core.ObjectAndRelation,
children []*core.RelationTupleTreeNode,
) *core.RelationTupleTreeNode {
return &core.RelationTupleTreeNode{
NodeType: &core.RelationTupleTreeNode_IntermediateNode{
IntermediateNode: &core.SetOperationUserset{
Operation: op,
ChildNodes: children,
},
},
Expanded: start,
CaveatExpression: nil, // Set by caller if necessary
}
}
// Union constructs a RelationTupleTreeNode union operation.
func Union(start *core.ObjectAndRelation, children ...*core.RelationTupleTreeNode) *core.RelationTupleTreeNode {
return setResult(core.SetOperationUserset_UNION, start, children)
}
// Intersection constructs a RelationTupleTreeNode intersection operation.
func Intersection(start *core.ObjectAndRelation, children ...*core.RelationTupleTreeNode) *core.RelationTupleTreeNode {
return setResult(core.SetOperationUserset_INTERSECTION, start, children)
}
// Exclusion constructs a RelationTupleTreeNode exclusion operation.
func Exclusion(start *core.ObjectAndRelation, children ...*core.RelationTupleTreeNode) *core.RelationTupleTreeNode {
return setResult(core.SetOperationUserset_EXCLUSION, start, children)
}