package lint import ( "strings" "github.com/vladimir/goherence/internal/parser" ) // DynamicIncludeRule требует, чтобы путь include_tasks/import_role был // статической строкой, известной уже на этапе парсинга плейбука — без // подстановки переменных внутрь пути. Это убирает GOTO-с-параметрами // как способ "программировать" маршрутизацию тасков вместо декларативного // описания состояния. type DynamicIncludeRule struct{} func (r *DynamicIncludeRule) Name() string { return "static-include-only" } func (r *DynamicIncludeRule) Check(pb *parser.Playbook) []Violation { var out []Violation walkTasks(pb, func(loc string, t *parser.Task) { if t.Module != "include_tasks" && t.Module != "import_role" { return } path, _ := t.Args["path"].(string) if path == "" { path, _ = t.Args["name"].(string) // import_role обычно использует "name" } if strings.Contains(path, "{{") { out = append(out, Violation{ Rule: r.Name(), Severity: Error, Location: loc, Message: "путь include должен быть статическим — динамический " + t.Module + " запрещён: " + path, }) } }) return out }