github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/formatters/csv.go (about)

     1  package formatters
     2  
     3  import (
     4  	"encoding/csv"
     5  	"fmt"
     6  	"strconv"
     7  
     8  	"github.com/khulnasoft-lab/defsec/pkg/scan"
     9  )
    10  
    11  func outputCSV(b ConfigurableFormatter, results scan.Results) error {
    12  
    13  	records := [][]string{
    14  		{"file", "start_line", "end_line", "rule_id", "severity", "description", "link", "passed"},
    15  	}
    16  
    17  	for _, res := range results {
    18  		switch res.Status() {
    19  		case scan.StatusIgnored:
    20  			if !b.IncludeIgnored() {
    21  				continue
    22  			}
    23  		case scan.StatusPassed:
    24  			if !b.IncludePassed() {
    25  				continue
    26  			}
    27  		}
    28  		var link string
    29  		links := b.GetLinks(res)
    30  		if len(links) > 0 {
    31  			link = links[0]
    32  		}
    33  
    34  		rng := res.Range()
    35  		path := b.Path(res, res.Metadata())
    36  
    37  		records = append(records, []string{
    38  			path,
    39  			strconv.Itoa(rng.GetStartLine()),
    40  			strconv.Itoa(rng.GetEndLine()),
    41  			res.Rule().LongID(),
    42  			string(res.Severity()),
    43  			res.Description(),
    44  			link,
    45  			strconv.FormatBool(res.Status() == scan.StatusPassed),
    46  		})
    47  	}
    48  
    49  	csvWriter := csv.NewWriter(b.Writer())
    50  
    51  	for _, record := range records {
    52  		if err := csvWriter.Write(record); err != nil {
    53  			return fmt.Errorf("error writing record to csv: `%w`", err)
    54  		}
    55  	}
    56  
    57  	csvWriter.Flush()
    58  
    59  	return csvWriter.Error()
    60  }