Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
96 changes: 75 additions & 21 deletions drivers_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -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 <key>\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)
}
}
Loading