github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/printers/codeclimate.go (about)

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