From 0f944f7a0e5a41cc95b907c417a0a3f8f1328362 Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 9 Mar 2026 01:27:46 -0500 Subject: [PATCH] cmd/pkgserver: add createPackageIndex --- cmd/pkgserver/main.go | 67 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/cmd/pkgserver/main.go b/cmd/pkgserver/main.go index afbeaca..de9734f 100644 --- a/cmd/pkgserver/main.go +++ b/cmd/pkgserver/main.go @@ -1,6 +1,7 @@ package main import ( + "cmp" "context" "embed" "fmt" @@ -8,7 +9,9 @@ import ( "net/http" "os" "os/signal" + "slices" "syscall" + "unique" "hakurei.app/command" "hakurei.app/container/check" @@ -61,16 +64,61 @@ func serveAPI(pi *PackageIndex) func(w http.ResponseWriter, r *http.Request) { type SortOrders int const ( - NameAscending SortOrders = iota + DeclarationDescending SortOrders = iota + DeclarationAscending + NameAscending NameDescending + limitSortOrders ) -type PackageIndex struct { - sorts [][]*pkg.Artifact +type PackageIndex [limitSortOrders][rosa.PresetUnexportedStart]*PackageIndexEntry + +type PackageIndexEntry struct { + id unique.Handle[pkg.ID] + name string + description string + website string + version string + status []byte } func createPackageIndex(cache *pkg.Cache, report *rosa.Report) *PackageIndex { - return &PackageIndex{} + var index PackageIndex + var work []PackageIndexEntry + for p := range rosa.PresetUnexportedStart { + m := rosa.GetMetadata(p) + v := rosa.Std.Version(p) + a := rosa.Std.Load(p) + id := cache.Ident(a) + status, n := report.ArtifactOf(id) + work[p] = PackageIndexEntry{ + id: id, + name: m.Name, + description: m.Description, + website: m.Website, + version: v, + status: status[:n], + } + } + for i, p := range work { + index[DeclarationAscending][i] = &p + } + slices.Reverse(work) + for i, p := range work { + index[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[NameAscending][i] = &p + } + slices.Reverse(work) + for i, p := range work { + index[NameDescending][i] = &p + } + + return &index } func main() { log.SetFlags(0) @@ -99,13 +147,16 @@ func main() { if err != nil { return err } - pi := createPackageIndex(cache, report) - + defer report.HandleAccess(&err)() + index := createPackageIndex(cache, report) http.HandleFunc("GET /{$}", serveWebUI) http.HandleFunc("GET /favicon.ico", serveStaticContent) http.HandleFunc("GET /static/", serveStaticContent) - http.HandleFunc("GET /api/", serveAPI(pi)) - http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil) + http.HandleFunc("GET /api/", serveAPI(index)) + err = http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil) + if err != nil { + return err + } return nil }).Flag( &flagBaseDir,