tartrazine/internal/code-generator/generator/generator.go

63 lines
1.8 KiB
Go
Raw Normal View History

// Package generator provides facilities to generate Go code for the
// package data in enry from YAML files describing supported languages in Linguist.
2017-04-04 11:10:35 +00:00
package generator
import (
"fmt"
2017-04-04 11:10:35 +00:00
"go/format"
"io"
2017-04-04 11:10:35 +00:00
"io/ioutil"
"path/filepath"
"strings"
"text/template"
2017-04-04 11:10:35 +00:00
)
// File is a common type for all generator functions.
// It generates Go source code file based on template in tmplPath,
// by parsing the data in fileToParse and linguist's samplesDir
// saving results to an outFile.
2017-06-13 11:56:07 +00:00
type File func(fileToParse, samplesDir, outPath, tmplPath, tmplName, commit string) error
2017-05-25 10:33:26 +00:00
func formatedWrite(outPath string, source []byte) error {
2017-04-04 11:10:35 +00:00
formatedSource, err := format.Source(source)
if err != nil {
err = fmt.Errorf("'go fmt' fails on %v", err)
// write un-formatter source to simplify debugging
formatedSource = source
2017-04-04 11:10:35 +00:00
}
2017-04-04 11:10:35 +00:00
if err := ioutil.WriteFile(outPath, formatedSource, 0666); err != nil {
return err
}
return err
2017-04-04 11:10:35 +00:00
}
func executeTemplate(w io.Writer, name, path, commit string, fmap template.FuncMap, data interface{}) error {
getCommit := func() string {
return commit
}
// stringVal returns escaped string that can be directly placed into go code.
// for value test`s it would return `test`+"`"+`s`
stringVal := func(val string) string {
val = strings.ReplaceAll(val, "`", "`+\"`\"+`")
return fmt.Sprintf("`%s`", val)
}
if fmap == nil {
fmap = make(template.FuncMap)
}
fmap["getCommit"] = getCommit
fmap["stringVal"] = stringVal
fmap["isRE2"] = isRE2
const headerTmpl = "header.go.tmpl"
headerPath := filepath.Join(filepath.Dir(path), headerTmpl)
h := template.Must(template.New(headerTmpl).Funcs(fmap).ParseFiles(headerPath))
if err := h.Execute(w, data); err != nil {
return err
}
t := template.Must(template.New(name).Funcs(fmap).ParseFiles(path))
return t.Execute(w, data)
}