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