github.com/kjda/go-cover-view@v0.0.0-20220315052405-f5bf4245a54f/json.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"strings"
     7  
     8  	"golang.org/x/tools/cover"
     9  )
    10  
    11  type jsonRenderer struct{}
    12  
    13  var _ renderer = (*jsonRenderer)(nil)
    14  
    15  func (r *jsonRenderer) Render(w io.Writer, profiles []*cover.Profile, path string) error {
    16  	results, err := getJSONResults(profiles, path)
    17  	if err != nil {
    18  		return err
    19  	}
    20  	return json.NewEncoder(w).Encode(results)
    21  }
    22  
    23  type jsonResult struct {
    24  	FileName       string `json:"fileName"`
    25  	CoveredLines   []int  `json:"coveredLines"`
    26  	UncoveredLines []int  `json:"uncoveredLines"`
    27  }
    28  
    29  func newJSONResult(fileName string, lines []string) *jsonResult {
    30  	coveredLines := make([]int, 0, len(lines))
    31  	uncoveredLines := make([]int, 0, len(lines))
    32  	for i, line := range lines {
    33  		switch {
    34  		case strings.HasPrefix(line, covered):
    35  			coveredLines = append(coveredLines, i+1)
    36  		case strings.HasPrefix(line, uncovered):
    37  			uncoveredLines = append(uncoveredLines, i+1)
    38  		}
    39  	}
    40  	return &jsonResult{
    41  		FileName:       fileName,
    42  		CoveredLines:   coveredLines,
    43  		UncoveredLines: uncoveredLines,
    44  	}
    45  }
    46  
    47  func getJSONResults(profiles []*cover.Profile, path string) ([]*jsonResult, error) {
    48  	diffs, err := getDiffs()
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	results := make([]*jsonResult, 0, len(profiles))
    53  	for _, profile := range profiles {
    54  		lines, err := getLines(profile, path)
    55  		if err != nil {
    56  			return nil, err
    57  		}
    58  		if gitDiffOnly {
    59  			if containsDiff(profile.FileName, path, diffs) {
    60  				results = append(results, newJSONResult(profile.FileName, lines))
    61  			}
    62  		} else {
    63  			results = append(results, newJSONResult(profile.FileName, lines))
    64  		}
    65  	}
    66  	return results, nil
    67  }