| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | //go:build ignore
 | 
					
						
							|  |  |  | // +build ignore
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2023-05-10 07:13:45 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 	"embed" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path" | 
					
						
							|  |  |  | 	"sort" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"text/template" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-10 07:13:45 +08:00
										 |  |  | 	"github.com/grafana/codejen" | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 	dev_dashboards "github.com/grafana/grafana/devenv/dev-dashboards" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2022-11-11 17:19:29 +08:00
										 |  |  | 	OUTPUT_PATH = "dev-dashboards.libsonnet" | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 	EXCLUDE     = map[string]struct{}{ | 
					
						
							|  |  |  | 		"jsonnetfile.json":      {}, | 
					
						
							|  |  |  | 		"jsonnetfile.lock.json": {}, | 
					
						
							|  |  |  | 		"panel-library.json":    {}, // TODO: remove panel-library once importing issue is fixed
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //go:embed tmpl/*.tmpl
 | 
					
						
							|  |  |  | var tmplFS embed.FS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	g := newGen() | 
					
						
							|  |  |  | 	out, err := g.generate() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-05-10 07:13:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	f := codejen.NewFile(OUTPUT_PATH, []byte(out), dummyJenny{}) | 
					
						
							|  |  |  | 	fs := codejen.NewFS() | 
					
						
							|  |  |  | 	if err = fs.Add(*f); err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if _, set := os.LookupEnv("CODEGEN_VERIFY"); set { | 
					
						
							| 
									
										
										
										
											2023-05-10 07:13:45 +08:00
										 |  |  | 		err = fs.Verify(context.Background(), "") | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			fmt.Fprintf(os.Stderr, "generated code is not up to date:\n%s\nrun `make gen-jsonnet` to regenerate\n\n", err) | 
					
						
							|  |  |  | 			os.Exit(1) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2023-05-17 01:21:17 +08:00
										 |  |  | 		err = fs.Write(context.Background(), "") | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			fmt.Fprintf(os.Stderr, "error while writing generated code to disk:\n%s\n", err) | 
					
						
							|  |  |  | 			os.Exit(1) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type devDashboard struct { | 
					
						
							|  |  |  | 	Name string | 
					
						
							|  |  |  | 	Path string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type libjsonnetGen struct { | 
					
						
							|  |  |  | 	templates  *template.Template | 
					
						
							|  |  |  | 	dashboards []devDashboard | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func newGen() *libjsonnetGen { | 
					
						
							|  |  |  | 	tmpls := template.New("codegen") | 
					
						
							|  |  |  | 	tmpls = template.Must(tmpls.ParseFS(tmplFS, "tmpl/*.tmpl")) | 
					
						
							|  |  |  | 	return &libjsonnetGen{templates: tmpls} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (g *libjsonnetGen) generate() (string, error) { | 
					
						
							|  |  |  | 	buf := new(bytes.Buffer) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := g.readDir("."); err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 03:14:56 +08:00
										 |  |  | 	sort.SliceStable(g.dashboards, func(i, j int) bool { | 
					
						
							| 
									
										
										
										
											2022-11-03 23:04:39 +08:00
										 |  |  | 		return g.dashboards[i].Name < g.dashboards[j].Name | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vars := struct { | 
					
						
							|  |  |  | 		Dashboards []devDashboard | 
					
						
							|  |  |  | 	}{g.dashboards} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := g.templates.Lookup("gen.libsonnet.tmpl").Execute(buf, vars); err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return buf.String(), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (g *libjsonnetGen) readDir(dir string) error { | 
					
						
							|  |  |  | 	files, err := dev_dashboards.DevDashboardFS.ReadDir(dir) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, f := range files { | 
					
						
							|  |  |  | 		if _, skip := EXCLUDE[f.Name()]; skip { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if f.IsDir() { | 
					
						
							|  |  |  | 			if err := g.readDir(path.Join(dir, f.Name())); err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		name := strings.TrimSuffix(f.Name(), ".json") | 
					
						
							|  |  |  | 		if len(name) > 40 { | 
					
						
							|  |  |  | 			name = name[:40] | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		g.dashboards = append(g.dashboards, devDashboard{ | 
					
						
							|  |  |  | 			Path: path.Join(dir, f.Name()), | 
					
						
							|  |  |  | 			Name: name, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-10 07:13:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type dummyJenny struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (dummyJenny) JennyName() string { | 
					
						
							|  |  |  | 	return "dummyJenny" | 
					
						
							|  |  |  | } |