@@ -19,6 +19,7 @@ pub(crate) fn generate_internal<T: Service>(
1919 disable_comments : & HashSet < String > ,
2020 use_arc_self : bool ,
2121 generate_default_stubs : bool ,
22+ use_generic_streaming_requests : bool ,
2223) -> TokenStream {
2324 let methods = generate_methods (
2425 service,
@@ -41,6 +42,7 @@ pub(crate) fn generate_internal<T: Service>(
4142 disable_comments,
4243 use_arc_self,
4344 generate_default_stubs,
45+ use_generic_streaming_requests,
4446 ) ;
4547 let package = if emit_package { service. package ( ) } else { "" } ;
4648 // Transport based implementations
@@ -203,6 +205,7 @@ fn generate_trait<T: Service>(
203205 disable_comments : & HashSet < String > ,
204206 use_arc_self : bool ,
205207 generate_default_stubs : bool ,
208+ use_generic_streaming_requests : bool ,
206209) -> TokenStream {
207210 let methods = generate_trait_methods (
208211 service,
@@ -212,6 +215,7 @@ fn generate_trait<T: Service>(
212215 disable_comments,
213216 use_arc_self,
214217 generate_default_stubs,
218+ use_generic_streaming_requests,
215219 ) ;
216220 let trait_doc = generate_doc_comment ( format ! (
217221 " Generated trait containing gRPC methods that should be implemented for use with {}Server." ,
@@ -227,6 +231,7 @@ fn generate_trait<T: Service>(
227231 }
228232}
229233
234+ #[ allow( clippy:: too_many_arguments) ]
230235fn generate_trait_methods < T : Service > (
231236 service : & T ,
232237 emit_package : bool ,
@@ -235,6 +240,7 @@ fn generate_trait_methods<T: Service>(
235240 disable_comments : & HashSet < String > ,
236241 use_arc_self : bool ,
237242 generate_default_stubs : bool ,
243+ use_generic_streaming_requests : bool ,
238244) -> TokenStream {
239245 let mut stream = TokenStream :: new ( ) ;
240246
@@ -257,10 +263,16 @@ fn generate_trait_methods<T: Service>(
257263 quote ! ( & self )
258264 } ;
259265
260- let req_param_type = if method. client_streaming ( ) {
266+ let result = |ok| quote ! ( std:: result:: Result <#ok, tonic:: Status >) ;
267+ let response_result = |message| result ( quote ! ( tonic:: Response <#message>) ) ;
268+
269+ let req_param_type = if !method. client_streaming ( ) {
270+ quote ! ( tonic:: Request <#req_message>)
271+ } else if !use_generic_streaming_requests {
261272 quote ! ( tonic:: Request <tonic:: Streaming <#req_message>>)
262273 } else {
263- quote ! ( tonic:: Request <#req_message>)
274+ let message_ty = result ( req_message) ;
275+ quote ! ( impl tonic:: IntoStreamingRequest <Message = #message_ty, Stream : Unpin > + std:: marker:: Send )
264276 } ;
265277
266278 let partial_sig = quote ! {
@@ -278,9 +290,6 @@ fn generate_trait_methods<T: Service>(
278290 quote ! ( ; )
279291 } ;
280292
281- let result = |ok| quote ! ( std:: result:: Result <#ok, tonic:: Status >) ;
282- let response_result = |message| result ( quote ! ( tonic:: Response <#message>) ) ;
283-
284293 let method = if !method. server_streaming ( ) {
285294 let return_ty = response_result ( res_message) ;
286295 quote ! {
0 commit comments