Compare commits

..

No commits in common. "69674ffaa736728b944d9616e9f45bad89fcad89" and "413904c45713300344bf270bf1e05fb7e222f0b8" have entirely different histories.

18 changed files with 52 additions and 87 deletions

View file

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

View file

@ -39,7 +39,7 @@
default = pkgs.callPackage ( default = pkgs.callPackage (
{ buildGoModule }: { buildGoModule }:
buildGoModule { buildGoModule {
pname = "bubblewand"; pname = "wand-templater";
version = "0.0.1"; version = "0.0.1";
src = builtins.path { src = builtins.path {
name = "source"; name = "source";

View file

@ -1,100 +1,71 @@
package render package render
import ( import (
"io/fs" "os"
"os" "path/filepath"
"path/filepath" "strings"
"strings" "text/template"
"text/template" "specCon18/bubblewand/internal/logger"
"specCon18/bubblewand/embed" // Import embedded template files
"specCon18/bubblewand/internal/logger" // Import logger for logging output
) )
// ProgramData holds user-supplied values for template substitution. // ProgramData holds user-supplied template values
type ProgramData struct { type ProgramData struct {
ModName string // Module name ModName string
PackageName string // Go package name PackageName string
ProgramVersion string // Version string ProgramVersion string
ProgramDesc string // Description of the program ProgramDesc string
OutputDir string // Target output directory for rendered files OutputDir string
} }
// RenderTemplates renders embedded .tmpl files into outputDir // RenderTemplates renders all .tmpl files from the templates/ directory into outputDir
func RenderTemplates(data ProgramData, outputDir string, verbose bool) error { func RenderTemplates(data ProgramData, outputDir string, verbose bool) error {
var renderedFiles int // Count of successfully rendered files var renderedFiles int
// Walk through the embedded templates filesystem starting at "templates" 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
// Log and return error encountered while walking the filesystem }
logger.Log.Errorf("Error walking path %q: %v", path, err) if info.IsDir() || !strings.HasSuffix(info.Name(), ".tmpl") {
return err return nil
} }
// Skip directories and files that do not end with ".tmpl" relPath, err := filepath.Rel("templates", path)
if d.IsDir() || !strings.HasSuffix(d.Name(), ".tmpl") { if err != nil {
return nil return err
} }
outputPath := filepath.Join(outputDir, strings.TrimSuffix(relPath, ".tmpl"))
// Strip the "templates/" prefix from path and remove ".tmpl" extension if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil {
relPath := strings.TrimPrefix(path, "templates/") return err
outputPath := filepath.Join(outputDir, strings.TrimSuffix(relPath, ".tmpl")) }
// Ensure the parent directory for the output file exists tmpl, err := template.ParseFiles(path)
if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil { if err != nil {
logger.Log.Errorf("Failed to create directory for %s: %v", outputPath, err) return err
return err }
}
// Read the embedded template file outFile, err := os.Create(outputPath)
tmplBytes, err := embed.Templates.ReadFile(path) if err != nil {
if err != nil { return err
logger.Log.Errorf("Failed to read template %s: %v", path, err) }
return err defer outFile.Close()
}
// Parse the template content if verbose {
tmpl, err := template.New(d.Name()).Parse(string(tmplBytes)) logger.Log.Infof("Rendering %s → %s", path, outputPath)
if err != nil { }
logger.Log.Errorf("Failed to parse template %s: %v", path, err)
return err
}
// Create the output file for writing the rendered content renderedFiles++
outFile, err := os.Create(outputPath) return tmpl.Execute(outFile, data)
if err != nil { })
logger.Log.Errorf("Failed to create output file %s: %v", outputPath, err)
return err
}
defer outFile.Close()
// Log the render operation if verbose mode is enabled if err != nil {
if verbose { return err
logger.Log.Infof("Rendering %s → %s", path, outputPath) }
}
// Execute the template using the provided data and write to file if !verbose && renderedFiles > 0 {
if err := tmpl.Execute(outFile, data); err != nil { logger.Log.Info("Rendering templates")
logger.Log.Errorf("Failed to execute template %s: %v", path, err) }
return err
}
renderedFiles++ return nil
return nil
})
// If any error occurred during the walk/render process, log and return it
if err != nil {
logger.Log.Errorf("Template rendering failed: %v", err)
return err
}
// If not verbose and at least one file was rendered, print a summary log
if !verbose && renderedFiles > 0 {
logger.Log.Info("Rendering templates")
}
return nil // Success
} }

View file

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