package lint import ( "fmt" "github.com/vladimir/goherence/internal/parser" ) // ComplexityRule ограничивает число условных тасков (`when`) в одной роли. // Превышение порога — обычно значит, что роль пытается быть программой // с ветвлениями, а не описанием желаемого состояния хостов. Это Warning, // а не Error: сложность — вопрос вкуса и контекста, а не жёсткого правила, // как shell-usage или dynamic-include. type ComplexityRule struct { MaxNesting int // зарезервировано на будущее — реальная вложенность block/block MaxBranches int // сколько тасков с `when` допустимо в одной роли } func (r *ComplexityRule) Name() string { return "complexity" } func (r *ComplexityRule) Check(pb *parser.Playbook) []Violation { var out []Violation for roleName, role := range pb.Roles { branches := 0 for _, t := range role.Tasks { if t.When != "" { branches++ } } if branches > r.MaxBranches { out = append(out, Violation{ Rule: r.Name(), Severity: Warning, Location: "role " + roleName, Message: fmt.Sprintf( "условных тасков (when) = %d, порог %d — похоже на процедурный код "+ "внутри роли, стоит разбить на несколько ролей поменьше", branches, r.MaxBranches), }) } } return out }