github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/printers/codeclimate.go (about) 1 package printers 2 3 import ( 4 "encoding/json" 5 "io" 6 7 "github.com/vanstinator/golangci-lint/pkg/result" 8 ) 9 10 const defaultCodeClimateSeverity = "critical" 11 12 // CodeClimateIssue is a subset of the Code Climate spec. 13 // https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types 14 // It is just enough to support GitLab CI Code Quality. 15 // https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html 16 type CodeClimateIssue struct { 17 Description string `json:"description"` 18 Severity string `json:"severity,omitempty"` 19 Fingerprint string `json:"fingerprint"` 20 Location struct { 21 Path string `json:"path"` 22 Lines struct { 23 Begin int `json:"begin"` 24 } `json:"lines"` 25 } `json:"location"` 26 } 27 28 type CodeClimate struct { 29 w io.Writer 30 } 31 32 func NewCodeClimate(w io.Writer) *CodeClimate { 33 return &CodeClimate{w: w} 34 } 35 36 func (p CodeClimate) Print(issues []result.Issue) error { 37 codeClimateIssues := make([]CodeClimateIssue, 0, len(issues)) 38 for i := range issues { 39 issue := &issues[i] 40 codeClimateIssue := CodeClimateIssue{} 41 codeClimateIssue.Description = issue.Description() 42 codeClimateIssue.Location.Path = issue.Pos.Filename 43 codeClimateIssue.Location.Lines.Begin = issue.Pos.Line 44 codeClimateIssue.Fingerprint = issue.Fingerprint() 45 codeClimateIssue.Severity = defaultCodeClimateSeverity 46 47 if issue.Severity != "" { 48 codeClimateIssue.Severity = issue.Severity 49 } 50 51 codeClimateIssues = append(codeClimateIssues, codeClimateIssue) 52 } 53 54 err := json.NewEncoder(p.w).Encode(codeClimateIssues) 55 if err != nil { 56 return err 57 } 58 return nil 59 }