package main import ( "cmp" "fmt" "slices" "hakurei.app/internal/pkg" "hakurei.app/internal/rosa" ) type SortOrders int const ( DeclarationAscending SortOrders = iota DeclarationDescending NameAscending NameDescending limitSortOrders ) type PackageIndex struct { sorts [limitSortOrders][rosa.PresetUnexportedStart]*PackageIndexEntry names map[string]*PackageIndexEntry } type PackageIndexEntry struct { Name string `json:"name"` Description string `json:"description,omitempty"` Website string `json:"website,omitempty"` Version string `json:"version"` Status string `json:"report,omitempty"` status []byte `json:"-"` } func createPackageIndex(cache *pkg.Cache, report *rosa.Report) (_ *PackageIndex, err error) { index := new(PackageIndex) index.names = make(map[string]*PackageIndexEntry, rosa.PresetUnexportedStart) work := make([]PackageIndexEntry, rosa.PresetUnexportedStart) defer report.HandleAccess(&err)() for p := range rosa.PresetUnexportedStart { m := rosa.GetMetadata(p) v := rosa.Std.Version(p) a := rosa.Std.Load(p) id := cache.Ident(a) st, n := report.ArtifactOf(id) var status []byte var statusUrl string if n < 1 { status = nil statusUrl = "" } else { status = st statusUrl = fmt.Sprintf("/api/status/%s.log", m.Name) } entry := PackageIndexEntry{ Name: m.Name, Description: m.Description, Website: m.Website, Version: v, Status: statusUrl, status: status, } work[p] = entry index.names[m.Name] = &entry } for i, p := range work { index.sorts[DeclarationAscending][i] = &p } slices.Reverse(work) for i, p := range work { index.sorts[DeclarationDescending][i] = &p } slices.SortFunc(work, func(a PackageIndexEntry, b PackageIndexEntry) int { return cmp.Compare(a.Name, b.Name) }) for i, p := range work { index.sorts[NameAscending][i] = &p } slices.Reverse(work) for i, p := range work { index.sorts[NameDescending][i] = &p } return index, err }