about summary refs log tree commit diff
path: root/handlers/cgit/cgit.go
blob: d97101249150174c3361877841440d94338a984c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright 2022 Terin Stock.
// SPDX-License-Identifier: MPL-2.0

package cgit

import (
	"fmt"
	"log"
	"net/http"
	"net/http/cgi"
	"path/filepath"

	"github.com/rs/zerolog"
	"go.terinstock.com/cgit-httpd/server"
)

type Options struct {
	CGI        string
	ReposRoot  string
	AssetsDir  string
	ConfigFile string
	Logger     zerolog.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: log.New(options.Logger, "", 0),
			Stderr: options.Logger.Level(zerolog.ErrorLevel),
		},
	}
}

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
}