2025-04-01 10:38:02 +09:00

59 lines
1.6 KiB
Go

package schema
import (
_ "embed"
"fmt"
openfgav1 "github.com/openfga/api/proto/openfga/v1"
language "github.com/openfga/language/pkg/go/transformer"
"google.golang.org/protobuf/encoding/protojson"
)
func TransformModulesToModel(modules []language.ModuleFile) (*openfgav1.AuthorizationModel, error) {
parsedAuthModel, err := language.TransformModuleFilesToModel(modules, "1.2")
if err != nil {
return nil, fmt.Errorf("failed to transform dsl to model: %w", err)
}
return parsedAuthModel, nil
}
func TransformDSLToModel(dsl string) (*openfgav1.AuthorizationModel, error) {
parsedAuthModel, err := language.TransformDSLToProto(dsl)
if err != nil {
return nil, fmt.Errorf("failed to transform dsl to model: %w", err)
}
return parsedAuthModel, nil
}
func TransformToDSL(model *openfgav1.AuthorizationModel, opts ...language.TransformOption) (string, error) {
return language.TransformJSONProtoToDSL(model, opts...)
}
// EqualModels compares two authorization models.
// Id is not comparing since model loaded from disk doesn't contain Id.
func EqualModels(a, b *openfgav1.AuthorizationModel) bool {
aCopy := openfgav1.AuthorizationModel{
SchemaVersion: a.SchemaVersion,
TypeDefinitions: a.TypeDefinitions,
Conditions: a.Conditions,
}
aJSONBytes, err := protojson.Marshal(&aCopy)
if err != nil {
return false
}
bCopy := openfgav1.AuthorizationModel{
SchemaVersion: b.SchemaVersion,
TypeDefinitions: b.TypeDefinitions,
Conditions: b.Conditions,
}
bJSONBytes, err := protojson.Marshal(&bCopy)
if err != nil {
return false
}
return string(aJSONBytes) == string(bJSONBytes)
}