package arcast import ( "embed" "encoding/json" "io/fs" "path/filepath" "forge.cadoles.com/arcad/arcast/pkg/server" "github.com/pkg/errors" ) var ( DefaultApps []server.App //go:embed apps/** appsFS embed.FS ) func init() { defaultApps, err := loadApps("apps/*") if err != nil { panic(errors.WithStack(err)) } DefaultApps = defaultApps } func loadApps(dirPattern string) ([]server.App, error) { apps := make([]server.App, 0) files, err := fs.Glob(appsFS, dirPattern) if err != nil { return nil, errors.WithStack(err) } for _, f := range files { stat, err := fs.Stat(appsFS, f) if err != nil { return nil, errors.WithStack(err) } if !stat.IsDir() { continue } rawManifest, err := fs.ReadFile(appsFS, filepath.Join(f, "manifest.json")) if err != nil { return nil, errors.WithStack(err) } var app server.App if err := json.Unmarshal(rawManifest, &app); err != nil { return nil, errors.WithStack(err) } app.ID = filepath.Base(f) fs, err := fs.Sub(appsFS, "apps/"+app.ID) if err != nil { return nil, errors.WithStack(err) } app.FS = fs apps = append(apps, app) } return apps, nil }