Add Connection ClientSetting (#25)
On Dial, if Connection is not nil, it's used in place of any user
provided gRPC settings or the default.
diff --git a/client_option.go b/client_option.go
index 531a59c..e2fcb23 100644
--- a/client_option.go
+++ b/client_option.go
@@ -24,6 +24,7 @@
Scopes []string
CallOptions map[string][]CallOption
DialOptions []grpc.DialOption
+ Connection *grpc.ClientConn
}
func (w ClientSettings) Resolve(s *ClientSettings) {
@@ -33,6 +34,7 @@
WithScopes(w.Scopes...).Resolve(s)
WithCallOptions(w.CallOptions).Resolve(s)
WithDialOptions(w.DialOptions...).Resolve(s)
+ s.Connection = w.Connection
}
type withAppName string
@@ -97,3 +99,13 @@
func WithDialOptions(opts ...grpc.DialOption) ClientOption {
return withDialOptions(opts)
}
+
+type withConnection grpc.ClientConn
+
+func (w *withConnection) Resolve(s *ClientSettings) {
+ s.Connection = (*grpc.ClientConn)(w)
+}
+
+func WithConnection(conn *grpc.ClientConn) ClientOption {
+ return (*withConnection)(conn)
+}
diff --git a/client_option_test.go b/client_option_test.go
index 7862f54..8d1f2cb 100644
--- a/client_option_test.go
+++ b/client_option_test.go
@@ -9,6 +9,7 @@
)
func TestClientOptionsPieceByPiece(t *testing.T) {
+ conn := &grpc.ClientConn{}
expected := &ClientSettings{
"myapi",
"v0.1.0",
@@ -16,6 +17,7 @@
[]string{"https://example.com/auth/helloworld", "https://example.com/auth/otherthing"},
map[string][]CallOption{"ListWorlds": []CallOption{WithTimeout(3 * time.Second)}},
[]grpc.DialOption{},
+ conn,
}
settings := &ClientSettings{}
@@ -26,6 +28,7 @@
WithScopes("https://example.com/auth/helloworld", "https://example.com/auth/otherthing"),
WithCallOptions(map[string][]CallOption{"ListWorlds": []CallOption{WithTimeout(3 * time.Second)}}),
WithDialOptions(), // Can't compare function signatures for equality.
+ WithConnection(conn),
}
clientOptions(opts).Resolve(settings)
diff --git a/dial.go b/dial.go
index abdb300..34620ba 100644
--- a/dial.go
+++ b/dial.go
@@ -14,6 +14,9 @@
settings := &ClientSettings{}
clientOptions(opts).Resolve(settings)
+ if settings.Connection != nil {
+ return settings.Connection, nil
+ }
var dialOpts = settings.DialOptions
if len(dialOpts) == 0 {
tokenSource, err := google.DefaultTokenSource(ctx, settings.Scopes...)