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 }