Goofing around with code generation

which feels crazy brittle so far and I'm thinking I'd rather do with
ast/parser stuff.
This commit is contained in:
Dan Buch 2012-12-24 15:38:32 -05:00
parent 3dd1fc9635
commit 58272a076a
2 changed files with 61 additions and 18 deletions

View File

@ -1,11 +1,11 @@
package smplt package smplt
import ( import (
"bufio"
"io" "io"
"mime" "mime"
"path" "path"
"strings" "strings"
"text/template"
) )
const ( const (
@ -15,6 +15,35 @@ const (
SIMPLATE_TYPE_JSON = "json" SIMPLATE_TYPE_JSON = "json"
) )
var (
simplateGenFileTmpl = template.Must(template.New("smpltgen").Parse(strings.Replace(`
/* GENERATED FILE - DO NOT EDIT */
/* Rebuild with simplate filesystem parsing thingy! */
package smpltgen
import (
"text/template"
)
{{.InitPage.Body}}
const (
SIMPLATE_TMPL_{{.ConstName}} = __BACKTICK__{{.TemplatePage.Body}}__BACKTICK__
)
var (
simplateTmpl{{.FuncName}} = template.Must(template.New("{{.FuncName}}").Parse(SIMPLATE_TMPL_{{.ConstName}}))
)
func SimplateHandlerFunc{{.FuncName}}(w http.ResponseWriter, req *http.Request) {
{{range .LogicPages}}
{{.Body}}
{{end}}
}
`, "__BACKTICK__", "`", -1)))
)
type Simplate struct { type Simplate struct {
Filename string Filename string
Type string Type string
@ -67,19 +96,13 @@ func SimplateFromString(filename, content string) *Simplate {
} }
func (me *Simplate) Execute(wr io.Writer) error { func (me *Simplate) Execute(wr io.Writer) error {
outbuf := bufio.NewWriter(wr) return simplateGenFileTmpl.Execute(wr, me)
}
_, err := outbuf.WriteString("package smplt_gen\n") func (me *Simplate) escapedFilename() string {
if err != nil { lessDots := strings.Replace(me.Filename, ".", "-DOT-", -1)
return err lessSlashes := strings.Replace(lessDots, "/", "-SLASH-", -1)
} return strings.Replace(lessSlashes, " ", "-SPACE-", -1)
err = outbuf.Flush()
if err != nil {
return err
}
return nil
} }
func (me *Simplate) OutputName() string { func (me *Simplate) OutputName() string {
@ -87,8 +110,24 @@ func (me *Simplate) OutputName() string {
return me.Filename return me.Filename
} }
lessDots := strings.Replace(me.Filename, ".", "-DOT-", -1) return me.escapedFilename() + ".go"
lessSlashes := strings.Replace(lessDots, "/", "-SLASH-", -1) }
lessSpaces := strings.Replace(lessSlashes, " ", "-SPACE-", -1)
return lessSpaces + ".go" func (me *Simplate) FuncName() string {
escaped := me.escapedFilename()
parts := strings.Split(escaped, "-")
for i, part := range parts {
var capitalized []string
capitalized = append(capitalized, strings.ToUpper(string(part[0])))
capitalized = append(capitalized, strings.ToLower(part[1:]))
parts[i] = strings.Join(capitalized, "")
}
return strings.Join(parts, "")
}
func (me *Simplate) ConstName() string {
escaped := me.escapedFilename()
uppered := strings.ToUpper(escaped)
return strings.Replace(uppered, "-", "_", -1)
} }

View File

@ -241,7 +241,11 @@ func TestRenderedSimplateCanExecuteToWriter(t *testing.T) {
func TestRenderedSimplateOutputIsValidGoSource(t *testing.T) { func TestRenderedSimplateOutputIsValidGoSource(t *testing.T) {
mkTmpDir() mkTmpDir()
if len(os.Getenv("SMPLT_TEST_NOCLEANUP")) > 0 {
fmt.Println("tmpdir =", tmpdir)
} else {
defer rmTmpDir() defer rmTmpDir()
}
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE) s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
outfile_name := path.Join(tmpdir, s.OutputName()) outfile_name := path.Join(tmpdir, s.OutputName())