## Summary: Steve pointed out (#73) that having genqlient with no arguments silently use a default config file was a bit confusing, and changed it to use `genqlient.yaml` by default (#74). Mark pointed out (#76) that this makes it a bit less convenient when you're starting from scratch; you have to go create a config file. In this commit I add a new init flag that creates you a config file before using it. Originally the suggestion was to use subcommands, e.g. we'd have `genqlient init` and `genqlient generate` and so on. But I couldn't think of anything else we might want subcommands for in the future, and it felt a little silly to make you type `generate` each time. So instead, I made it a flag, which has the nice property that you can do `genqlient --init` and it will generate and then use a config file. (I mean, maybe it will immediately crash because you don't have a schema, but hopefully that's still a useful clue as to what to do next!) The implmentation was fairly trivial. Since we now have a nice way to generate a default config, I removed the default values for most of the options; I've always felt they were probably more confusing than helpful. (And indeed, all the users I know of (Khan/webapp, and the much smaller project Steve was working on, are setting those options explicitly.) This required a slight change to the syntax to say "don't use context", which is probably also net clearer. I decided this is also a good time to pull in a proper CLI parser (#31); see ADR-504 for more on that choice. This also adds some nice help messages! Fixes #76, #31. Issue: https://github.com/Khan/genqlient/issues/76 ## Test plan: ``` go run . go run . --init go run . --init example/genqlient.yaml # refuses to clobber go run . --init example/newgenqlient.yaml ``` Author: benjaminjkraft Reviewers: dnerdy, aberkan, MiguelCastillo, StevenACoffman Required Reviewers: Approved By: dnerdy Checks: ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Lint, ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Lint Pull Request URL: https://github.com/Khan/genqlient/pull/81
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package generate
|
|
|
|
import (
|
|
"io"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
var (
|
|
// TODO(benkraft): Embed templates into the binary, see
|
|
// https://github.com/Khan/genqlient/issues/9.
|
|
_, thisFilename, _, _ = runtime.Caller(0)
|
|
thisDir = filepath.Dir(thisFilename)
|
|
)
|
|
|
|
func repeat(n int, s string) string {
|
|
var builder strings.Builder
|
|
for i := 0; i < n; i++ {
|
|
builder.WriteString(s)
|
|
}
|
|
return builder.String()
|
|
}
|
|
|
|
func intRange(n int) []int {
|
|
ret := make([]int, n)
|
|
for i := 0; i < n; i++ {
|
|
ret[i] = i
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func sub(x, y int) int { return x - y }
|
|
|
|
// execute executes the given template with the funcs from this generator.
|
|
func (g *generator) execute(tmplRelFilename string, w io.Writer, data interface{}) error {
|
|
tmpl := g.templateCache[tmplRelFilename]
|
|
if tmpl == nil {
|
|
absFilename := filepath.Join(thisDir, tmplRelFilename)
|
|
funcMap := template.FuncMap{
|
|
"ref": g.ref,
|
|
"repeat": repeat,
|
|
"intRange": intRange,
|
|
"sub": sub,
|
|
}
|
|
var err error
|
|
tmpl, err = template.New(tmplRelFilename).Funcs(funcMap).ParseFiles(absFilename)
|
|
if err != nil {
|
|
return errorf(nil, "could not load template %v: %v", absFilename, err)
|
|
}
|
|
g.templateCache[tmplRelFilename] = tmpl
|
|
}
|
|
err := tmpl.Execute(w, data)
|
|
if err != nil {
|
|
return errorf(nil, "could not render template: %v", err)
|
|
}
|
|
return nil
|
|
}
|