* convert all theme files to json * automatically discover extra themes in go backend * use zod * error tidy up * error tidy up p2 * generate theme json schema from zod * generate theme list at build time, don't do it at runtime * make name and id required in the theme schema
91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
//go:build ignore
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type Colors struct {
|
|
Mode string `json:"mode"`
|
|
}
|
|
|
|
type ThemeDefinition struct {
|
|
Colors Colors `json:"colors"`
|
|
Id string `json:"id"`
|
|
}
|
|
|
|
func main() {
|
|
themesPath := filepath.Join("..", "..", "..", "packages", "grafana-data", "src", "themes", "themeDefinitions")
|
|
|
|
// Check if the themes directory exists
|
|
if _, err := os.Stat(themesPath); os.IsNotExist(err) {
|
|
fmt.Fprintf(os.Stderr, "Themes directory not found: %s\n", themesPath)
|
|
os.Exit(1)
|
|
}
|
|
|
|
output := `// Code generated by go generate; DO NOT EDIT.
|
|
|
|
package pref
|
|
|
|
var themes = []ThemeDTO{
|
|
{ID: "light", Type: "light"},
|
|
{ID: "dark", Type: "dark"},
|
|
{ID: "system", Type: "dark"},
|
|
`
|
|
|
|
err := filepath.WalkDir(themesPath, func(path string, d os.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Only process json files
|
|
if d.IsDir() || !strings.HasSuffix(d.Name(), ".json") {
|
|
return nil
|
|
}
|
|
|
|
fileBytes, readErr := os.ReadFile(path)
|
|
if readErr != nil {
|
|
fmt.Fprintf(os.Stderr, "Error reading file %s: %v\n", path, readErr)
|
|
return nil // Continue processing other files
|
|
}
|
|
|
|
var themeDef ThemeDefinition
|
|
jsonErr := json.Unmarshal(fileBytes, &themeDef)
|
|
if jsonErr != nil {
|
|
fmt.Fprintf(os.Stderr, "Error parsing JSON from %s: %v\n", path, jsonErr)
|
|
return nil // Continue processing other files
|
|
}
|
|
|
|
themeId := themeDef.Id
|
|
themeType := "dark" // default fallback
|
|
if themeDef.Colors.Mode != "" {
|
|
themeType = themeDef.Colors.Mode
|
|
}
|
|
|
|
output += fmt.Sprintf("\t{ID: %q, Type: %q, IsExtra: true},\n", themeId, themeType)
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error walking themes directory: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
output += "}\n"
|
|
|
|
// Write the generated file
|
|
outputPath := filepath.Join("themes_generated.go")
|
|
if err := os.WriteFile(outputPath, []byte(output), 0644); err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error writing output file: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Printf("Successfully generated themes_generated.go\n")
|
|
}
|