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  }