2021-07-27 17:39:21 +02:00
|
|
|
package template
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
2023-07-21 13:20:44 +02:00
|
|
|
"errors"
|
2021-07-27 17:39:21 +02:00
|
|
|
"fmt"
|
2023-07-21 14:11:31 +02:00
|
|
|
"github.com/go-jet/jet/v2/internal/utils/filesys"
|
2022-12-01 11:54:14 +05:30
|
|
|
"path"
|
|
|
|
|
"strings"
|
|
|
|
|
"text/template"
|
|
|
|
|
|
2021-07-27 17:39:21 +02:00
|
|
|
"github.com/go-jet/jet/v2/generator/metadata"
|
|
|
|
|
"github.com/go-jet/jet/v2/internal/jet"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// ProcessSchema will process schema metadata and constructs go files using generator Template
|
2023-07-21 13:20:44 +02:00
|
|
|
func ProcessSchema(dirPath string, schemaMetaData metadata.Schema, generatorTemplate Template) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
if schemaMetaData.IsEmpty() {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
schemaTemplate := generatorTemplate.Schema(schemaMetaData)
|
|
|
|
|
schemaPath := path.Join(dirPath, schemaTemplate.Path)
|
|
|
|
|
|
|
|
|
|
fmt.Println("Destination directory:", schemaPath)
|
|
|
|
|
fmt.Println("Cleaning up destination directory...")
|
2023-07-21 14:11:31 +02:00
|
|
|
err := filesys.RemoveDir(schemaPath)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("failed to cleanup generated files")
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
err = processModel(schemaPath, schemaMetaData, schemaTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate model types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = processSQLBuilder(schemaPath, generatorTemplate.Dialect, schemaMetaData, schemaTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate sql builder types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func processModel(dirPath string, schemaMetaData metadata.Schema, schemaTemplate Schema) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
modelTemplate := schemaTemplate.Model
|
|
|
|
|
|
|
|
|
|
if modelTemplate.Skip {
|
|
|
|
|
fmt.Println("Skipping the generation of model types.")
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
modelDirPath := path.Join(dirPath, modelTemplate.Path)
|
|
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err := filesys.EnsureDirPathExist(modelDirPath)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("destination dir path does not exist: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = processTableModels("table", modelDirPath, schemaMetaData.TablesMetaData, modelTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate table model types: %w", err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
err = processTableModels("view", modelDirPath, schemaMetaData.ViewsMetaData, modelTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate view model types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = processEnumModels(modelDirPath, schemaMetaData.EnumsMetaData, modelTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to process enum types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func processSQLBuilder(dirPath string, dialect jet.Dialect, schemaMetaData metadata.Schema, schemaTemplate Schema) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
sqlBuilderTemplate := schemaTemplate.SQLBuilder
|
|
|
|
|
|
|
|
|
|
if sqlBuilderTemplate.Skip {
|
|
|
|
|
fmt.Println("Skipping the generation of SQL Builder types.")
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sqlBuilderPath := path.Join(dirPath, sqlBuilderTemplate.Path)
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
err := processTableSQLBuilder("table", sqlBuilderPath, dialect, schemaMetaData, schemaMetaData.TablesMetaData, sqlBuilderTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to process table sql builder types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = processTableSQLBuilder("view", sqlBuilderPath, dialect, schemaMetaData, schemaMetaData.ViewsMetaData, sqlBuilderTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to process view sql builder types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = processEnumSQLBuilder(sqlBuilderPath, dialect, schemaMetaData.EnumsMetaData, sqlBuilderTemplate)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to process enum types: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func processEnumSQLBuilder(dirPath string, dialect jet.Dialect, enumsMetaData []metadata.Enum, sqlBuilder SQLBuilder) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
if len(enumsMetaData) == 0 {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Printf("Generating enum sql builder files\n")
|
|
|
|
|
|
|
|
|
|
for _, enumMetaData := range enumsMetaData {
|
|
|
|
|
enumTemplate := sqlBuilder.Enum(enumMetaData)
|
|
|
|
|
|
|
|
|
|
if enumTemplate.Skip {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enumSQLBuilderPath := path.Join(dirPath, enumTemplate.Path)
|
|
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err := filesys.EnsureDirPathExist(enumSQLBuilderPath)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to create enum sql builder directory - %s: %w", enumSQLBuilderPath, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
|
|
|
|
text, err := generateTemplate(
|
|
|
|
|
autoGenWarningTemplate+enumSQLBuilderTemplate,
|
|
|
|
|
enumMetaData,
|
|
|
|
|
template.FuncMap{
|
|
|
|
|
"package": func() string {
|
|
|
|
|
return enumTemplate.PackageName()
|
|
|
|
|
},
|
|
|
|
|
"dialect": func() jet.Dialect {
|
|
|
|
|
return dialect
|
|
|
|
|
},
|
|
|
|
|
"enumTemplate": func() EnumSQLBuilder {
|
|
|
|
|
return enumTemplate
|
|
|
|
|
},
|
|
|
|
|
"enumValueName": func(enumValue string) string {
|
|
|
|
|
return enumTemplate.ValueName(enumValue)
|
|
|
|
|
},
|
2024-09-26 14:17:21 +02:00
|
|
|
"golangComment": formatGolangComment,
|
2021-07-27 17:39:21 +02:00
|
|
|
})
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generete enum type %s: %w", enumTemplate.FileName, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err = filesys.FormatAndSaveGoFile(enumSQLBuilderPath, enumTemplate.FileName, text)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to format and save '%s' enum type : %w", enumTemplate.FileName, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
2023-07-21 13:20:44 +02:00
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func processTableSQLBuilder(fileTypes, dirPath string,
|
|
|
|
|
dialect jet.Dialect,
|
|
|
|
|
schemaMetaData metadata.Schema,
|
|
|
|
|
tablesMetaData []metadata.Table,
|
2023-07-21 13:20:44 +02:00
|
|
|
sqlBuilderTemplate SQLBuilder) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
|
|
|
|
|
if len(tablesMetaData) == 0 {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Printf("Generating %s sql builder files\n", fileTypes)
|
|
|
|
|
|
2022-12-02 23:02:44 +05:30
|
|
|
var generatedBuilders []TableSQLBuilder
|
|
|
|
|
|
2021-07-27 17:39:21 +02:00
|
|
|
for _, tableMetaData := range tablesMetaData {
|
2022-08-23 12:23:46 +02:00
|
|
|
var tableSQLBuilder TableSQLBuilder
|
2021-07-27 17:39:21 +02:00
|
|
|
|
|
|
|
|
if fileTypes == "view" {
|
2022-08-23 12:23:46 +02:00
|
|
|
tableSQLBuilder = sqlBuilderTemplate.View(tableMetaData)
|
2021-07-27 17:39:21 +02:00
|
|
|
} else {
|
2022-08-23 12:23:46 +02:00
|
|
|
tableSQLBuilder = sqlBuilderTemplate.Table(tableMetaData)
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2022-08-23 12:23:46 +02:00
|
|
|
if tableSQLBuilder.Skip {
|
2021-07-27 17:39:21 +02:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-23 12:23:46 +02:00
|
|
|
tableSQLBuilderPath := path.Join(dirPath, tableSQLBuilder.Path)
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err := filesys.EnsureDirPathExist(tableSQLBuilderPath)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to create table sql builder directory - %s: %w", tableSQLBuilderPath, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
|
|
|
|
text, err := generateTemplate(
|
2022-08-23 12:23:46 +02:00
|
|
|
autoGenWarningTemplate+tableSQLBuilderTemplate,
|
2021-07-27 17:39:21 +02:00
|
|
|
tableMetaData,
|
|
|
|
|
template.FuncMap{
|
|
|
|
|
"package": func() string {
|
2022-08-23 12:23:46 +02:00
|
|
|
return tableSQLBuilder.PackageName()
|
2021-07-27 17:39:21 +02:00
|
|
|
},
|
|
|
|
|
"dialect": func() jet.Dialect {
|
|
|
|
|
return dialect
|
|
|
|
|
},
|
|
|
|
|
"schemaName": func() string {
|
|
|
|
|
return schemaMetaData.Name
|
|
|
|
|
},
|
|
|
|
|
"tableTemplate": func() TableSQLBuilder {
|
2022-08-23 12:23:46 +02:00
|
|
|
return tableSQLBuilder
|
2021-07-27 17:39:21 +02:00
|
|
|
},
|
|
|
|
|
"structImplName": func() string { // postgres only
|
2022-08-23 12:23:46 +02:00
|
|
|
structName := tableSQLBuilder.TypeName
|
2021-07-27 17:39:21 +02:00
|
|
|
return string(strings.ToLower(structName)[0]) + structName[1:]
|
|
|
|
|
},
|
|
|
|
|
"columnField": func(columnMetaData metadata.Column) TableSQLBuilderColumn {
|
2022-08-23 12:23:46 +02:00
|
|
|
return tableSQLBuilder.Column(columnMetaData)
|
|
|
|
|
},
|
|
|
|
|
"toUpper": strings.ToUpper,
|
|
|
|
|
"insertedRowAlias": func() string {
|
|
|
|
|
return insertedRowAlias(dialect)
|
2021-07-27 17:39:21 +02:00
|
|
|
},
|
2024-09-26 14:17:21 +02:00
|
|
|
"golangComment": formatGolangComment,
|
2021-07-27 17:39:21 +02:00
|
|
|
})
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate table sql builder type %s: %w", tableSQLBuilder.TypeName, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err = filesys.FormatAndSaveGoFile(tableSQLBuilderPath, tableSQLBuilder.FileName, text)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to format and save generated sql builder type '%s': %w", tableSQLBuilder.FileName, err)
|
|
|
|
|
}
|
2022-12-02 23:02:44 +05:30
|
|
|
|
|
|
|
|
generatedBuilders = append(generatedBuilders, tableSQLBuilder)
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
2022-12-02 23:02:44 +05:30
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
err := generateUseSchemaFunc(dirPath, fileTypes, generatedBuilders)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate UseSchema function")
|
2022-12-02 23:02:44 +05:30
|
|
|
}
|
2023-07-21 13:20:44 +02:00
|
|
|
|
|
|
|
|
return nil
|
2022-12-02 23:02:44 +05:30
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func generateUseSchemaFunc(dirPath, fileTypes string, builders []TableSQLBuilder) error {
|
|
|
|
|
if len(builders) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2022-12-02 23:02:44 +05:30
|
|
|
|
|
|
|
|
text, err := generateTemplate(
|
|
|
|
|
autoGenWarningTemplate+tableSqlBuilderSetSchemaTemplate,
|
|
|
|
|
builders,
|
|
|
|
|
template.FuncMap{
|
2022-12-05 17:26:52 +05:30
|
|
|
"package": func() string { return builders[0].PackageName() },
|
2023-04-02 13:58:44 +02:00
|
|
|
"type": func() string { return fileTypes },
|
2022-12-02 23:02:44 +05:30
|
|
|
},
|
|
|
|
|
)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate use schema template: %w", err)
|
|
|
|
|
}
|
2022-12-02 23:02:44 +05:30
|
|
|
|
2023-04-02 13:58:44 +02:00
|
|
|
basePath := path.Join(dirPath, builders[0].Path)
|
|
|
|
|
fileName := fileTypes + "_use_schema"
|
|
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err = filesys.FormatAndSaveGoFile(basePath, fileName, text)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to save %s file: %w", fileName, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2022-08-23 12:23:46 +02:00
|
|
|
func insertedRowAlias(dialect jet.Dialect) string {
|
|
|
|
|
if dialect.Name() == "MySQL" {
|
|
|
|
|
return "new"
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2022-08-23 12:23:46 +02:00
|
|
|
return "excluded"
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func processTableModels(fileTypes, modelDirPath string, tablesMetaData []metadata.Table, modelTemplate Model) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
if len(tablesMetaData) == 0 {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
fmt.Printf("Generating %s model files...\n", fileTypes)
|
|
|
|
|
|
|
|
|
|
for _, tableMetaData := range tablesMetaData {
|
|
|
|
|
var tableTemplate TableModel
|
|
|
|
|
|
|
|
|
|
if fileTypes == "table" {
|
|
|
|
|
tableTemplate = modelTemplate.Table(tableMetaData)
|
|
|
|
|
} else {
|
|
|
|
|
tableTemplate = modelTemplate.View(tableMetaData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if tableTemplate.Skip {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text, err := generateTemplate(
|
|
|
|
|
autoGenWarningTemplate+tableModelFileTemplate,
|
|
|
|
|
tableMetaData,
|
|
|
|
|
template.FuncMap{
|
|
|
|
|
"package": func() string {
|
|
|
|
|
return modelTemplate.PackageName()
|
|
|
|
|
},
|
|
|
|
|
"modelImports": func() []string {
|
|
|
|
|
return getTableModelImports(tableTemplate, tableMetaData)
|
|
|
|
|
},
|
|
|
|
|
"tableTemplate": func() TableModel {
|
|
|
|
|
return tableTemplate
|
|
|
|
|
},
|
|
|
|
|
"structField": func(columnMetaData metadata.Column) TableModelField {
|
|
|
|
|
return tableTemplate.Field(columnMetaData)
|
|
|
|
|
},
|
2024-09-26 14:17:21 +02:00
|
|
|
"golangComment": formatGolangComment,
|
2021-07-27 17:39:21 +02:00
|
|
|
})
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate model type '%s': %w", tableMetaData.Name, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err = filesys.FormatAndSaveGoFile(modelDirPath, tableTemplate.FileName, text)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to save '%s' model type: %w", tableTemplate.FileName, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
2023-07-21 13:20:44 +02:00
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-21 13:20:44 +02:00
|
|
|
func processEnumModels(modelDir string, enumsMetaData []metadata.Enum, modelTemplate Model) error {
|
2021-07-27 17:39:21 +02:00
|
|
|
if len(enumsMetaData) == 0 {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
fmt.Print("Generating enum model files...\n")
|
|
|
|
|
|
|
|
|
|
for _, enumMetaData := range enumsMetaData {
|
|
|
|
|
enumTemplate := modelTemplate.Enum(enumMetaData)
|
|
|
|
|
|
|
|
|
|
if enumTemplate.Skip {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text, err := generateTemplate(
|
|
|
|
|
autoGenWarningTemplate+enumModelTemplate,
|
|
|
|
|
enumMetaData,
|
|
|
|
|
template.FuncMap{
|
|
|
|
|
"package": func() string {
|
|
|
|
|
return modelTemplate.PackageName()
|
|
|
|
|
},
|
|
|
|
|
"enumTemplate": func() EnumModel {
|
|
|
|
|
return enumTemplate
|
|
|
|
|
},
|
|
|
|
|
"valueName": func(value string) string {
|
|
|
|
|
return enumTemplate.ValueName(value)
|
|
|
|
|
},
|
2024-09-26 14:17:21 +02:00
|
|
|
"golangComment": formatGolangComment,
|
2021-07-27 17:39:21 +02:00
|
|
|
})
|
2023-07-21 13:20:44 +02:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to generate enum type '%s': %w", enumMetaData.Name, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
|
2023-07-21 14:11:31 +02:00
|
|
|
err = filesys.FormatAndSaveGoFile(modelDir, enumTemplate.FileName, text)
|
2023-07-21 13:20:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("failed to save '%s' enum type: %w", enumTemplate.FileName, err)
|
|
|
|
|
}
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
2023-07-21 13:20:44 +02:00
|
|
|
|
|
|
|
|
return nil
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func generateTemplate(templateText string, templateData interface{}, funcMap template.FuncMap) ([]byte, error) {
|
|
|
|
|
t, err := template.New("sqlBuilderTableTemplate").Funcs(funcMap).Parse(templateText)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil, fmt.Errorf("failed to parse template: %w", err)
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
if err := t.Execute(&buf, templateData); err != nil {
|
2023-07-21 13:20:44 +02:00
|
|
|
return nil, fmt.Errorf("failed to generate template: %w", err)
|
2021-07-27 17:39:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buf.Bytes(), nil
|
|
|
|
|
}
|