Skip to content

Commit f55f5e3

Browse files
committed
Remove the strategy-formatter stuff to simplify
1 parent 4d56c59 commit f55f5e3

File tree

4 files changed

+71
-104
lines changed

4 files changed

+71
-104
lines changed

cmd/gocognit/main.go

Lines changed: 71 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package main
1818

1919
import (
20+
"encoding/json"
2021
"flag"
2122
"fmt"
2223
"go/parser"
@@ -27,6 +28,7 @@ import (
2728
"path/filepath"
2829
"sort"
2930
"strings"
31+
"text/template"
3032

3133
"github.com/uudashr/gocognit"
3234
)
@@ -35,47 +37,53 @@ const usageDoc = `Calculate cognitive complexities of Go functions.
3537
Usage:
3638
gocognit [flags] <Go file or directory> ...
3739
Flags:
38-
-over N show functions with complexity > N only and
39-
return exit code 1 if the set is non-empty
40-
-top N show the top N most complex functions only
41-
-avg show the average complexity over all functions,
42-
not depending on whether -over or -top are set
43-
-format string
44-
which format to use, supported formats: [text json json-pretty] (default "text")
40+
-over N show functions with complexity > N only and
41+
return exit code 1 if the set is non-empty
42+
-top N show the top N most complex functions only
43+
-avg show the average complexity over all functions,
44+
not depending on whether -over or -top are set
45+
-json encode the output as JSON
46+
-f format string the format to use (default "{{.PkgName}}.{{.FuncName}}:{{.Complexity}}:{{.Pos}}")
4547
The output fields for each line are:
48+
{{.Complexity}} {{.PkgName}} {{.FuncName}} {{.Pos}} or equal to
4649
<complexity> <package> <function> <file:row:column>
50+
51+
The struct being passed to the template is:
52+
53+
type Stat struct {
54+
PkgName string
55+
FuncName string
56+
Complexity int
57+
Pos token.Position
58+
}
4759
`
4860

4961
const (
5062
defaultOverFlagVal = 0
5163
defaultTopFlagVal = -1
5264
)
5365

54-
const (
55-
textFormat = "text"
56-
jsonFormat = "json"
57-
jsonPrettyFormat = "json-pretty"
58-
)
59-
60-
var errFormatNotDefined = fmt.Errorf("format is not valid, use a supported format %v", supportedFormats)
61-
62-
var (
63-
supportedFormats = []string{
64-
textFormat, jsonFormat, jsonPrettyFormat,
65-
}
66-
67-
over = flag.Int("over", defaultOverFlagVal, "show functions with complexity > N only")
68-
top = flag.Int("top", defaultTopFlagVal, "show the top N most complex functions only")
69-
avg = flag.Bool("avg", false, "show the average complexity")
70-
format = flag.String("format", textFormat, fmt.Sprintf("which format to use, supported formats: %v", supportedFormats))
71-
)
66+
const defaultFormat = "{{.Complexity}} {{.PkgName}} {{.FuncName}} {{.Pos}}"
7267

7368
func usage() {
7469
_, _ = fmt.Fprint(os.Stderr, usageDoc)
7570
os.Exit(2)
7671
}
7772

7873
func main() {
74+
var (
75+
over int
76+
top int
77+
avg bool
78+
format string
79+
jsonEncode bool
80+
)
81+
flag.IntVar(&over, "over", defaultOverFlagVal, "show functions with complexity > N only")
82+
flag.IntVar(&top, "top", defaultTopFlagVal, "show the top N most complex functions only")
83+
flag.BoolVar(&avg, "avg", false, "show the average complexity")
84+
flag.StringVar(&format, "f", defaultFormat, "the format to use")
85+
flag.BoolVar(&jsonEncode, "json", false, "encode the output as JSON")
86+
7987
log.SetFlags(0)
8088
log.SetPrefix("gocognit: ")
8189
flag.Usage = usage
@@ -85,22 +93,34 @@ func main() {
8593
usage()
8694
}
8795

96+
tmpl, err := template.New("gocognit").Parse(format)
97+
if err != nil {
98+
log.Fatal(err)
99+
}
100+
88101
stats, err := analyze(args)
89102
if err != nil {
90103
log.Fatal(err)
91104
}
92105

93106
sort.Sort(byComplexity(stats))
94-
written, err := writeStats(os.Stdout, stats)
107+
108+
filteredStats := filterStats(stats, top, over)
109+
var written int
110+
if jsonEncode {
111+
written, err = writeJSONStats(os.Stdout, filteredStats)
112+
} else {
113+
written, err = writeTextStats(os.Stdout, filteredStats, tmpl)
114+
}
95115
if err != nil {
96116
log.Fatal(err)
97117
}
98118

99-
if *avg {
119+
if avg {
100120
showAverage(stats)
101121
}
102122

103-
if *over > 0 && written > 0 {
123+
if over > 0 && written > 0 {
104124
os.Exit(1)
105125
}
106126
}
@@ -172,38 +192,42 @@ func analyzeDir(dirname string, stats []gocognit.Stat) ([]gocognit.Stat, error)
172192
return stats, nil
173193
}
174194

175-
func writeStats(w io.Writer, sortedStats []gocognit.Stat) (int, error) {
176-
var formatter gocognit.Formatter
177-
switch *format {
178-
case textFormat:
179-
formatter = gocognit.NewTextFormatter(w)
180-
case jsonFormat:
181-
formatter = gocognit.NewJsonFormatter(w, false)
182-
case jsonPrettyFormat:
183-
formatter = gocognit.NewJsonFormatter(w, true)
184-
default:
185-
return 0, errFormatNotDefined
195+
func writeTextStats(w io.Writer, stats []gocognit.Stat, tmpl *template.Template) (int, error) {
196+
for i, stat := range stats {
197+
if err := tmpl.Execute(w, stat); err != nil {
198+
return i, err
199+
}
200+
fmt.Fprintln(w)
186201
}
187202

203+
return len(stats), nil
204+
}
205+
206+
func writeJSONStats(w io.Writer, stats []gocognit.Stat) (int, error) {
207+
enc := json.NewEncoder(w)
208+
enc.SetIndent("", " ")
209+
if err := enc.Encode(stats); err != nil {
210+
return 0, err
211+
}
212+
213+
return len(stats), nil
214+
}
215+
216+
func filterStats(sortedStats []gocognit.Stat, top, over int) []gocognit.Stat {
188217
var filtered []gocognit.Stat
189218
for i, stat := range sortedStats {
190-
if i == *top {
219+
if i == top {
191220
break
192221
}
193222

194-
if stat.Complexity <= *over {
223+
if stat.Complexity <= over {
195224
break
196225
}
197226

198227
filtered = append(filtered, stat)
199228
}
200229

201-
err := formatter.Format(filtered)
202-
if err != nil {
203-
return 0, err
204-
}
205-
206-
return len(filtered), nil
230+
return filtered
207231
}
208232

209233
func showAverage(stats []gocognit.Stat) {

formatter.go

Lines changed: 0 additions & 5 deletions
This file was deleted.

formatter_json.go

Lines changed: 0 additions & 25 deletions
This file was deleted.

formatter_text.go

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)