internal/scan: refactor flag usage in text handler
Make the flag update the handler and change the name of the verbose
field in the handler.
Change-Id: I9a64eaa842ad9ffd88e4358dfe5f140dd83eb038
Reviewed-on: https://go-review.googlesource.com/c/vuln/+/580155
Reviewed-by: Ian Cottrell <iancottrell@google.com>
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/internal/scan/flags.go b/internal/scan/flags.go
index 0453bd7..482620f 100644
--- a/internal/scan/flags.go
+++ b/internal/scan/flags.go
@@ -23,16 +23,16 @@
dir string
tags buildutil.TagsFlag
test bool
- show showFlag
- format formatFlag
+ show ShowFlag
+ format FormatFlag
env []string
}
func parseFlags(cfg *config, stderr io.Writer, args []string) error {
var version bool
var json bool
- var scanFlag scanFlag
- var modeFlag modeFlag
+ var scanFlag ScanFlag
+ var modeFlag ModeFlag
flags := flag.NewFlagSet("", flag.ContinueOnError)
flags.SetOutput(stderr)
flags.BoolVar(&json, "json", false, "output JSON (Go compatible legacy flag, see format flag)")
@@ -187,9 +187,9 @@
var errFlagParse = errors.New("see -help for details")
-// showFlag is used for parsing and validation of
+// ShowFlag is used for parsing and validation of
// govulncheck -show flag.
-type showFlag []string
+type ShowFlag []string
var supportedShows = map[string]bool{
"traces": true,
@@ -198,7 +198,7 @@
"version": true,
}
-func (v *showFlag) Set(s string) error {
+func (v *ShowFlag) Set(s string) error {
if s == "" {
return nil
}
@@ -212,12 +212,28 @@
return nil
}
-func (f *showFlag) Get() interface{} { return *f }
-func (f *showFlag) String() string { return "" }
+func (v *ShowFlag) Get() interface{} { return *v }
+func (v *ShowFlag) String() string { return "" }
-// formatFlag is used for parsing and validation of
+// Update the text handler h with values of the flag.
+func (v ShowFlag) Update(h *TextHandler) {
+ for _, show := range v {
+ switch show {
+ case "traces":
+ h.showTraces = true
+ case "color":
+ h.showColor = true
+ case "version":
+ h.showVersion = true
+ case "verbose":
+ h.showVerbose = true
+ }
+ }
+}
+
+// FormatFlag is used for parsing and validation of
// govulncheck -format flag.
-type formatFlag string
+type FormatFlag string
const (
formatUnset = ""
@@ -232,19 +248,19 @@
formatSarif: true,
}
-func (f *formatFlag) Get() interface{} { return *f }
-func (f *formatFlag) Set(s string) error {
+func (f *FormatFlag) Get() interface{} { return *f }
+func (f *FormatFlag) Set(s string) error {
if _, ok := supportedFormats[s]; !ok {
return errFlagParse
}
- *f = formatFlag(s)
+ *f = FormatFlag(s)
return nil
}
-func (f *formatFlag) String() string { return "" }
+func (f *FormatFlag) String() string { return "" }
-// modeFlag is used for parsing and validation of
+// ModeFlag is used for parsing and validation of
// govulncheck -mode flag.
-type modeFlag string
+type ModeFlag string
var supportedModes = map[string]bool{
govulncheck.ScanModeSource: true,
@@ -254,19 +270,19 @@
govulncheck.ScanModeExtract: true,
}
-func (f *modeFlag) Get() interface{} { return *f }
-func (f *modeFlag) Set(s string) error {
+func (f *ModeFlag) Get() interface{} { return *f }
+func (f *ModeFlag) Set(s string) error {
if _, ok := supportedModes[s]; !ok {
return errFlagParse
}
- *f = modeFlag(s)
+ *f = ModeFlag(s)
return nil
}
-func (f *modeFlag) String() string { return "" }
+func (f *ModeFlag) String() string { return "" }
-// scanFlag is used for parsing and validation of
+// ScanFlag is used for parsing and validation of
// govulncheck -scan flag.
-type scanFlag string
+type ScanFlag string
var supportedLevels = map[string]bool{
govulncheck.ScanLevelModule: true,
@@ -274,12 +290,12 @@
govulncheck.ScanLevelSymbol: true,
}
-func (f *scanFlag) Get() interface{} { return *f }
-func (f *scanFlag) Set(s string) error {
+func (f *ScanFlag) Get() interface{} { return *f }
+func (f *ScanFlag) Set(s string) error {
if _, ok := supportedLevels[s]; !ok {
return errFlagParse
}
- *f = scanFlag(s)
+ *f = ScanFlag(s)
return nil
}
-func (f *scanFlag) String() string { return "" }
+func (f *ScanFlag) String() string { return "" }
diff --git a/internal/scan/print_test.go b/internal/scan/print_test.go
index 6fd211a..84492ed 100644
--- a/internal/scan/print_test.go
+++ b/internal/scan/print_test.go
@@ -38,7 +38,7 @@
wantText, _ := fs.ReadFile(testdata, textfile)
got := &bytes.Buffer{}
handler := scan.NewTextHandler(got)
- handler.Show(strings.Split(textname, "_")[1:])
+ scan.ShowFlag(strings.Split(textname, "_")[1:]).Update(handler)
testRunHandler(t, rawJSON, handler)
if diff := cmp.Diff(string(wantText), got.String()); diff != "" {
if *update {
diff --git a/internal/scan/run.go b/internal/scan/run.go
index e6f8fee..c59a136 100644
--- a/internal/scan/run.go
+++ b/internal/scan/run.go
@@ -43,7 +43,7 @@
handler = sarif.NewHandler(stdout)
default:
th := NewTextHandler(stdout)
- th.Show(cfg.show)
+ cfg.show.Update(th)
handler = th
}
diff --git a/internal/scan/text.go b/internal/scan/text.go
index 58dcd8d..16ab6b5 100644
--- a/internal/scan/text.go
+++ b/internal/scan/text.go
@@ -41,10 +41,10 @@
err error
- showColor bool
- showTraces bool
- showVersion bool
- showAllVulns bool
+ showColor bool
+ showTraces bool
+ showVersion bool
+ showVerbose bool
}
const (
@@ -61,21 +61,6 @@
symbolMessage = `'-scan symbol' for more fine grained vulnerability detection`
)
-func (h *TextHandler) Show(show []string) {
- for _, show := range show {
- switch show {
- case "traces":
- h.showTraces = true
- case "color":
- h.showColor = true
- case "version":
- h.showVersion = true
- case "verbose":
- h.showAllVulns = true
- }
- }
-}
-
func (h *TextHandler) Flush() error {
if len(h.findings) == 0 {
h.print(noVulnsMessage + "\n")
@@ -181,7 +166,7 @@
}
}
- if h.scanLevel == govulncheck.ScanLevelPackage || (h.scanLevel.WantPackages() && h.showAllVulns) {
+ if h.scanLevel == govulncheck.ScanLevelPackage || (h.scanLevel.WantPackages() && h.showVerbose) {
h.style(sectionStyle, "=== Package Results ===\n\n")
if len(imported) == 0 {
h.print(choose(!h.scanLevel.WantSymbols(), noVulnsMessage, noOtherVulnsMessage), "\n\n")
@@ -191,7 +176,7 @@
}
}
- if h.showAllVulns || h.scanLevel == govulncheck.ScanLevelModule {
+ if h.showVerbose || h.scanLevel == govulncheck.ScanLevelModule {
h.style(sectionStyle, "=== Module Results ===\n\n")
if len(required) == 0 {
h.print(choose(!h.scanLevel.WantPackages(), noVulnsMessage, noOtherVulnsMessage), "\n\n")
@@ -409,12 +394,12 @@
var sugg strings.Builder
switch h.scanLevel {
case govulncheck.ScanLevelSymbol:
- if !h.showAllVulns {
+ if !h.showVerbose {
sugg.WriteString("Use " + verboseMessage + ".")
}
case govulncheck.ScanLevelPackage:
sugg.WriteString("Use " + symbolMessage)
- if !h.showAllVulns {
+ if !h.showVerbose {
sugg.WriteString(" and " + verboseMessage)
}
sugg.WriteString(".")