github.com/Desuuuu/genqlient@v0.5.3/generate/template.go (about)

     1  package generate
     2  
     3  import (
     4  	"embed"
     5  	"io"
     6  	"strings"
     7  	"text/template"
     8  )
     9  
    10  //go:embed *.tmpl
    11  var templates embed.FS
    12  
    13  func repeat(n int, s string) string {
    14  	var builder strings.Builder
    15  	for i := 0; i < n; i++ {
    16  		builder.WriteString(s)
    17  	}
    18  	return builder.String()
    19  }
    20  
    21  func intRange(n int) []int {
    22  	ret := make([]int, n)
    23  	for i := 0; i < n; i++ {
    24  		ret[i] = i
    25  	}
    26  	return ret
    27  }
    28  
    29  func sub(x, y int) int { return x - y }
    30  
    31  // render executes the given template with the funcs from this generator.
    32  func (g *generator) render(tmplRelFilename string, w io.Writer, data interface{}) error {
    33  	tmpl := g.templateCache[tmplRelFilename]
    34  	if tmpl == nil {
    35  		funcMap := template.FuncMap{
    36  			"ref":      g.ref,
    37  			"repeat":   repeat,
    38  			"intRange": intRange,
    39  			"sub":      sub,
    40  		}
    41  		var err error
    42  		tmpl, err = template.New(tmplRelFilename).Funcs(funcMap).ParseFS(templates, tmplRelFilename)
    43  		if err != nil {
    44  			return errorf(nil, "could not load template %v: %v", tmplRelFilename, err)
    45  		}
    46  		g.templateCache[tmplRelFilename] = tmpl
    47  	}
    48  	err := tmpl.Execute(w, data)
    49  	if err != nil {
    50  		return errorf(nil, "could not render template: %v", err)
    51  	}
    52  	return nil
    53  }