cmd/pkgserver: add createPackageIndex

This commit is contained in:
mae
2026-03-09 01:27:46 -05:00
committed by Ophestra
parent 1b2ba9242c
commit 0fce9d9f88

View File

@@ -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,