summaryrefslogtreecommitdiff
path: root/vendor/github.com/authzed/zed/internal/printers/tree.go
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
committermo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
commit20ef0d92694465ac86b550df139e8366a0a2b4fa (patch)
tree3f14589e1ce6eb9306a3af31c3a1f9e1af5ed637 /vendor/github.com/authzed/zed/internal/printers/tree.go
parent44e0d272c040cdc53a98b9f1dc58ae7da67752e6 (diff)
feat: connect to spicedb
Diffstat (limited to 'vendor/github.com/authzed/zed/internal/printers/tree.go')
-rw-r--r--vendor/github.com/authzed/zed/internal/printers/tree.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/vendor/github.com/authzed/zed/internal/printers/tree.go b/vendor/github.com/authzed/zed/internal/printers/tree.go
new file mode 100644
index 0000000..b787210
--- /dev/null
+++ b/vendor/github.com/authzed/zed/internal/printers/tree.go
@@ -0,0 +1,66 @@
+package printers
+
+import (
+ "fmt"
+
+ "github.com/jzelinskie/stringz"
+
+ v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
+)
+
+func prettySubject(subj *v1.SubjectReference) string {
+ if subj.OptionalRelation == "" {
+ return fmt.Sprintf(
+ "%s:%s",
+ stringz.TrimPrefixIndex(subj.Object.ObjectType, "/"),
+ subj.Object.ObjectId,
+ )
+ }
+ return fmt.Sprintf(
+ "%s:%s->%s",
+ stringz.TrimPrefixIndex(subj.Object.ObjectType, "/"),
+ subj.Object.ObjectId,
+ subj.OptionalRelation,
+ )
+}
+
+// TreeNodeTree walks an Authzed Tree Node and creates corresponding nodes
+// for a treeprinter.
+func TreeNodeTree(tp *TreePrinter, treeNode *v1.PermissionRelationshipTree) {
+ if treeNode.ExpandedObject != nil {
+ tp = tp.Child(fmt.Sprintf(
+ "%s:%s->%s",
+ stringz.TrimPrefixIndex(treeNode.ExpandedObject.ObjectType, "/"),
+ treeNode.ExpandedObject.ObjectId,
+ treeNode.ExpandedRelation,
+ ))
+ }
+ switch typed := treeNode.TreeType.(type) {
+ case *v1.PermissionRelationshipTree_Intermediate:
+ switch typed.Intermediate.Operation {
+ case v1.AlgebraicSubjectSet_OPERATION_UNION:
+ union := tp.Child("union")
+ for _, child := range typed.Intermediate.Children {
+ TreeNodeTree(union, child)
+ }
+ case v1.AlgebraicSubjectSet_OPERATION_INTERSECTION:
+ intersection := tp.Child("intersection")
+ for _, child := range typed.Intermediate.Children {
+ TreeNodeTree(intersection, child)
+ }
+ case v1.AlgebraicSubjectSet_OPERATION_EXCLUSION:
+ exclusion := tp.Child("exclusion")
+ for _, child := range typed.Intermediate.Children {
+ TreeNodeTree(exclusion, child)
+ }
+ default:
+ panic("unknown expand operation")
+ }
+ case *v1.PermissionRelationshipTree_Leaf:
+ for _, subject := range typed.Leaf.Subjects {
+ tp.Child(prettySubject(subject))
+ }
+ default:
+ panic("unknown TreeNode type")
+ }
+}