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 package main
import ( import (
"cmp"
"context" "context"
"embed" "embed"
"fmt" "fmt"
@@ -8,7 +9,9 @@ import (
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"slices"
"syscall" "syscall"
"unique"
"hakurei.app/command" "hakurei.app/command"
"hakurei.app/container/check" "hakurei.app/container/check"
@@ -61,16 +64,61 @@ func serveAPI(pi *PackageIndex) func(w http.ResponseWriter, r *http.Request) {
type SortOrders int type SortOrders int
const ( const (
NameAscending SortOrders = iota DeclarationDescending SortOrders = iota
DeclarationAscending
NameAscending
NameDescending NameDescending
limitSortOrders
) )
type PackageIndex struct { type PackageIndex [limitSortOrders][rosa.PresetUnexportedStart]*PackageIndexEntry
sorts [][]*pkg.Artifact
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 { 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() { func main() {
log.SetFlags(0) log.SetFlags(0)
@@ -99,13 +147,16 @@ func main() {
if err != nil { if err != nil {
return err return err
} }
pi := createPackageIndex(cache, report) defer report.HandleAccess(&err)()
index := createPackageIndex(cache, report)
http.HandleFunc("GET /{$}", serveWebUI) http.HandleFunc("GET /{$}", serveWebUI)
http.HandleFunc("GET /favicon.ico", serveStaticContent) http.HandleFunc("GET /favicon.ico", serveStaticContent)
http.HandleFunc("GET /static/", serveStaticContent) http.HandleFunc("GET /static/", serveStaticContent)
http.HandleFunc("GET /api/", serveAPI(pi)) http.HandleFunc("GET /api/", serveAPI(index))
http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil) err = http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil)
if err != nil {
return err
}
return nil return nil
}).Flag( }).Flag(
&flagBaseDir, &flagBaseDir,