manager/magefiles/internal/walk/render_templates.go
Dan Anglin a909803b29
refactor: reorganise magefiles
Reorganise and refactor the magefiles to make it more manageable and
reduce duplication.
2024-09-14 05:58:43 +01:00

73 lines
1.6 KiB
Go

package walk
import (
"fmt"
"io/fs"
"path/filepath"
"slices"
"strings"
"codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/config"
"codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/utilities"
)
func RenderTemplates(
cfg config.Config,
homeConfigDirectory string,
rootDir string,
rootManagedDir string,
validationFunc func(string) bool,
) fs.WalkDirFunc {
return func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if path == rootDir {
return nil
}
relativePath := strings.TrimPrefix(path, rootDir+"/")
if validationFunc != nil {
if !validationFunc(relativePath) {
return nil
}
}
if d.IsDir() {
managedDir := filepath.Join(rootManagedDir, relativePath)
configDir := filepath.Join(homeConfigDirectory, relativePath)
dirs := []string{managedDir, configDir}
for _, dir := range slices.All(dirs) {
if err := utilities.EnsureDirectory(dir); err != nil {
return fmt.Errorf("unable to ensure the existence of the directory %q: %w", dir, err)
}
}
return nil
}
managedPath := filepath.Join(rootManagedDir, strings.TrimSuffix(relativePath, utilities.TemplateExtension))
configPath := filepath.Join(homeConfigDirectory, strings.TrimSuffix(relativePath, utilities.TemplateExtension))
fmt.Println("Processing template:", relativePath)
if err := utilities.RenderTemplate(cfg, path, managedPath); err != nil {
return fmt.Errorf(
"unable to generate %s from template %s: %w",
managedPath,
path,
err,
)
}
if err := utilities.EnsureSymlink(managedPath, configPath); err != nil {
return err
}
return nil
}
}