Files
upstream-mirror 9456a4e922
Some checks failed
CI / Run lints and checks (push) Failing after 47s
CI / Run tests (push) Failing after 1s
CI / Run race tests (push) Failing after 5s
CI / Build CLI docs (push) Has been skipped
CI / Run buf actions (push) Failing after 5s
CodeQL / Analyze (go) (push) Failing after 3s
CodeQL / Analyze (javascript) (push) Failing after 2s
Docker Image Scanners / scanners (push) Failing after 3s
Format / format (push) Failing after 3s
Synchronize Issue Labels / Synchronize Issue Labels (push) Has been skipped
CI / Generate release (push) Has been skipped
CI / Draft newsletter (push) Has been skipped
CI / Pending approval Slack notification (push) Has been skipped
CI / Send newsletter (push) Has been skipped
snapshot of https://github.com/ory/keto.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 01:08:34 +05:00

115 lines
2.3 KiB
Go

// Copyright © 2023 Ory Corp
// SPDX-License-Identifier: Apache-2.0
package relationtuple
import (
"encoding/json"
rts "github.com/ory/keto/gen/go/ory/keto/relation_tuples/v1alpha2"
"github.com/ory/keto/ketoapi"
)
type (
Collection struct {
apiRelations []*ketoapi.RelationTuple
}
OutputTuple struct {
*ketoapi.RelationTuple
}
)
func NewProtoCollection(rels []*rts.RelationTuple) (*Collection, error) {
r := &Collection{apiRelations: make([]*ketoapi.RelationTuple, len(rels))}
for i, rel := range rels {
var err error
r.apiRelations[i], err = (&ketoapi.RelationTuple{}).FromDataProvider(rel)
if err != nil {
return nil, err
}
}
return r, nil
}
func MustNewProtoCollection(rels []*rts.RelationTuple) *Collection {
c, err := NewProtoCollection(rels)
if err != nil {
panic(err)
}
return c
}
func NewAPICollection(rels []*ketoapi.RelationTuple) *Collection {
return &Collection{apiRelations: rels}
}
func (r *Collection) Header() []string {
return []string{
"NAMESPACE",
"OBJECT",
"RELATION NAME",
"SUBJECT",
}
}
func (r *Collection) Table() [][]string {
ir := r.apiRelations
data := make([][]string, len(ir))
for i, rel := range ir {
var sub string
if rel.SubjectID != nil {
sub = *rel.SubjectID
} else {
sub = rel.SubjectSet.String()
}
data[i] = []string{rel.Namespace, rel.Object, rel.Relation, sub}
}
return data
}
func (r *Collection) Interface() any { return r.apiRelations }
func (r *Collection) UnmarshalJSON(raw []byte) error { return json.Unmarshal(raw, &r.apiRelations) }
func (r *Collection) Len() int { return len(r.apiRelations) }
func (r *Collection) MarshalJSON() ([]byte, error) {
ir := r.apiRelations
return json.Marshal(ir)
}
func (r *Collection) IDs() []string {
ts := r.apiRelations
ids := make([]string, len(ts))
for i, rt := range ts {
ids[i] = rt.String()
}
return ids
}
func (r *OutputTuple) Header() []string {
return []string{
"NAMESPACE",
"OBJECT ID",
"RELATION NAME",
"SUBJECT",
}
}
func (r *OutputTuple) Columns() []string {
return []string{
r.Namespace,
r.Object,
r.Relation,
outputSubject(r.RelationTuple),
}
}
func outputSubject(r *ketoapi.RelationTuple) string {
if r.SubjectID != nil {
return *r.SubjectID
}
return r.SubjectSet.String()
}