github.com/nathanstitt/genqlient@v0.3.1-0.20211028004951-a2bda3c41ab8/generate/template.go (about)

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