package spicedb
import (
"embed"
"fmt"
"io/fs"
"sort"
"strings"
"gopkg.in/yaml.v2"
)
var bootstrapFiles embed.FS
type File struct {
Name string
Data string
}
type SpiceDBSchema struct {
Schema string `yaml:"schema"`
Relationships string `yaml:"relationships"`
}
func GetBootstrapFiles() ([]File, error) {
files, err := fs.ReadDir(bootstrapFiles, "schema")
if err != nil {
return nil, fmt.Errorf("failed to read bootstrap files: %w", err)
}
var filesWithContents []File
for _, f := range files {
b, err := fs.ReadFile(bootstrapFiles, fmt.Sprintf("%s/%s", "schema", f.Name()))
if err != nil {
return nil, err
}
var schema SpiceDBSchema
err = yaml.Unmarshal(b, &schema)
if err != nil {
return nil, fmt.Errorf("failed to parse file %s as yaml: %w", f.Name(), err)
}
data, err := yaml.Marshal(SpiceDBSchema{
Schema: schema.Schema,
})
if err != nil {
return nil, fmt.Errorf("failed to serialize contents: %w", err)
}
filesWithContents = append(filesWithContents, File{
Name: f.Name(),
Data: string(data),
})
}
sort.Slice(filesWithContents, func(i, j int) bool {
return strings.Compare(filesWithContents[i].Name, filesWithContents[j].Name) == -1
})
return filesWithContents, nil
}