The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/plugins/gen.go

86 lines
2.4 KiB

//go:build ignore
// +build ignore
//go:generate go run gen.go
package main
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"github.com/grafana/codejen"
corecodegen "github.com/grafana/grafana/pkg/codegen"
"github.com/grafana/grafana/pkg/plugins/codegen"
"github.com/grafana/grafana/pkg/plugins/pfs"
)
var skipPlugins = map[string]bool{
"influxdb": true, // plugin.json fails validation (defaultMatchFormat)
"mixed": true, // plugin.json fails validation (mixed)
"opentsdb": true, // plugin.json fails validation (defaultMatchFormat)
}
const sep = string(filepath.Separator)
func main() {
if len(os.Args) > 1 {
log.Fatal(fmt.Errorf("plugin thema code generator does not currently accept any arguments\n, got %q", os.Args))
}
cwd, err := os.Getwd()
if err != nil {
log.Fatal(fmt.Errorf("could not get working directory: %s", err))
}
groot := filepath.Clean(filepath.Join(cwd, "../../.."))
pluginKindGen := codejen.JennyListWithNamer(func(d *pfs.PluginDecl) string {
return d.PluginMeta.Id
})
pluginKindGen.Append(
&codegen.PluginRegistryJenny{},
codegen.PluginGoTypesJenny("pkg/tsdb"),
codegen.PluginTSTypesJenny("public/app/plugins"),
)
pluginKindGen.AddPostprocessors(corecodegen.SlashHeaderMapper("public/app/plugins/gen.go"), splitSchiffer())
declParser := pfs.NewDeclParser(skipPlugins)
decls, err := declParser.Parse(os.DirFS(cwd))
if err != nil {
log.Fatalln(fmt.Errorf("parsing plugins in dir failed %s: %s", cwd, err))
}
jfs, err := pluginKindGen.GenerateFS(decls...)
if err != nil {
log.Fatalln(fmt.Errorf("error writing files to disk: %s", err))
}
if _, set := os.LookupEnv("CODEGEN_VERIFY"); set {
if err = jfs.Verify(context.Background(), groot); err != nil {
log.Fatal(fmt.Errorf("generated code is out of sync with inputs:\n%s\nrun `make gen-cue` to regenerate", err))
}
} else if err = jfs.Write(context.Background(), groot); err != nil {
log.Fatal(fmt.Errorf("error while writing generated code to disk:\n%s", err))
}
}
func splitSchiffer() codejen.FileMapper {
names := []string{"panelcfg", "dataquery"}
return func(f codejen.File) (codejen.File, error) {
// TODO it's terrible that this has to exist, CODEJEN NEEDS TO BE BETTER
path := filepath.ToSlash(f.RelativePath)
for _, name := range names {
if idx := strings.Index(path, name); idx != -1 {
f.RelativePath = fmt.Sprintf("%s/%s", path[:idx], path[idx:])
break
}
}
return f, nil
}
}