github.com/go-graphite/carbonapi@v0.17.0/internal/generateRewriteFuncs/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 rewrite
    38  
    39  import (
    40  	"sort"
    41  	"strings"
    42  
    43  	"github.com/go-graphite/carbonapi/expr/interfaces"
    44  	"github.com/go-graphite/carbonapi/expr/metadata"`)
    45  	for _, m := range funcs {
    46  		fmt.Fprintf(writer, "	\"github.com/go-graphite/carbonapi/expr/rewrite/%s\"\n", m)
    47  	}
    48  	fmt.Fprintf(writer, `)
    49  
    50  type initFunc struct {
    51  	name     string
    52  	filename string
    53  	order    interfaces.Order
    54  	f        func(configFile string) []interfaces.RewriteFunctionMetadata
    55  }
    56  
    57  func New(configs map[string]string) {
    58  	funcs := []initFunc{`)
    59  	for _, m := range funcs {
    60  		fmt.Fprintf(writer, `
    61  		{name: "%s", filename: "%s", order: %s.GetOrder(), f: %s.New},`, m, m, m, m)
    62  
    63  	}
    64  
    65  	fmt.Fprintln(writer, `
    66  	}
    67  
    68  	sort.Slice(funcs, func(i, j int) bool {
    69  		if funcs[i].order == interfaces.Any && funcs[j].order == interfaces.Last {
    70  			return true
    71  		}
    72  		if funcs[i].order == interfaces.Last && funcs[j].order == interfaces.Any {
    73  			return false
    74  		}
    75  		return funcs[i].name > funcs[j].name
    76  	})
    77  
    78  	for _, f := range funcs {
    79  		md := f.f(configs[strings.ToLower(f.name)])
    80  		for _, m := range md {
    81  			metadata.RegisterRewriteFunctionWithFilename(m.Name, f.filename, m.F)
    82  		}
    83  	}
    84  }`)
    85  
    86  	err = writer.Flush()
    87  	if err != nil {
    88  		log.Fatal(err)
    89  	}
    90  
    91  	f, err := os.OpenFile("glue.go", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
    92  	if err != nil {
    93  		log.Fatal(err)
    94  	}
    95  
    96  	f.Write(b.Bytes())
    97  
    98  	f.Close()
    99  }