package dynamic import ( "fmt" "os" settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" utils "github.com/DegustatorPonos/RuinesOfRafdolon/Utils" rl "github.com/gen2brain/raylib-go/raylib" ) // The collection of all avaliable packages that are loaded in the system type PackageManager struct { AvaliablePackages map[string]Package } var Manager *PackageManager = nil func loadPackages() (*PackageManager, error) { var dir, dirErr = os.ReadDir(settings.Current.PackagesLocation) if dirErr != nil { return nil, dirErr } var outp = PackageManager{ AvaliablePackages: make(map[string]Package), } for _, v := range dir { var packagePath = utils.JoinFileLocation(settings.Current.PackagesLocation, v.Name()) var newPackage, packageErr = ReadPackage(v) if packageErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load the module %v: %s", packagePath, packageErr.Error()) continue } newPackage.location = packagePath // Do not change this order - some descriptors rely on other newPackage.ReadTextures() newPackage.ReadObjects() newPackage.ReadWorlds() outp.AvaliablePackages[newPackage.Description.Name] = *newPackage rl.TraceLog(rl.LogInfo, "Loaded the module %s", newPackage.Description.Name) } return &outp, nil } // Loads the packages from the specified in settings directory. Panics on serious error func Init() { var manager, err = loadPackages() if err != nil { panic(fmt.Sprintf("Failed to load packages: %v", err.Error())) } Manager = manager } func (base *PackageManager) GetPackage(packageName string) (*Package, error) { var pack, exists = base.AvaliablePackages[packageName] if !exists { return nil, fmt.Errorf("Failed to load package: no such package") } return &pack, nil }