github.com/twelho/conform@v0.0.0-20231016230407-c25e9238598a/internal/policy/commit/check_header_case.go (about)

     1  // This Source Code Form is subject to the terms of the Mozilla Public
     2  // License, v. 2.0. If a copy of the MPL was not distributed with this
     3  // file, You can obtain one at http://mozilla.org/MPL/2.0/.
     4  
     5  package commit
     6  
     7  import (
     8  	"unicode"
     9  	"unicode/utf8"
    10  
    11  	"github.com/pkg/errors"
    12  
    13  	"github.com/twelho/conform/internal/policy"
    14  )
    15  
    16  // HeaderCaseCheck enforces the case of the first word in the header.
    17  type HeaderCaseCheck struct {
    18  	headerCase string
    19  	errors     []error
    20  }
    21  
    22  // Name returns the name of the check.
    23  func (h HeaderCaseCheck) Name() string {
    24  	return "Header Case"
    25  }
    26  
    27  // Message returns to check message.
    28  func (h HeaderCaseCheck) Message() string {
    29  	if len(h.errors) != 0 {
    30  		return h.errors[0].Error()
    31  	}
    32  
    33  	return "Header case is valid"
    34  }
    35  
    36  // Errors returns any violations of the check.
    37  func (h HeaderCaseCheck) Errors() []error {
    38  	return h.errors
    39  }
    40  
    41  // ValidateHeaderCase checks the header length.
    42  func (c Commit) ValidateHeaderCase() policy.Check { //nolint:ireturn
    43  	check := &HeaderCaseCheck{headerCase: c.Header.Case}
    44  
    45  	firstWord, err := c.firstWord()
    46  	if err != nil {
    47  		check.errors = append(check.errors, err)
    48  
    49  		return check
    50  	}
    51  
    52  	first, _ := utf8.DecodeRuneInString(firstWord)
    53  	if first == utf8.RuneError {
    54  		check.errors = append(check.errors, errors.New("Header does not start with valid UTF-8 text"))
    55  
    56  		return check
    57  	}
    58  
    59  	var valid bool
    60  
    61  	switch c.Header.Case {
    62  	case "upper":
    63  		valid = unicode.IsUpper(first)
    64  	case "lower":
    65  		valid = unicode.IsLower(first)
    66  	default:
    67  		check.errors = append(check.errors, errors.Errorf("Invalid configured case %s", c.Header.Case))
    68  
    69  		return check
    70  	}
    71  
    72  	if !valid {
    73  		check.errors = append(check.errors, errors.Errorf("Commit header case is not %s", c.Header.Case))
    74  	}
    75  
    76  	return check
    77  }