From 09b1b018a7e42134da208fc7bf45cbe47b16f601 Mon Sep 17 00:00:00 2001 From: Juan Manuel Villacorta Campos Date: Fri, 25 Mar 2022 13:02:12 +0000 Subject: [PATCH] Template system in output path --- examples/angular/config.yml | 4 ++-- pkg/generators/generators.go | 34 ++++++++++++++++------------------ pkg/generators/template.go | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/examples/angular/config.yml b/examples/angular/config.yml index 8fe98c7..f545677 100644 --- a/examples/angular/config.yml +++ b/examples/angular/config.yml @@ -16,11 +16,11 @@ generators: - name: TS Models ignore: model_ignore template: templates/model.ts.go.tpl - output: models/[model-].ts + output: models/{{.Model.Name | KebabCase}}.ts from: ts - name: TS Service ignore: service_ignore template: templates/service.ts.go.tpl - output: services/[model-].service.ts + output: services/{{ .Model.Name | KebabCase }}.service.ts from: ts diff --git a/pkg/generators/generators.go b/pkg/generators/generators.go index f937036..5b631af 100644 --- a/pkg/generators/generators.go +++ b/pkg/generators/generators.go @@ -4,10 +4,7 @@ import ( "encoding/json" "fmt" "os" - "strings" - "text/template" - "github.com/iancoleman/strcase" "github.com/juanvillacortac/ditto/pkg/ast" ) @@ -85,13 +82,21 @@ func Generate(root *ast.RootNode, config GenerateConfig, verbose bool) ([]Output Types: config.Types, Helpers: config.Helpers, }) - t, err := template.New(config.Name).Funcs(templateHelpers(models, config)).Parse(config.Template) + t, err := createTemplate(config.Name, config.Template, models, config) + if err != nil { + return nil, err + } + ot, err := createTemplate(config.Name, config.Output, models, config) if err != nil { return nil, err } files := make([]OutputFile, 0) cnt := 0 for _, m := range models { + context := &TemplateContext{ + Root: root, + Model: m, + } if val, ok := m.ModelOptions[config.Ignore]; ok && val == "true" { continue } @@ -99,24 +104,17 @@ func Generate(root *ast.RootNode, config GenerateConfig, verbose bool) ([]Output fmt.Fprintf(os.Stdout, "-> [%d/%d] Generating \"%s\"\n", cnt+1, len(models), m.Name()) } - writer := &strings.Builder{} - err = t.Execute(writer, &struct { - Root *ast.RootNode - Model *ast.Model - }{ - Root: root, - Model: m, - }) + body, err := execTemplate(t, context) + if err != nil { + return nil, err + } + output, err := execTemplate(ot, context) if err != nil { return nil, err } - filename := strings.ReplaceAll(config.Output, "[model]", m.ModelName) - filename = strings.ReplaceAll(filename, "[Model]", strcase.ToCamel(m.ModelName)) - filename = strings.ReplaceAll(filename, "[model_]", strcase.ToSnake(m.ModelName)) - filename = strings.ReplaceAll(filename, "[model-]", strcase.ToKebab(m.ModelName)) files = append(files, OutputFile{ - Filename: filename, - Body: writer.String(), + Filename: output, + Body: body, }) cnt++ } diff --git a/pkg/generators/template.go b/pkg/generators/template.go index 9110708..03b4ca6 100644 --- a/pkg/generators/template.go +++ b/pkg/generators/template.go @@ -1,6 +1,7 @@ package generators import ( + "strings" "text/template" "github.com/gertd/go-pluralize" @@ -34,3 +35,20 @@ func templateHelpers(models ast.ModelMap, options GenerateConfig) template.FuncM }, } } + +type TemplateContext struct { + Root *ast.RootNode + Model *ast.Model +} + +func createTemplate(name string, content string, models ast.ModelMap, options GenerateConfig) (*template.Template, error) { + return template.New(name).Funcs(templateHelpers(models, options)).Parse(content) +} + +func execTemplate(t *template.Template, context *TemplateContext) (string, error) { + writer := &strings.Builder{} + if err := t.Execute(writer, context); err != nil { + return "", err + } + return writer.String(), nil +}