github.com/saurabh-prakash/go-cover-view@v0.0.1/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 }