lipgloss-catppuccin/tool/generate.go
2025-06-08 14:07:05 -04:00

129 lines
2.2 KiB
Go

package main
import (
"bytes"
_ "embed"
"encoding/json"
"flag"
"go/format"
"os"
"strings"
"text/template"
)
//go:embed template.gotmpl
var tmpl string
type hsl struct {
H float64 `json:"h"`
S float64 `json:"s"`
L float64 `json:"l"`
}
type rgb struct {
R float64 `json:"r"`
G float64 `json:"g"`
B float64 `json:"b"`
}
type paletteColor struct {
Name string `json:"name"`
Order uint `json:"order"`
Hex string `json:"hex"`
RGB rgb `json:"rgb"`
HSL hsl `json:"hsl"`
Accent bool `json:"accent"`
}
func (c paletteColor) VarName() string {
return strings.Join(strings.Split(c.Name, " "), "")
}
type palette struct {
Name string `json:"name"`
Emoji string `json:"emoji"`
Order int `json:"order"`
Dark bool `json:"dark"`
Colors map[string]paletteColor `json:"colors"`
VarName string
}
type paletteFile struct {
Version string `json:"version"`
Latte palette `json:"latte"`
Frappe palette `json:"frappe"`
Macchiato palette `json:"macchiato"`
Mocha palette `json:"mocha"`
}
func exists(file string) bool {
_, err := os.Stat(file)
if err != nil {
}
return !os.IsNotExist(err)
}
func main() {
flag.Parse()
if !exists("palette.json") {
os.Exit(1)
}
f, err := os.Open("palette.json")
if err != nil {
panic(err)
}
var paletteFile paletteFile
err = json.NewDecoder(f).Decode(&paletteFile)
if err != nil {
panic(err)
}
buf := new(bytes.Buffer)
funcs := template.FuncMap{
"palettes": func() map[string]palette {
return map[string]palette{
"Latte": paletteFile.Latte,
"Frappe": paletteFile.Frappe,
"Macchiato": paletteFile.Macchiato,
"Mocha": paletteFile.Mocha,
}
},
"colorVars": func() []string {
keys := make([]string, len(paletteFile.Latte.Colors))
for _, c := range paletteFile.Latte.Colors {
keys[c.Order] = c.VarName()
}
return keys
},
}
t, err := template.New("").Funcs(funcs).Parse(tmpl)
if err != nil {
panic(err)
}
err = t.Execute(buf, nil)
if err != nil {
panic(err)
}
bs, err := format.Source(buf.Bytes())
if err != nil {
panic(err)
}
f, err = os.Create("colors.go")
if err != nil {
panic(err)
}
f.Write(bs)
}