mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			135 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
//go:build ignore
 | 
						|
// +build ignore
 | 
						|
 | 
						|
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"context"
 | 
						|
	"embed"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"path"
 | 
						|
	"sort"
 | 
						|
	"strings"
 | 
						|
	"text/template"
 | 
						|
 | 
						|
	"github.com/grafana/codejen"
 | 
						|
	dev_dashboards "github.com/grafana/grafana/devenv/dev-dashboards"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	OUTPUT_PATH = "dev-dashboards.libsonnet"
 | 
						|
	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)
 | 
						|
	}
 | 
						|
 | 
						|
	f := codejen.NewFile(OUTPUT_PATH, []byte(out), dummyJenny{})
 | 
						|
	fs := codejen.NewFS()
 | 
						|
	if err = fs.Add(*f); err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
 | 
						|
	if _, set := os.LookupEnv("CODEGEN_VERIFY"); set {
 | 
						|
		err = fs.Verify(context.Background(), "")
 | 
						|
		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 {
 | 
						|
		err = fs.Write(context.Background(), "")
 | 
						|
		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
 | 
						|
	}
 | 
						|
 | 
						|
	sort.SliceStable(g.dashboards, func(i, j int) bool {
 | 
						|
		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
 | 
						|
}
 | 
						|
 | 
						|
type dummyJenny struct{}
 | 
						|
 | 
						|
func (dummyJenny) JennyName() string {
 | 
						|
	return "dummyJenny"
 | 
						|
}
 |