refactor template functions to remove duplication
update readme TODOs update plan for multi-file outputs
This commit is contained in:
@ -74,126 +74,8 @@ func (ti *TemplateInterpreter) Interpret(masonryInput string, tmplText string) (
|
||||
return "", fmt.Errorf("error parsing Masonry input: %w", err)
|
||||
}
|
||||
|
||||
// Create template with helper functions
|
||||
tmpl := template.Must(template.New("rootTemplate").Funcs(template.FuncMap{
|
||||
"registry": func() *TemplateRegistry { return ti.registry },
|
||||
"executeTemplate": func(name string, data interface{}) (string, error) {
|
||||
if tmpl, exists := ti.registry.templates[name]; exists {
|
||||
var buf strings.Builder
|
||||
err := tmpl.Execute(&buf, data)
|
||||
return buf.String(), err
|
||||
}
|
||||
return "", fmt.Errorf("template %s not found", name)
|
||||
},
|
||||
"hasTemplate": func(name string) bool {
|
||||
_, exists := ti.registry.templates[name]
|
||||
return exists
|
||||
},
|
||||
"title": cases.Title(language.English).String,
|
||||
"goType": func(t string) string {
|
||||
typeMap := map[string]string{
|
||||
"string": "string",
|
||||
"int": "int",
|
||||
"uuid": "string",
|
||||
"boolean": "bool",
|
||||
"timestamp": "time.Time",
|
||||
"text": "string",
|
||||
"object": "interface{}",
|
||||
}
|
||||
if goType, ok := typeMap[t]; ok {
|
||||
return goType
|
||||
}
|
||||
return "interface{}"
|
||||
},
|
||||
"pathToHandlerName": func(path string) string {
|
||||
// Convert "/users/{id}" to "Users"
|
||||
re := regexp.MustCompile(`[^a-zA-Z0-9]+`)
|
||||
name := re.ReplaceAllString(path, " ")
|
||||
name = strings.TrimSpace(name)
|
||||
name = strings.Title(name)
|
||||
return strings.ReplaceAll(name, " ", "")
|
||||
},
|
||||
"getHost": func(settings []lang.ServerSetting) string {
|
||||
for _, s := range settings {
|
||||
if s.Host != nil {
|
||||
if s.Host.Literal != nil {
|
||||
return "\"" + *s.Host.Literal + "\""
|
||||
}
|
||||
return fmt.Sprintf(`func() string { if v := os.Getenv("%s"); v != "" { return v }; return "%s" }()`, s.Host.EnvVar.Name, func() string {
|
||||
if s.Host.EnvVar.Default != nil {
|
||||
return *s.Host.EnvVar.Default
|
||||
}
|
||||
return "localhost"
|
||||
}())
|
||||
}
|
||||
}
|
||||
return "localhost"
|
||||
},
|
||||
"getPort": func(settings []lang.ServerSetting) string {
|
||||
for _, s := range settings {
|
||||
if s.Port != nil {
|
||||
if s.Port.Literal != nil {
|
||||
return strconv.Itoa(*s.Port.Literal)
|
||||
}
|
||||
return fmt.Sprintf(`func() string { if v := os.Getenv("%s"); v != "" { return v }; return "%s" }()`, s.Port.EnvVar.Name, func() string {
|
||||
if s.Port.EnvVar.Default != nil {
|
||||
return *s.Port.EnvVar.Default
|
||||
}
|
||||
return "8080"
|
||||
}())
|
||||
}
|
||||
}
|
||||
return "8080"
|
||||
},
|
||||
"getServerHostPort": func(settings []lang.ServerSetting) string {
|
||||
host := "localhost"
|
||||
port := 8080
|
||||
for _, s := range settings {
|
||||
if s.Host != nil {
|
||||
if s.Host.Literal != nil {
|
||||
host = *s.Host.Literal
|
||||
}
|
||||
if s.Host.EnvVar != nil && s.Host.EnvVar.Default != nil {
|
||||
host = *s.Host.EnvVar.Default
|
||||
}
|
||||
// If it's an env var, keep the default
|
||||
}
|
||||
if s.Port != nil {
|
||||
if s.Port.Literal != nil {
|
||||
port = *s.Port.Literal
|
||||
}
|
||||
if s.Port.EnvVar != nil && s.Port.EnvVar.Default != nil {
|
||||
if p, err := strconv.Atoi(*s.Port.EnvVar.Default); err == nil {
|
||||
port = p
|
||||
}
|
||||
}
|
||||
// If it's an env var, keep the default
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf("%s:%d", host, port)
|
||||
},
|
||||
"slice": func() []interface{} {
|
||||
return []interface{}{}
|
||||
},
|
||||
"append": func(slice []interface{}, item interface{}) []interface{} {
|
||||
return append(slice, item)
|
||||
},
|
||||
"add": func(a, b int) int {
|
||||
return a + b
|
||||
},
|
||||
"derefString": func(s *string) string {
|
||||
if s != nil {
|
||||
return *s
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"derefInt": func(i *int) int {
|
||||
if i != nil {
|
||||
return *i
|
||||
}
|
||||
return 0
|
||||
},
|
||||
}).Parse(tmplText))
|
||||
// Create template using the unified FuncMap from the registry
|
||||
tmpl := template.Must(template.New("rootTemplate").Funcs(ti.registry.GetFuncMap()).Parse(tmplText))
|
||||
|
||||
data := struct {
|
||||
AST lang.AST
|
||||
@ -259,7 +141,7 @@ func NewTemplateRegistry() *TemplateRegistry {
|
||||
re := regexp.MustCompile(`[^a-zA-Z0-9]+`)
|
||||
name := re.ReplaceAllString(path, " ")
|
||||
name = strings.TrimSpace(name)
|
||||
name = strings.Title(name)
|
||||
name = cases.Title(language.English).String(name)
|
||||
return strings.ReplaceAll(name, " ", "")
|
||||
},
|
||||
"getHost": func(settings []lang.ServerSetting) string {
|
||||
@ -346,6 +228,16 @@ func NewTemplateRegistry() *TemplateRegistry {
|
||||
return tr
|
||||
}
|
||||
|
||||
func (tr *TemplateRegistry) GetFuncMap() template.FuncMap {
|
||||
// Add the registry function to the existing funcMap
|
||||
funcMap := make(template.FuncMap)
|
||||
for k, v := range tr.funcMap {
|
||||
funcMap[k] = v
|
||||
}
|
||||
funcMap["registry"] = func() *TemplateRegistry { return tr }
|
||||
return funcMap
|
||||
}
|
||||
|
||||
func (tr *TemplateRegistry) Register(name, content string) error {
|
||||
tmpl, err := template.New(name).Funcs(tr.funcMap).Parse(content)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user