package validator import ( "commitlint/internal/commitlint/configuration" "regexp" "slices" ) type Result int const ( IncorrectPattern Result = iota UnknownType UnknownContext OverlongLine BlankLine ) type ValidateError struct { // Тип проблемы Result Result // Проблемная строка в коммите. Начинается с 1 Line int // Переданный не известный тип UnknownType string // Переданный не известный контекст UnknownContext string } func Validate(commitMessage []string, config configuration.Config) *ValidateError { if pResult := validateFirstLine(commitMessage[0], config); pResult != nil { return pResult } if len(commitMessage) > 1 { if pResult := validateBody(commitMessage[1:], config); pResult != nil { return pResult } } return nil } func validateFirstLine(line string, config configuration.Config) *ValidateError { for _, pExclude := range config.Excludes { if pExclude.MatchString(line) { return nil } } commitFirstLine := regexp.MustCompile("^([a-z0-9]+?)!?(?:\\(([a-z0-9]+?)\\))?: .+$") match := commitFirstLine.FindAllStringSubmatch(line, -1) if len(match) == 0 { return &ValidateError{Result: IncorrectPattern, Line: 1} } commitType := match[0][1] if !slices.Contains(config.Types, commitType) { return &ValidateError{Result: UnknownType, Line: 1, UnknownType: commitType} } commitContext := match[0][2] if len(commitContext) > 0 && !slices.Contains(config.Contexts, commitContext) { return &ValidateError{Result: UnknownContext, Line: 1, UnknownContext: commitContext} } if len(line) > config.MaxLengthLine { return &ValidateError{Result: OverlongLine, Line: 1} } return nil } func validateBody(body []string, config configuration.Config) *ValidateError { if len(body[0]) > 0 { return &ValidateError{Result: BlankLine, Line: 2} } for i, line := range body[1:] { if len(line) > config.MaxLengthLine { return &ValidateError{Result: OverlongLine, Line: i + 3} } } return nil }