pkg/handlers/template_utils.go (87 lines of code) (raw):

package handlers import ( "fmt" "io/fs" "path/filepath" "runtime" "slices" "strings" "github.com/Azure/draft/pkg/config" "github.com/Azure/draft/template" "github.com/blang/semver/v4" log "github.com/sirupsen/logrus" ) var templateConfigs map[string]*Template type TemplateType string func (t TemplateType) String() string { return string(t) } const ( TemplateTypeDeployment TemplateType = "deployment" TemplateTypeDockerfile TemplateType = "dockerfile" TemplateTypeManifests TemplateType = "manifest" TemplateTypeWorkflow TemplateType = "workflow" ) func init() { if err := loadTemplates(); err != nil { log.Fatalf("failed to init templates: %s", err.Error()) } } // GetTemplates returns all templates func GetTemplates() map[string]*Template { return templateConfigs } func GetTemplatesByType(templateType TemplateType) map[string]*Template { templates := make(map[string]*Template) for name, template := range templateConfigs { if template.Config.Type == templateType.String() { templates[name] = template } } return templates } func IsValidTemplate(templateName string) bool { _, ok := templateConfigs[strings.ToLower(templateName)] return ok } func loadTemplates() error { templateConfigs = make(map[string]*Template) return fs.WalkDir(template.Templates, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if d.IsDir() { return nil } if !strings.EqualFold(d.Name(), "draft.yaml") { return nil } draftConfig, err := config.NewConfigFromFS(template.Templates, path) if err != nil { return err } if _, ok := templateConfigs[strings.ToLower(draftConfig.TemplateName)]; ok { return fmt.Errorf("duplicate template name: %s", draftConfig.TemplateName) } newTemplate := &Template{ Config: draftConfig, src: sanatizeTemplateSrcDir(path), templateFiles: template.Templates, } templateConfigs[strings.ToLower(draftConfig.TemplateName)] = newTemplate return nil }) } // IsValidVersion checks if a version is valid for a given version range func IsValidVersion(versions []string, version string) bool { _, err := semver.Parse(version) if err != nil { return false } return slices.Contains(versions, version) } func sanatizeTemplateSrcDir(src string) string { srcDir := filepath.Dir(src) if runtime.GOOS == "windows" { return strings.ReplaceAll(srcDir, "\\", "/") } return srcDir }