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 }