55 "fmt"
66
77 core "github.com/authzed/spicedb/pkg/proto/core/v1"
8+ "github.com/authzed/spicedb/pkg/schemadsl/compiler"
89)
910
1011// ToDefinitions converts a Schema to the full set of namespace and caveat definitions.
@@ -61,8 +62,17 @@ func defToRelations(def *Definition) ([]*core.Relation, error) {
6162
6263 // Convert relations
6364 for _ , rel := range def .relations {
65+ // Ensure metadata has RelationKind set to RELATION
66+ relMetadata := rel .metadata
67+ if relMetadata == nil {
68+ relMetadata = NewMetadata ()
69+ }
70+ if relMetadata .RelationKind () == RelationKindUnknown {
71+ relMetadata = relMetadata .WithRelationKind (RelationKindRelation )
72+ }
73+
6474 // Encode metadata
65- metadata , err := encodeMetadata (rel . metadata )
75+ metadata , err := encodeMetadata (relMetadata )
6676 if err != nil {
6777 return nil , fmt .Errorf ("failed to encode relation metadata for %s: %w" , rel .name , err )
6878 }
@@ -81,9 +91,17 @@ func defToRelations(def *Definition) ([]*core.Relation, error) {
8191 return nil , fmt .Errorf ("failed to convert permission %s: %w" , perm .name , err )
8292 }
8393
94+ // Create metadata marking this as a permission
95+ permMetadata := NewMetadata ().WithRelationKind (RelationKindPermission )
96+ encodedMetadata , err := encodeMetadata (permMetadata )
97+ if err != nil {
98+ return nil , fmt .Errorf ("failed to encode permission metadata for %s: %w" , perm .name , err )
99+ }
100+
84101 relations = append (relations , & core.Relation {
85102 Name : perm .name ,
86103 UsersetRewrite : rewrite ,
104+ Metadata : encodedMetadata ,
87105 })
88106 }
89107
@@ -460,3 +478,27 @@ func functionTypeToCore(ft FunctionType) core.FunctionedTupleToUserset_Function
460478 return core .FunctionedTupleToUserset_FUNCTION_ANY
461479 }
462480}
481+
482+ // AsCompiledSchema converts a Schema to a CompiledSchema by calling ToDefinitions
483+ // and creating a compiled schema structure.
484+ func (s * Schema ) AsCompiledSchema () (* compiler.CompiledSchema , error ) {
485+ namespaces , caveats , err := s .ToDefinitions ()
486+ if err != nil {
487+ return nil , err
488+ }
489+
490+ // Build ordered definitions by combining namespaces and caveats
491+ orderedDefinitions := make ([]compiler.SchemaDefinition , 0 , len (namespaces )+ len (caveats ))
492+ for _ , ns := range namespaces {
493+ orderedDefinitions = append (orderedDefinitions , ns )
494+ }
495+ for _ , caveat := range caveats {
496+ orderedDefinitions = append (orderedDefinitions , caveat )
497+ }
498+
499+ return & compiler.CompiledSchema {
500+ ObjectDefinitions : namespaces ,
501+ CaveatDefinitions : caveats ,
502+ OrderedDefinitions : orderedDefinitions ,
503+ }, nil
504+ }
0 commit comments