// Copyright 2022 Terin Stock. // SPDX-License-Identifier: MPL-2.0 package cgit import ( "fmt" "log/slog" "net/http" "net/http/cgi" "path/filepath" "go.terinstock.com/cgit-httpd/server" ) type Options struct { CGI string ReposRoot string AssetsDir string ConfigFile string Logger *slog.Logger } type Builder struct { handler *cgi.Handler register Register assetsDir string } type Register interface { Register(path string, handler http.Handler) } func New(options Options) *Builder { return &Builder{ handler: &cgi.Handler{ Path: options.CGI, Dir: options.ReposRoot, Env: []string{ fmt.Sprintf("CGIT_CONFIG=%s", options.ConfigFile), }, Logger: slog.NewLogLogger(options.Logger.Handler(), slog.LevelInfo), }, assetsDir: options.AssetsDir, } } func (b *Builder) WithRegister(r Register) *Builder { b.register = r return b } func (b *Builder) Build() (http.Handler, error) { for _, a := range []string{"cgit.css", "cgit.png", "cgit.ico", "robots.txt"} { b.register.Register("/"+a, server.FileHandler(filepath.Join(b.assetsDir, a))) } b.register.Register("/{_:.*}", b.handler) return b.handler, nil }