From 86cd57f5f8782e3f899df5810254dd87b987e242 Mon Sep 17 00:00:00 2001 From: mae Date: Sun, 8 Mar 2026 22:28:08 -0500 Subject: [PATCH] cmd/pkgserver: add command handler --- cmd/pkgserver/main.go | 80 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/cmd/pkgserver/main.go b/cmd/pkgserver/main.go index 1cb0738..afbeaca 100644 --- a/cmd/pkgserver/main.go +++ b/cmd/pkgserver/main.go @@ -1,9 +1,20 @@ package main import ( + "context" "embed" "fmt" + "log" "net/http" + "os" + "os/signal" + "syscall" + + "hakurei.app/command" + "hakurei.app/container/check" + "hakurei.app/internal/pkg" + "hakurei.app/internal/rosa" + "hakurei.app/message" ) //go:generate sh -c "sass ui/static/dark.scss ui/static/dark.css && sass ui/static/light.scss ui/static/light.css && tsc ui/static/index.ts" @@ -43,13 +54,70 @@ func serveStaticContent(w http.ResponseWriter, r *http.Request) { } } -func serveAPI(w http.ResponseWriter, r *http.Request) { +func serveAPI(pi *PackageIndex) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) {} +} +type SortOrders int + +const ( + NameAscending SortOrders = iota + NameDescending +) + +type PackageIndex struct { + sorts [][]*pkg.Artifact +} + +func createPackageIndex(cache *pkg.Cache, report *rosa.Report) *PackageIndex { + return &PackageIndex{} } func main() { - http.HandleFunc("GET /{$}", serveWebUI) - http.HandleFunc("GET /favicon.ico", serveStaticContent) - http.HandleFunc("GET /static/", serveStaticContent) - http.HandleFunc("GET /api/", serveAPI) - http.ListenAndServe(":8067", nil) + log.SetFlags(0) + log.SetPrefix("pkgserver: ") + + var ( + flagBaseDir string + flagPort uint16 + ) + + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) + defer stop() + msg := message.New(log.Default()) + + c := command.New(os.Stderr, log.Printf, "pkgserver", func(args []string) error { + reportPath := args[0] + baseDir, err := check.NewAbs(flagBaseDir) + if err != nil { + return err + } + cache, err := pkg.Open(ctx, msg, 0, baseDir) + if err != nil { + return err + } + report, err := rosa.OpenReport(reportPath) + if err != nil { + return err + } + pi := 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) + return nil + }).Flag( + &flagBaseDir, + "b", command.StringFlag(""), + "base directory for cache", + ).Flag( + &flagPort, + "p", command.IntFlag(8067), + "http listen port", + ) + c.MustParse(os.Args[1:], func(e error) { + log.Fatal(e) + }) + }