all repos — gopkgs @ d378084c72c2d3b7b198838357b17f279e506453

Go module vanity import paths

main.go (view raw)

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package main

import (
	"fmt"
	"log"
	"net/url"
	"os"
	"path/filepath"

	"go.alanpearce.eu/gomponents"
	"gopkg.in/yaml.v3"
)

type URL struct {
	*url.URL
}

func (u *URL) UnmarshalYAML(value *yaml.Node) (err error) {
	var s string
	if err := value.Decode(&s); err != nil {
		return err
	}
	u.URL, err = url.Parse(s)
	return err
}

type Config struct {
	Title    string
	Domain   URL
	Forge    URL
	Menu     []*MenuLink
	Packages []string
}

type MenuLink struct {
	Name string
	URL  URL
}

func must[T any](t T, err error) T {
	if err != nil {
		panic(err)
	}
	return t
}

func fatal(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

func importString(config *Config, pkg string) string {
	return fmt.Sprintf("%s git %s",
		config.Domain.JoinPath(pkg),
		config.Forge.JoinPath(pkg),
	)
}

func sourceString(config *Config, pkg string) string {
	return fmt.Sprintf("%s _ %s %s",
		config.Domain.JoinPath(pkg),
		config.Forge.JoinPath(pkg).String()+"/tree/main{/dir}",
		config.Forge.JoinPath(pkg).String()+"/tree/main{/dir}/{file}#n{line}",
	)
}

func godocURL(config *Config, pkg string) string {
	return must(url.JoinPath("https://pkg.go.dev", packageImportPath(config, pkg)))
}

func badgeURL(config *Config, pkg string) string {
	return must(url.JoinPath("https://pkg.go.dev/badge/", packageImportPath(config, pkg)))
}

func packageImportPath(config *Config, pkg string) string {
	return config.Domain.JoinPath(pkg).String()
}

func packageForgeURL(config *Config, pkg string) string {
	return config.Forge.JoinPath(pkg).String()
}

func getConfig(filename string) (cfg *Config, err error) {
	cfg = new(Config)
	file, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer file.Close()
	dec := yaml.NewDecoder(file)
	dec.KnownFields(true)
	err = dec.Decode(cfg)
	if err != nil {
		return nil, err
	}

	return cfg, nil
}

const destDir = "dist"

func renderToFile(c gomponents.Node, filename string) error {
	pathname := filepath.Join(destDir, filename)
	err := os.MkdirAll(filepath.Dir(pathname), 0755)
	if err != nil {
		return err
	}
	file, err := os.Create(pathname)
	if err != nil {
		return err
	}
	defer file.Close()

	return c.Render(file)
}

func main() {
	cfg, err := getConfig("vanity.yaml")
	fatal(err)

	err = renderToFile(
		ListPage(cfg),
		"index.html",
	)
	fatal(err)

	for _, pkg := range cfg.Packages {
		err = renderToFile(
			PackagePage(cfg, pkg),
			filepath.Join(pkg, "index.html"),
		)
		fatal(err)
	}
}