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(".")