Move findRule() into bazel_util.go.

Move to shared util file so that it may be used by other exporters.

Bug: skia:13485
Change-Id: I69c2f90dd1e333bd19e529b1660790e4bb5fc506
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/566438
Reviewed-by: Kevin Lubick <kjlubick@google.com>
diff --git a/bazel/exporter/bazel_util.go b/bazel/exporter/bazel_util.go
index a7cfd54..728c084 100644
--- a/bazel/exporter/bazel_util.go
+++ b/bazel/exporter/bazel_util.go
@@ -14,6 +14,7 @@
 
 	"go.skia.org/infra/go/skerr"
 	"go.skia.org/infra/go/util"
+	"go.skia.org/skia/bazel/exporter/build_proto/analysis_v2"
 	"go.skia.org/skia/bazel/exporter/build_proto/build"
 )
 
@@ -34,6 +35,18 @@
 	return name[0] == '@'
 }
 
+// Given a Bazel rule name find that rule from within the
+// query results.
+func findRule(qr *analysis_v2.CqueryResult, name string) (*build.Rule, error) {
+	for _, result := range qr.GetResults() {
+		r := result.GetTarget().GetRule()
+		if r.GetName() == name {
+			return r, nil
+		}
+	}
+	return nil, skerr.Fmt(`cannot find rule %q`, name)
+}
+
 // Parse a rule into its constituent parts.
 // https://docs.bazel.build/versions/main/guide.html#specifying-targets-to-build
 func parseRule(rule string) (repo string, path string, target string, err error) {
diff --git a/bazel/exporter/bazel_util_test.go b/bazel/exporter/bazel_util_test.go
index cee865d..b111570 100644
--- a/bazel/exporter/bazel_util_test.go
+++ b/bazel/exporter/bazel_util_test.go
@@ -10,7 +10,9 @@
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.skia.org/skia/bazel/exporter/build_proto/analysis_v2"
 	"go.skia.org/skia/bazel/exporter/build_proto/build"
+	"google.golang.org/protobuf/encoding/prototext"
 )
 
 func TestMakeCanonicalRuleName_ValidInput_Success(t *testing.T) {
@@ -128,3 +130,34 @@
 func TestIsFileRule_ValidNonFileRule_ReturnsFalse(t *testing.T) {
 	assert.False(t, isFileTarget("//dir/path:hello"))
 }
+
+func TestFindRule_RuleExists_Success(t *testing.T) {
+	qr := analysis_v2.CqueryResult{}
+	err := prototext.Unmarshal([]byte(textProto), &qr)
+	require.NoError(t, err)
+
+	r, err := findRule(&qr, "//src/apps:hello")
+	require.NoError(t, err)
+	require.NotNil(t, r)
+	assert.Equal(t, "//src/apps:hello", r.GetName())
+}
+
+func TestFindRule_RuleDoesntExists_ReturnsError(t *testing.T) {
+	qr := analysis_v2.CqueryResult{}
+	err := prototext.Unmarshal([]byte(textProto), &qr)
+	require.NoError(t, err)
+
+	r, err := findRule(&qr, "//path/to:nonexistent_rule")
+	assert.Error(t, err)
+	assert.Nil(t, r)
+}
+
+func TestFindRule_InvalidRule_ReturnsError(t *testing.T) {
+	qr := analysis_v2.CqueryResult{}
+	err := prototext.Unmarshal([]byte(textProto), &qr)
+	require.NoError(t, err)
+
+	r, err := findRule(&qr, "")
+	assert.Error(t, err)
+	assert.Nil(t, r)
+}
diff --git a/bazel/exporter/cmake_exporter.go b/bazel/exporter/cmake_exporter.go
index 58eaf33..d39f07c 100644
--- a/bazel/exporter/cmake_exporter.go
+++ b/bazel/exporter/cmake_exporter.go
@@ -32,18 +32,6 @@
 	}
 }
 
-// Given a Bazel rule name find that rule from within the
-// query results.
-func findRule(qr *analysis_v2.CqueryResult, name string) (*build.Rule, error) {
-	for _, result := range qr.GetResults() {
-		r := result.GetTarget().GetRule()
-		if r.GetName() == name {
-			return r, nil
-		}
-	}
-	return nil, skerr.Fmt(`cannot find rule %q`, name)
-}
-
 // Return the default copts (COMPILE_FLAGS in CMake) for the macOS toolchain.
 func getMacPlatformRuleCopts() []string {
 	// TODO(crbug.com/skia/13586): Retrieve these values from Bazel.
diff --git a/bazel/exporter/cmake_exporter_test.go b/bazel/exporter/cmake_exporter_test.go
index 4ac6b77..4942bf3 100644
--- a/bazel/exporter/cmake_exporter_test.go
+++ b/bazel/exporter/cmake_exporter_test.go
@@ -249,37 +249,6 @@
 	assert.Equal(t, expected, contents.String())
 }
 
-func TestFindRule_RuleExists_Success(t *testing.T) {
-	qr := analysis_v2.CqueryResult{}
-	err := prototext.Unmarshal([]byte(textProto), &qr)
-	require.NoError(t, err)
-
-	r, err := findRule(&qr, "//src/apps:hello")
-	require.NoError(t, err)
-	require.NotNil(t, r)
-	assert.Equal(t, "//src/apps:hello", r.GetName())
-}
-
-func TestFindRule_RuleDoesntExists_ReturnsError(t *testing.T) {
-	qr := analysis_v2.CqueryResult{}
-	err := prototext.Unmarshal([]byte(textProto), &qr)
-	require.NoError(t, err)
-
-	r, err := findRule(&qr, "//path/to:nonexistent_rule")
-	assert.Error(t, err)
-	assert.Nil(t, r)
-}
-
-func TestFindRule_InvalidRule_ReturnsError(t *testing.T) {
-	qr := analysis_v2.CqueryResult{}
-	err := prototext.Unmarshal([]byte(textProto), &qr)
-	require.NoError(t, err)
-
-	r, err := findRule(&qr, "")
-	assert.Error(t, err)
-	assert.Nil(t, r)
-}
-
 func TestGetRuleCopts_CoptsExists_Success(t *testing.T) {
 	qr := analysis_v2.CqueryResult{}
 	err := prototext.Unmarshal([]byte(textProto), &qr)