Files
2025-06-27 20:03:37 -07:00

111 lines
2.5 KiB
Go

package gen
import (
"embed"
"strings"
"text/template"
)
var goKeywords = map[string]struct{}{
// See https://golang.org/ref/spec#Keywords.
"break": {},
"default": {},
"func": {},
"interface": {},
"select": {},
"case": {},
"defer": {},
"go": {},
"map": {},
"struct": {},
"chan": {},
"else": {},
"goto": {},
"package": {},
"switch": {},
"const": {},
"fallthrough": {},
"if": {},
"range": {},
"type": {},
"continue": {},
"for": {},
"import": {},
"return": {},
"var": {},
// Not really keyword, but unlikely to shadow.
// See go/types/universe.go.
"append": {},
"cap": {},
"close": {},
"complex": {},
"copy": {},
"delete": {},
"imag": {},
"len": {},
"make": {},
"new": {},
"panic": {},
"print": {},
"println": {},
"real": {},
"recover": {},
}
// Funcs returns functions which used in templates.
func Funcs() template.FuncMap {
return template.FuncMap{
"trim": strings.TrimSpace,
"lower": strings.ToLower,
"trimPrefix": strings.TrimPrefix,
"trimSuffix": strings.TrimSuffix,
"hasPrefix": strings.HasPrefix,
"hasSuffix": strings.HasSuffix,
"contains": strings.Contains,
"hasField": hasField,
"optionalField": optionalField,
"mapCollectableFields": mapCollectableFields,
"sortableFields": sortableFields,
"generateSliceHelper": generateSliceHelper,
"concat": func(args ...interface{}) []interface{} {
return args
},
"add": func(x, y int) int {
return x + y
},
"notEmpty": func(s string) bool {
return strings.TrimSpace(s) != ""
},
"lowerGo": func(input string) string {
lower := strings.ToLower(input)
if _, ok := goKeywords[lower]; ok {
return lower + "_"
}
return lower
},
"hasFlags": func(def structDef) bool {
for _, field := range def.Fields {
if field.Type == flagsType {
return true
}
}
return false
},
// Argument constructors
"newStructConfig": newStructConfig,
"newInterfaceConfig": newInterfaceConfig,
}
}
//go:embed _template/*.tmpl
var templates embed.FS
// Template parses and returns vendored code generation templates.
func Template() *template.Template {
tmpl := template.New("templates").Funcs(Funcs())
tmpl = template.Must(tmpl.ParseFS(templates, "_template/*.tmpl"))
return tmpl
}