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 } }