Use encoding/json for -fmt json output

This commit is contained in:
Cedric Staub 2016-07-25 16:39:55 -07:00
parent 50fb7f4217
commit 271cff19f7
No known key found for this signature in database
GPG key ID: E0F193D384208FD0
3 changed files with 42 additions and 40 deletions

View file

@ -40,10 +40,10 @@ type Rule interface {
type RuleSet map[reflect.Type][]Rule
type Metrics struct {
NumFiles int
NumLines int
NumNosec int
NumFound int
NumFiles int `json:"files"`
NumLines int `json:"lines"`
NumNosec int `json:"nosec"`
NumFound int `json:"found"`
}
type Analyzer struct {
@ -51,8 +51,8 @@ type Analyzer struct {
ruleset RuleSet
context Context
logger *log.Logger
Issues []Issue
Stats Metrics
Issues []Issue `json:"issues"`
Stats Metrics `json:"metrics"`
}
func NewAnalyzer(annotations bool, logger *log.Logger) Analyzer {

View file

@ -14,6 +14,7 @@
package core
import (
"encoding/json"
"fmt"
"go/ast"
"os"
@ -28,12 +29,12 @@ const (
)
type Issue struct {
Severity Score
Confidence Score
What string
File string
Code string
Line int
Severity Score `json:"severity"`
Confidence Score `json:"confidence"`
What string `json:"details"`
File string `json:"file"`
Code string `json:"code"`
Line int `json:"line"`
}
type MetaData struct {
@ -42,6 +43,10 @@ type MetaData struct {
What string
}
func (c Score) MarshalJSON() ([]byte, error) {
return json.Marshal(c.String())
}
func (c Score) String() string {
switch c {
case High:

View file

@ -15,8 +15,9 @@
package output
import (
"encoding/json"
"html/template"
"io"
"text/template"
gas "github.com/HewlettPackard/gas/core"
)
@ -44,25 +45,6 @@ Summary:
`
var json = `{
"metrics": {
"files": {{.Stats.NumFiles}},
"lines": {{.Stats.NumLines}},
"nosec": {{.Stats.NumNosec}},
"issues": {{.Stats.NumFound}}
},
"issues": [
{{ range $index, $issue := .Issues }}{{ if $index }}, {{ end }}{
"file": "{{ $issue.File }}",
"line": "{{ $issue.Line }}",
"details": "{{ $issue.What }}",
"confidence": "{{ $issue.Confidence }}",
"severity": "{{ $issue.Severity }}",
"code": "{{ js $issue.Code }}"
}{{ end }}
]
}`
var csv = `{{ range $index, $issue := .Issues -}}
{{- $issue.File -}},
{{- $issue.Line -}},
@ -73,20 +55,35 @@ var csv = `{{ range $index, $issue := .Issues -}}
{{ end }}`
func CreateReport(w io.Writer, format string, data *gas.Analyzer) error {
reportType := text
var err error
switch format {
case "csv":
reportType = csv
case "json":
reportType = json
err = reportJSON(w, data)
case "csv":
err = reportFromTemplate(w, csv, data)
case "text":
reportType = text
err = reportFromTemplate(w, text, data)
default:
reportType = text
err = reportFromTemplate(w, text, data)
}
return err
}
func reportJSON(w io.Writer, data *gas.Analyzer) error {
raw, err := json.MarshalIndent(data, "", "\t")
if err != nil {
panic(err)
}
t, e := template.New("gas").Parse(reportType)
_, err = w.Write(raw)
if err != nil {
panic(err)
}
return err
}
func reportFromTemplate(w io.Writer, reportTemplate string, data *gas.Analyzer) error {
t, e := template.New("gas").Parse(reportTemplate)
if e != nil {
return e
}