Use encoding/csv for CSV output

The encoding/csv package will take care of quoting, double-quoting,
and other CSV quirks -- avoids having to fiddle with text templates.
This commit is contained in:
Cedric Staub 2016-07-27 20:55:09 -07:00
parent 81b5e98828
commit 2ec102c7bf

View file

@ -15,9 +15,11 @@
package output package output
import ( import (
"encoding/csv"
"encoding/json" "encoding/json"
"html/template"
"io" "io"
"strconv"
"text/template"
gas "github.com/HewlettPackard/gas/core" gas "github.com/HewlettPackard/gas/core"
) )
@ -45,22 +47,13 @@ Summary:
` `
var csv = `{{ range $index, $issue := .Issues -}}
{{- $issue.File -}},
{{- $issue.Line -}},
{{- $issue.What -}},
{{- $issue.Severity -}},
{{- $issue.Confidence -}},
{{- printf "%q" $issue.Code }}
{{ end }}`
func CreateReport(w io.Writer, format string, data *gas.Analyzer) error { func CreateReport(w io.Writer, format string, data *gas.Analyzer) error {
var err error var err error
switch format { switch format {
case "json": case "json":
err = reportJSON(w, data) err = reportJSON(w, data)
case "csv": case "csv":
err = reportFromTemplate(w, csv, data) err = reportCSV(w, data)
case "text": case "text":
err = reportFromTemplate(w, text, data) err = reportFromTemplate(w, text, data)
default: default:
@ -82,6 +75,25 @@ func reportJSON(w io.Writer, data *gas.Analyzer) error {
return err return err
} }
func reportCSV(w io.Writer, data *gas.Analyzer) error {
out := csv.NewWriter(w)
defer out.Flush()
for _, issue := range data.Issues {
err := out.Write([]string{
issue.File,
strconv.Itoa(issue.Line),
issue.What,
issue.Severity.String(),
issue.Confidence.String(),
issue.Code,
})
if err != nil {
return err
}
}
return nil
}
func reportFromTemplate(w io.Writer, reportTemplate string, data *gas.Analyzer) error { func reportFromTemplate(w io.Writer, reportTemplate string, data *gas.Analyzer) error {
t, e := template.New("gas").Parse(reportTemplate) t, e := template.New("gas").Parse(reportTemplate)
if e != nil { if e != nil {