@@ -19,6 +19,7 @@ pub(crate) fn generate_internal<T: Service>(
19
19
disable_comments : & HashSet < String > ,
20
20
use_arc_self : bool ,
21
21
generate_default_stubs : bool ,
22
+ use_generic_streaming_requests : bool ,
22
23
) -> TokenStream {
23
24
let methods = generate_methods (
24
25
service,
@@ -41,6 +42,7 @@ pub(crate) fn generate_internal<T: Service>(
41
42
disable_comments,
42
43
use_arc_self,
43
44
generate_default_stubs,
45
+ use_generic_streaming_requests,
44
46
) ;
45
47
let package = if emit_package { service. package ( ) } else { "" } ;
46
48
// Transport based implementations
@@ -203,6 +205,7 @@ fn generate_trait<T: Service>(
203
205
disable_comments : & HashSet < String > ,
204
206
use_arc_self : bool ,
205
207
generate_default_stubs : bool ,
208
+ use_generic_streaming_requests : bool ,
206
209
) -> TokenStream {
207
210
let methods = generate_trait_methods (
208
211
service,
@@ -212,6 +215,7 @@ fn generate_trait<T: Service>(
212
215
disable_comments,
213
216
use_arc_self,
214
217
generate_default_stubs,
218
+ use_generic_streaming_requests,
215
219
) ;
216
220
let trait_doc = generate_doc_comment ( format ! (
217
221
" Generated trait containing gRPC methods that should be implemented for use with {}Server." ,
@@ -227,6 +231,7 @@ fn generate_trait<T: Service>(
227
231
}
228
232
}
229
233
234
+ #[ allow( clippy:: too_many_arguments) ]
230
235
fn generate_trait_methods < T : Service > (
231
236
service : & T ,
232
237
emit_package : bool ,
@@ -235,6 +240,7 @@ fn generate_trait_methods<T: Service>(
235
240
disable_comments : & HashSet < String > ,
236
241
use_arc_self : bool ,
237
242
generate_default_stubs : bool ,
243
+ use_generic_streaming_requests : bool ,
238
244
) -> TokenStream {
239
245
let mut stream = TokenStream :: new ( ) ;
240
246
@@ -257,10 +263,20 @@ fn generate_trait_methods<T: Service>(
257
263
quote ! ( & self )
258
264
} ;
259
265
260
- let req_param_type = if method. client_streaming ( ) {
261
- quote ! ( tonic:: Request <tonic:: Streaming <#req_message>>)
262
- } else {
263
- quote ! ( tonic:: Request <#req_message>)
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 = {
270
+ let inner_ty = if !method. client_streaming ( ) {
271
+ req_message
272
+ } else if !use_generic_streaming_requests {
273
+ quote ! ( tonic:: Streaming <#req_message>)
274
+ } else {
275
+ let message_ty = result ( req_message) ;
276
+ quote ! ( impl tokio_stream:: Stream <Item = #message_ty> + std:: marker:: Send + std:: marker:: Unpin )
277
+ } ;
278
+
279
+ quote ! ( tonic:: Request <#inner_ty>)
264
280
} ;
265
281
266
282
let partial_sig = quote ! {
@@ -278,9 +294,6 @@ fn generate_trait_methods<T: Service>(
278
294
quote ! ( ; )
279
295
} ;
280
296
281
- let result = |ok| quote ! ( std:: result:: Result <#ok, tonic:: Status >) ;
282
- let response_result = |message| result ( quote ! ( tonic:: Response <#message>) ) ;
283
-
284
297
let method = if !method. server_streaming ( ) {
285
298
let return_ty = response_result ( res_message) ;
286
299
quote ! {
0 commit comments