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) }