penguin/AstroJS

Javascript framework for my blog

resolver-go/cmd/botan-gen/main.go

raw ยท 1816 bytes

package main

import (
	"flag"
	"fmt"
	"go/format"
	"os"
	"strings"

	"github.com/tgckpg/botanres-go/internal/classmap"
)

func main() {
	src := flag.String("src", "./src", "BotanJS source root")
	out := flag.String("out", "internal/generated/classmap_gen.go", "generated Go output")
	pkg := flag.String("pkg", "generated", "generated package name")
	flag.Parse()

	m, err := classmap.Build(*src)
	if err != nil {
		fatal(err)
	}
	if err := os.MkdirAll(dir(*out), 0o755); err != nil {
		fatal(err)
	}
	code := render(*pkg, m)
	fmted, err := format.Source([]byte(code))
	if err != nil {
		_, _ = os.Stderr.WriteString(code)
		fatal(err)
	}
	if err := os.WriteFile(*out, fmted, 0o644); err != nil {
		fatal(err)
	}
}

func render(pkg string, m *classmap.Map) string {
	var b strings.Builder
	b.WriteString("// Code generated by botan-gen; DO NOT EDIT.\n")
	b.WriteString("package " + pkg + "\n\n")
	b.WriteString("import \"github.com/tgckpg/botanres-go/internal/classmap\"\n\n")
	b.WriteString("var ClassMap = &classmap.Map{\nSymbols: map[string]classmap.Symbol{\n")
	for _, s := range classmap.SortedSymbols(m) {
		fmt.Fprintf(&b, "%q: {Name:%q, Kind:%q, Parent:%q, Imports:%#v, Resource: classmap.Resource{Src:%q, JSHash:%q, CSSHash:%q}},\n",
			s.Name, s.Name, string(s.Kind), s.Parent, s.Imports, s.Resource.Src, s.Resource.JSHash, s.Resource.CSSHash)
	}
	b.WriteString("},\nFiles: map[string]classmap.Resource{\n")
	for _, r := range classmap.SortedFiles(m) {
		fmt.Fprintf(&b, "%q: {Src:%q, JSHash:%q, CSSHash:%q},\n", r.Src, r.Src, r.JSHash, r.CSSHash)
	}
	b.WriteString("},\n}\n")
	return b.String()
}

func dir(path string) string {
	idx := strings.LastIndexAny(path, `/\\`)
	if idx < 0 {
		return "."
	}
	return path[:idx]
}

func fatal(err error) {
	fmt.Fprintln(os.Stderr, "botan-gen:", err)
	os.Exit(1)
}