@@ -17,13 +17,15 @@ pub(crate) fn generate_internal<T: Service>(
17
17
attributes : & Attributes ,
18
18
disable_comments : & HashSet < String > ,
19
19
use_arc_self : bool ,
20
+ generate_default_stubs : bool ,
20
21
) -> TokenStream {
21
22
let methods = generate_methods (
22
23
service,
23
24
emit_package,
24
25
proto_path,
25
26
compile_well_known_types,
26
27
use_arc_self,
28
+ generate_default_stubs,
27
29
) ;
28
30
29
31
let server_service = quote:: format_ident!( "{}Server" , service. name( ) ) ;
@@ -37,6 +39,7 @@ pub(crate) fn generate_internal<T: Service>(
37
39
server_trait. clone ( ) ,
38
40
disable_comments,
39
41
use_arc_self,
42
+ generate_default_stubs,
40
43
) ;
41
44
let package = if emit_package { service. package ( ) } else { "" } ;
42
45
// Transport based implementations
@@ -214,6 +217,7 @@ fn generate_trait<T: Service>(
214
217
server_trait : Ident ,
215
218
disable_comments : & HashSet < String > ,
216
219
use_arc_self : bool ,
220
+ generate_default_stubs : bool ,
217
221
) -> TokenStream {
218
222
let methods = generate_trait_methods (
219
223
service,
@@ -222,6 +226,7 @@ fn generate_trait<T: Service>(
222
226
compile_well_known_types,
223
227
disable_comments,
224
228
use_arc_self,
229
+ generate_default_stubs,
225
230
) ;
226
231
let trait_doc = generate_doc_comment ( format ! (
227
232
" Generated trait containing gRPC methods that should be implemented for use with {}Server." ,
@@ -244,6 +249,7 @@ fn generate_trait_methods<T: Service>(
244
249
compile_well_known_types : bool ,
245
250
disable_comments : & HashSet < String > ,
246
251
use_arc_self : bool ,
252
+ generate_default_stubs : bool ,
247
253
) -> TokenStream {
248
254
let mut stream = TokenStream :: new ( ) ;
249
255
@@ -266,22 +272,53 @@ fn generate_trait_methods<T: Service>(
266
272
quote ! ( & self )
267
273
} ;
268
274
269
- let method = match ( method. client_streaming ( ) , method. server_streaming ( ) ) {
270
- ( false , false ) => {
275
+ let method = match (
276
+ method. client_streaming ( ) ,
277
+ method. server_streaming ( ) ,
278
+ generate_default_stubs,
279
+ ) {
280
+ ( false , false , true ) => {
281
+ quote ! {
282
+ #method_doc
283
+ async fn #name( #self_param, request: tonic:: Request <#req_message>)
284
+ -> std:: result:: Result <tonic:: Response <#res_message>, tonic:: Status > {
285
+ Err ( tonic:: Status :: unimplemented( "Not yet implemented" ) )
286
+ }
287
+ }
288
+ }
289
+ ( false , false , false ) => {
271
290
quote ! {
272
291
#method_doc
273
292
async fn #name( #self_param, request: tonic:: Request <#req_message>)
274
293
-> std:: result:: Result <tonic:: Response <#res_message>, tonic:: Status >;
275
294
}
276
295
}
277
- ( true , false ) => {
296
+ ( true , false , true ) => {
297
+ quote ! {
298
+ #method_doc
299
+ async fn #name( #self_param, request: tonic:: Request <tonic:: Streaming <#req_message>>)
300
+ -> std:: result:: Result <tonic:: Response <#res_message>, tonic:: Status > {
301
+ Err ( tonic:: Status :: unimplemented( "Not yet implemented" ) )
302
+ }
303
+ }
304
+ }
305
+ ( true , false , false ) => {
278
306
quote ! {
279
307
#method_doc
280
308
async fn #name( #self_param, request: tonic:: Request <tonic:: Streaming <#req_message>>)
281
309
-> std:: result:: Result <tonic:: Response <#res_message>, tonic:: Status >;
282
310
}
283
311
}
284
- ( false , true ) => {
312
+ ( false , true , true ) => {
313
+ quote ! {
314
+ #method_doc
315
+ async fn #name( #self_param, request: tonic:: Request <#req_message>)
316
+ -> std:: result:: Result <tonic:: Response <BoxStream <#res_message>>, tonic:: Status > {
317
+ Err ( tonic:: Status :: unimplemented( "Not yet implemented" ) )
318
+ }
319
+ }
320
+ }
321
+ ( false , true , false ) => {
285
322
let stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
286
323
let stream_doc = generate_doc_comment ( format ! (
287
324
" Server streaming response type for the {} method." ,
@@ -297,7 +334,16 @@ fn generate_trait_methods<T: Service>(
297
334
-> std:: result:: Result <tonic:: Response <Self :: #stream>, tonic:: Status >;
298
335
}
299
336
}
300
- ( true , true ) => {
337
+ ( true , true , true ) => {
338
+ quote ! {
339
+ #method_doc
340
+ async fn #name( #self_param, request: tonic:: Request <tonic:: Streaming <#req_message>>)
341
+ -> std:: result:: Result <tonic:: Response <BoxStream <#res_message>>, tonic:: Status > {
342
+ Err ( tonic:: Status :: unimplemented( "Not yet implemented" ) )
343
+ }
344
+ }
345
+ }
346
+ ( true , true , false ) => {
301
347
let stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
302
348
let stream_doc = generate_doc_comment ( format ! (
303
349
" Server streaming response type for the {} method." ,
@@ -341,6 +387,7 @@ fn generate_methods<T: Service>(
341
387
proto_path : & str ,
342
388
compile_well_known_types : bool ,
343
389
use_arc_self : bool ,
390
+ generate_default_stubs : bool ,
344
391
) -> TokenStream {
345
392
let mut stream = TokenStream :: new ( ) ;
346
393
@@ -367,6 +414,7 @@ fn generate_methods<T: Service>(
367
414
ident. clone ( ) ,
368
415
server_trait,
369
416
use_arc_self,
417
+ generate_default_stubs,
370
418
) ,
371
419
( true , false ) => generate_client_streaming (
372
420
method,
@@ -384,6 +432,7 @@ fn generate_methods<T: Service>(
384
432
ident. clone ( ) ,
385
433
server_trait,
386
434
use_arc_self,
435
+ generate_default_stubs,
387
436
) ,
388
437
} ;
389
438
@@ -464,14 +513,20 @@ fn generate_server_streaming<T: Method>(
464
513
method_ident : Ident ,
465
514
server_trait : Ident ,
466
515
use_arc_self : bool ,
516
+ generate_default_stubs : bool ,
467
517
) -> TokenStream {
468
518
let codec_name = syn:: parse_str :: < syn:: Path > ( method. codec_path ( ) ) . unwrap ( ) ;
469
519
470
520
let service_ident = quote:: format_ident!( "{}Svc" , method. identifier( ) ) ;
471
521
472
522
let ( request, response) = method. request_response_name ( proto_path, compile_well_known_types) ;
473
523
474
- let response_stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
524
+ let response_stream = if !generate_default_stubs {
525
+ let stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
526
+ quote ! ( type ResponseStream = T :: #stream)
527
+ } else {
528
+ quote ! ( type ResponseStream = BoxStream <#response>)
529
+ } ;
475
530
476
531
let inner_arg = if use_arc_self {
477
532
quote ! ( inner)
@@ -485,7 +540,7 @@ fn generate_server_streaming<T: Method>(
485
540
486
541
impl <T : #server_trait> tonic:: server:: ServerStreamingService <#request> for #service_ident<T > {
487
542
type Response = #response;
488
- type ResponseStream = T :: #response_stream;
543
+ #response_stream;
489
544
type Future = BoxFuture <tonic:: Response <Self :: ResponseStream >, tonic:: Status >;
490
545
491
546
fn call( & mut self , request: tonic:: Request <#request>) -> Self :: Future {
@@ -585,14 +640,20 @@ fn generate_streaming<T: Method>(
585
640
method_ident : Ident ,
586
641
server_trait : Ident ,
587
642
use_arc_self : bool ,
643
+ generate_default_stubs : bool ,
588
644
) -> TokenStream {
589
645
let codec_name = syn:: parse_str :: < syn:: Path > ( method. codec_path ( ) ) . unwrap ( ) ;
590
646
591
647
let service_ident = quote:: format_ident!( "{}Svc" , method. identifier( ) ) ;
592
648
593
649
let ( request, response) = method. request_response_name ( proto_path, compile_well_known_types) ;
594
650
595
- let response_stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
651
+ let response_stream = if !generate_default_stubs {
652
+ let stream = quote:: format_ident!( "{}Stream" , method. identifier( ) ) ;
653
+ quote ! ( type ResponseStream = T :: #stream)
654
+ } else {
655
+ quote ! ( type ResponseStream = BoxStream <#response>)
656
+ } ;
596
657
597
658
let inner_arg = if use_arc_self {
598
659
quote ! ( inner)
@@ -607,7 +668,7 @@ fn generate_streaming<T: Method>(
607
668
impl <T : #server_trait> tonic:: server:: StreamingService <#request> for #service_ident<T >
608
669
{
609
670
type Response = #response;
610
- type ResponseStream = T :: #response_stream;
671
+ #response_stream;
611
672
type Future = BoxFuture <tonic:: Response <Self :: ResponseStream >, tonic:: Status >;
612
673
613
674
fn call( & mut self , request: tonic:: Request <tonic:: Streaming <#request>>) -> Self :: Future {
0 commit comments