embeded templates

This commit is contained in:
steven carpenter 2025-07-25 16:01:48 -04:00
parent bf78461bbb
commit 9e4d1a6a28
18 changed files with 63 additions and 58 deletions

7
embed/embed.go Normal file
View file

@ -0,0 +1,7 @@
package embed
import "embed"
//go:embed templates/*.tmpl templates/**/*
var Templates embed.FS

View file

@ -1,7 +1,6 @@
package config package config
import ( import (
"fmt"
"github.com/spf13/viper" "github.com/spf13/viper"
"{{.ModName}}/internal/logger" "{{.ModName}}/internal/logger"
) )

View file

@ -16,11 +16,4 @@ func init() {
Level: log.InfoLevel, Level: log.InfoLevel,
}) })
} }
func initLogging() {
level, err := log.ParseLevel(logLevel)
if err != nil {
Log.Warn("Invalid log level; defaulting to info", "input", logLevel)
level = log.InfoLevel
}
Log.SetLevel(level)
}

View file

@ -1,71 +1,77 @@
package render package render
import ( import (
"os" "io/fs"
"path/filepath" "os"
"strings" "path/filepath"
"text/template" "strings"
"specCon18/bubblewand/internal/logger" "text/template"
"specCon18/bubblewand/embed"
"specCon18/bubblewand/internal/logger"
) )
// ProgramData holds user-supplied template values // ProgramData holds user-supplied template values
type ProgramData struct { type ProgramData struct {
ModName string ModName string
PackageName string PackageName string
ProgramVersion string ProgramVersion string
ProgramDesc string ProgramDesc string
OutputDir string OutputDir string
} }
// RenderTemplates renders all .tmpl files from the templates/ directory into outputDir // RenderTemplates renders embedded .tmpl files into outputDir
func RenderTemplates(data ProgramData, outputDir string, verbose bool) error { func RenderTemplates(data ProgramData, outputDir string, verbose bool) error {
var renderedFiles int var renderedFiles int
err := filepath.Walk("templates", func(path string, info os.FileInfo, err error) error { err := fs.WalkDir(embed.Templates, "templates", func(path string, d fs.DirEntry, err error) error {
if err != nil { if err != nil {
return err return err
} }
if info.IsDir() || !strings.HasSuffix(info.Name(), ".tmpl") { if d.IsDir() || !strings.HasSuffix(d.Name(), ".tmpl") {
return nil return nil
} }
relPath, err := filepath.Rel("templates", path) // Get relative path inside templates/
if err != nil { relPath := strings.TrimPrefix(path, "templates/")
return err outputPath := filepath.Join(outputDir, strings.TrimSuffix(relPath, ".tmpl"))
}
outputPath := filepath.Join(outputDir, strings.TrimSuffix(relPath, ".tmpl"))
if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil { if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil {
return err return err
} }
tmpl, err := template.ParseFiles(path) tmplBytes, err := embed.Templates.ReadFile(path)
if err != nil { if err != nil {
return err return err
} }
outFile, err := os.Create(outputPath) tmpl, err := template.New(d.Name()).Parse(string(tmplBytes))
if err != nil { if err != nil {
return err return err
} }
defer outFile.Close()
if verbose { outFile, err := os.Create(outputPath)
logger.Log.Infof("Rendering %s → %s", path, outputPath) if err != nil {
} return err
}
defer outFile.Close()
renderedFiles++ if verbose {
return tmpl.Execute(outFile, data) logger.Log.Infof("Rendering %s → %s", path, outputPath)
}) }
if err != nil { renderedFiles++
return err return tmpl.Execute(outFile, data)
} })
if !verbose && renderedFiles > 0 { if err != nil {
logger.Log.Info("Rendering templates") return err
} }
return nil if !verbose && renderedFiles > 0 {
logger.Log.Info("Rendering templates")
}
return nil
} }