From f46da91d9f82fb5ccdc68415089975b33ac60168 Mon Sep 17 00:00:00 2001 From: Sergei Zyubin Date: Mon, 23 Feb 2026 09:54:41 +0100 Subject: [PATCH] build: generate drivers with std lib only --- Makefile | 1 - drivers_gen.go | 96 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 75 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index dfbb99e4..89a25b1a 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,6 @@ build: promu drivers-%: @echo ">> generating drivers.go with selected drivers" - @$(GO) get github.com/dave/jennifer/jen @$(GO) run drivers_gen.go -- $* @$(GO) get ./... @$(GO) mod tidy diff --git a/drivers_gen.go b/drivers_gen.go index 1fa29697..85c4ca2f 100644 --- a/drivers_gen.go +++ b/drivers_gen.go @@ -3,15 +3,16 @@ package main import ( + "bytes" "fmt" + "go/format" "os" - - . "github.com/dave/jennifer/jen" + "sort" ) const ( - packageName string = "sql_exporter" - filename string = "drivers.go" + packageName = "sql_exporter" + filename = "drivers.go" ) var driverList = map[string][]string{ @@ -33,37 +34,90 @@ var driverList = map[string][]string{ } func main() { - var enabledDrivers []string - - args := os.Args[2:] + // Accept either os.Args[2:] (keeps compatibility with previous usage) + // or os.Args[1:] (simple "go run drivers_gen.go minimal") + var args []string + if len(os.Args) >= 3 { + args = os.Args[2:] + } else { + args = os.Args[1:] + } - if args[0] == "all" { + if len(args) == 0 { + fmt.Printf("Usage: go run drivers_gen.go \nAvailable keys:\n") + // Print keys in deterministic order + keys := make([]string, 0, len(driverList)) for k := range driverList { - if k != "custom" { - enabledDrivers = append(enabledDrivers, driverList[k]...) + keys = append(keys, k) + } + fmt.Printf(" - all\n") + for _, k := range keys { + fmt.Printf(" - %s\n", k) + } + os.Exit(1) + } + + key := args[0] + var enabledDrivers []string + + if key == "all" { + for k, list := range driverList { + if k == "custom" { + continue } + enabledDrivers = append(enabledDrivers, list...) } } else { - var ok bool - enabledDrivers, ok = driverList[args[0]] + list, ok := driverList[key] if !ok { - fmt.Printf("Nonexistent key. Do nothing.\n") + fmt.Printf("Nonexistent key '%s'. Do nothing.\n", key) os.Exit(0) } + enabledDrivers = append(enabledDrivers, list...) } - f := NewFile(packageName) - f.HeaderComment("// Code generated by \"drivers_gen.go\"") - f.Anon(enabledDrivers...) - fmt.Println("Following drivers are to be added:") + if len(enabledDrivers) == 0 { + fmt.Println("No drivers selected; nothing to do.") + os.Exit(0) + } - for _, v := range enabledDrivers { - fmt.Printf("> %s\n", v) + // Create file contents + var b bytes.Buffer + fmt.Fprintf(&b, "// Code generated by \"drivers_gen.go\"\n\n") + fmt.Fprintf(&b, "package %s\n\n", packageName) + fmt.Fprintf(&b, "import (\n") + // Keep order stable and de-duplicate just in case + seen := map[string]bool{} + for _, d := range enabledDrivers { + seen[d] = true } + unique := make([]string, 0, len(seen)) + for d := range seen { + unique = append(unique, d) + } + sort.Strings(unique) + for _, d := range unique { + fmt.Fprintf(&b, "\t_ %q\n", d) + } + fmt.Fprintf(&b, ")\n") + // Format using gofmt + src, err := format.Source(b.Bytes()) + if err != nil { + // If formatting fails, write the unformatted source and print a warning + fmt.Println("warning: go/format failed:", err) + src = b.Bytes() + } + + // Print what will be written + fmt.Println("Following drivers are to be added:") + for _, v := range unique { + fmt.Printf("> %s\n", v) + } fmt.Printf("Save to '%s'\n", filename) - if err := f.Save(filename); err != nil { - fmt.Println(err.Error()) + + if err := os.WriteFile(filename, src, 0644); err != nil { + fmt.Println("error writing file:", err) os.Exit(1) } }