Dan Anglin
a909803b29
Reorganise and refactor the magefiles to make it more manageable and reduce duplication.
73 lines
1.6 KiB
Go
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
|
|
}
|
|
}
|