internal/buildbinary: refactor FindAndBuild ouptut

Changes FindAndBuild binaries to output a slice of binary info instead
of a map. This makes adding more information about the binaries easier
at no cost (all operations over the previous output were simply
iterating over map keys).

Change-Id: I40ad8931dd1ed7f1005499482444b662aea2d28f
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/518356
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Maceo Thompson <maceothompson@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/cmd/govulncheck_compare/govulncheck_compare.go b/cmd/govulncheck_compare/govulncheck_compare.go
index 5516e6b..52214c5 100644
--- a/cmd/govulncheck_compare/govulncheck_compare.go
+++ b/cmd/govulncheck_compare/govulncheck_compare.go
@@ -20,7 +20,6 @@
 	"io"
 	"os"
 
-	"golang.org/x/exp/slices"
 	"golang.org/x/pkgsite-metrics/internal/buildbinary"
 	"golang.org/x/pkgsite-metrics/internal/govulncheck"
 )
@@ -51,40 +50,32 @@
 		FindingsForMod: make(map[string]*govulncheck.ComparePair),
 	}
 
-	binaryPaths, err := buildbinary.FindAndBuildBinaries(modulePath)
+	binaries, err := buildbinary.FindAndBuildBinaries(modulePath)
 	if err != nil {
 		fail(err)
 		return
 	}
-	defer removeBinaries(binaryPaths)
+	defer removeBinaries(binaries)
 
-	// Sort binaryPath keys so that range is deterministic
-	keys := make([]string, 0, len(binaryPaths))
-	for k := range binaryPaths {
-		keys = append(keys, k)
-	}
-	slices.Sort(keys)
-
-	for _, binaryPath := range keys {
-		importPath := binaryPaths[binaryPath]
+	for _, binary := range binaries {
 		pair := govulncheck.ComparePair{
 			BinaryResults: govulncheck.SandboxResponse{Stats: govulncheck.ScanStats{}},
 			SourceResults: govulncheck.SandboxResponse{Stats: govulncheck.ScanStats{}},
 		}
 
-		pair.SourceResults.Findings, err = govulncheck.RunGovulncheckCmd(govulncheckPath, govulncheck.FlagSource, importPath, modulePath, vulndbPath, &pair.SourceResults.Stats)
+		pair.SourceResults.Findings, err = govulncheck.RunGovulncheckCmd(govulncheckPath, govulncheck.FlagSource, binary.ImportPath, modulePath, vulndbPath, &pair.SourceResults.Stats)
 		if err != nil {
 			fail(err)
 			return
 		}
 
-		pair.BinaryResults.Findings, err = govulncheck.RunGovulncheckCmd(govulncheckPath, govulncheck.FlagBinary, binaryPath, modulePath, vulndbPath, &pair.BinaryResults.Stats)
+		pair.BinaryResults.Findings, err = govulncheck.RunGovulncheckCmd(govulncheckPath, govulncheck.FlagBinary, binary.BinaryPath, modulePath, vulndbPath, &pair.BinaryResults.Stats)
 		if err != nil {
 			fail(err)
 			return
 		}
 
-		response.FindingsForMod[importPath] = &pair
+		response.FindingsForMod[binary.ImportPath] = &pair
 	}
 
 	b, err := json.MarshalIndent(response, "", "\t")
@@ -97,8 +88,8 @@
 	fmt.Println()
 }
 
-func removeBinaries(binaryPaths map[string]string) {
-	for path := range binaryPaths {
-		os.Remove(path)
+func removeBinaries(binaryPaths []*buildbinary.BinaryInfo) {
+	for _, bin := range binaryPaths {
+		os.Remove(bin.BinaryPath)
 	}
 }
diff --git a/internal/buildbinary/bin.go b/internal/buildbinary/bin.go
index 47ab1a4..892c232 100644
--- a/internal/buildbinary/bin.go
+++ b/internal/buildbinary/bin.go
@@ -13,24 +13,28 @@
 	"golang.org/x/pkgsite-metrics/internal/derrors"
 )
 
-// TODO: Consider making struct if we want to pass successful binaries & still
-// be aware if building others failed for some reason.
+type BinaryInfo struct {
+	BinaryPath string
+	ImportPath string
+}
 
 // FindAndBuildBinaries finds and builds all possible binaries from a given module.
-func FindAndBuildBinaries(modulePath string) (binaries map[string]string, err error) {
+func FindAndBuildBinaries(modulePath string) (binaries []*BinaryInfo, err error) {
 	defer derrors.Wrap(&err, "FindAndBuildBinaries")
 	buildTargets, err := findBinaries(modulePath)
 	if err != nil {
 		return nil, err
 	}
-	binaries = make(map[string]string)
 
 	for i, target := range buildTargets {
 		path, err := runBuild(modulePath, target, i)
 		if err != nil {
 			return nil, err
 		}
-		binaries[path] = target
+		binaries = append(binaries, &BinaryInfo{
+			BinaryPath: path,
+			ImportPath: target,
+		})
 	}
 	return binaries, nil
 }