github.com/go-graphite/carbonapi@v0.17.0/internal/generateFuncs/gen.go (about) 1 //go:build ignore 2 // +build ignore 3 4 package main 5 6 import ( 7 "bufio" 8 "bytes" 9 "fmt" 10 "log" 11 "os" 12 "strings" 13 ) 14 15 func main() { 16 files, err := os.ReadDir("./") 17 if err != nil { 18 log.Fatal(err) 19 } 20 21 funcs := make([]string, 0) 22 for _, f := range files { 23 name := f.Name() 24 if strings.Contains(name, ".go") { 25 continue 26 } 27 if name == "example" { 28 continue 29 } 30 31 funcs = append(funcs, name) 32 } 33 34 var b bytes.Buffer 35 writer := bufio.NewWriter(&b) 36 37 fmt.Fprintln(writer, `package functions 38 39 import ( 40 "sort" 41 "strings" 42 `) 43 for _, m := range funcs { 44 if m == "config" { 45 continue 46 } 47 fmt.Fprintf(writer, " \"github.com/go-graphite/carbonapi/expr/functions/%s\"\n", m) 48 } 49 fmt.Fprintf(writer, ` "github.com/go-graphite/carbonapi/expr/interfaces" 50 "github.com/go-graphite/carbonapi/expr/metadata" 51 ) 52 53 type initFunc struct { 54 name string 55 filename string 56 order interfaces.Order 57 f func(configFile string) []interfaces.FunctionMetadata 58 } 59 60 func New(configs map[string]string) { 61 funcs := []initFunc{`) 62 for _, m := range funcs { 63 if m == "config" { 64 continue 65 } 66 fmt.Fprintf(writer, ` 67 {name: "%s", filename: "%s", order: %s.GetOrder(), f: %s.New},`, m, m, m, m) 68 69 } 70 71 fmt.Fprintln(writer, ` 72 } 73 74 sort.Slice(funcs, func(i, j int) bool { 75 if funcs[i].order == interfaces.Any && funcs[j].order == interfaces.Last { 76 return true 77 } 78 if funcs[i].order == interfaces.Last && funcs[j].order == interfaces.Any { 79 return false 80 } 81 return funcs[i].name > funcs[j].name 82 }) 83 84 for _, f := range funcs { 85 md := f.f(configs[strings.ToLower(f.name)]) 86 for _, m := range md { 87 metadata.RegisterFunctionWithFilename(m.Name, f.filename, m.F) 88 } 89 } 90 }`) 91 92 err = writer.Flush() 93 if err != nil { 94 log.Fatal(err) 95 } 96 97 f, err := os.OpenFile("glue.go", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) 98 if err != nil { 99 log.Fatal(err) 100 } 101 102 f.Write(b.Bytes()) 103 104 f.Close() 105 }