fix(build): Remove ambiguity in service method call (#327)
When calling methods on Arc<MyService> where the method is also defined on Arc (e.g. drop and clone), calling inner.#method_ident(request) will actually attempt to call the Arc method instead of the method on the service, resulting in a compile error. This change removes the ambiguity by dereferencing the inner Arc.
This commit is contained in:
@@ -13,5 +13,6 @@ members = [
|
||||
"tests/same_name",
|
||||
"tests/wellknown",
|
||||
"tests/extern_path/uuid",
|
||||
"tests/ambiguous_methods",
|
||||
"tests/extern_path/my_application"
|
||||
]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "ambiguous_methods"
|
||||
version = "0.1.0"
|
||||
authors = ["Yonathan Randolph <[email protected]>"]
|
||||
edition = "2018"
|
||||
publish = false
|
||||
license = "MIT"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
tonic = { path= "../../tonic" }
|
||||
prost = "0.6"
|
||||
|
||||
[build-dependencies]
|
||||
tonic-build = { path= "../../tonic-build" }
|
||||
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tonic_build::compile_protos("proto/ambiguous_methods.proto").unwrap();
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package ambiguous_methods;
|
||||
|
||||
message DropReq {}
|
||||
message DropResp {}
|
||||
|
||||
// The generated stubs can confuse drop and clone
|
||||
// with the same method names from Arc,
|
||||
// resulting in a compile error.
|
||||
service HelloService {
|
||||
rpc Drop (DropReq) returns (DropResp);
|
||||
rpc Clone (DropReq) returns (DropResp);
|
||||
}
|
||||
|
||||
service HelloStreamingService {
|
||||
rpc Drop (DropReq) returns (stream DropResp);
|
||||
rpc Clone (DropReq) returns (stream DropResp);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#[macro_use]
|
||||
extern crate tonic;
|
||||
|
||||
tonic::include_proto!("ambiguous_methods");
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
@@ -273,7 +273,7 @@ fn generate_unary<T: Method>(
|
||||
fn call(&mut self, request: tonic::Request<#request>) -> Self::Future {
|
||||
let inner = self.0.clone();
|
||||
let fut = async move {
|
||||
inner.#method_ident(request).await
|
||||
(*inner).#method_ident(request).await
|
||||
};
|
||||
Box::pin(fut)
|
||||
}
|
||||
@@ -326,7 +326,7 @@ fn generate_server_streaming<T: Method>(
|
||||
fn call(&mut self, request: tonic::Request<#request>) -> Self::Future {
|
||||
let inner = self.0.clone();
|
||||
let fut = async move {
|
||||
inner.#method_ident(request).await
|
||||
(*inner).#method_ident(request).await
|
||||
|
||||
};
|
||||
Box::pin(fut)
|
||||
@@ -377,7 +377,7 @@ fn generate_client_streaming<T: Method>(
|
||||
fn call(&mut self, request: tonic::Request<tonic::Streaming<#request>>) -> Self::Future {
|
||||
let inner = self.0.clone();
|
||||
let fut = async move {
|
||||
inner.#method_ident(request).await
|
||||
(*inner).#method_ident(request).await
|
||||
|
||||
};
|
||||
Box::pin(fut)
|
||||
@@ -432,7 +432,7 @@ fn generate_streaming<T: Method>(
|
||||
fn call(&mut self, request: tonic::Request<tonic::Streaming<#request>>) -> Self::Future {
|
||||
let inner = self.0.clone();
|
||||
let fut = async move {
|
||||
inner.#method_ident(request).await
|
||||
(*inner).#method_ident(request).await
|
||||
};
|
||||
Box::pin(fut)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user