diff --git a/tonic-build/src/server.rs b/tonic-build/src/server.rs index e2d0aacd9..12db09e64 100644 --- a/tonic-build/src/server.rs +++ b/tonic-build/src/server.rs @@ -257,91 +257,59 @@ fn generate_trait_methods( quote!(&self) }; - let method = match ( - method.client_streaming(), - method.server_streaming(), - generate_default_stubs, - ) { - (false, false, true) => { - quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request<#req_message>) - -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("Not yet implemented")) - } - } - } - (false, false, false) => { - quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request<#req_message>) - -> std::result::Result, tonic::Status>; - } - } - (true, false, true) => { - quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request>) - -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("Not yet implemented")) - } - } - } - (true, false, false) => { - quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request>) - -> std::result::Result, tonic::Status>; - } + let req_param_type = if method.client_streaming() { + quote!(tonic::Request>) + } else { + quote!(tonic::Request<#req_message>) + }; + + let partial_sig = quote! { + #method_doc + async fn #name(#self_param, request: #req_param_type) + }; + + let default_body = quote! { + { + Err(tonic::Status::unimplemented("Not yet implemented")) } - (false, true, true) => { + }; + + let result = |ok| quote!(std::result::Result<#ok, tonic::Status>); + let response_result = |message| result(quote!(tonic::Response<#message>)); + + let method = match (method.server_streaming(), generate_default_stubs) { + (false, true) => { + let return_ty = response_result(res_message); quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request<#req_message>) - -> std::result::Result>, tonic::Status> { - Err(tonic::Status::unimplemented("Not yet implemented")) - } + #partial_sig -> #return_ty #default_body } } - (false, true, false) => { - let stream = quote::format_ident!("{}Stream", method.identifier()); - let stream_doc = generate_doc_comment(format!( - " Server streaming response type for the {} method.", - method.identifier() - )); - + (false, false) => { + let return_ty = response_result(res_message); quote! { - #stream_doc - type #stream: tonic::codegen::tokio_stream::Stream> + std::marker::Send + 'static; - - #method_doc - async fn #name(#self_param, request: tonic::Request<#req_message>) - -> std::result::Result, tonic::Status>; + #partial_sig -> #return_ty; } } - (true, true, true) => { + (true, true) => { + let return_ty = response_result(quote!(BoxStream<#res_message>)); quote! { - #method_doc - async fn #name(#self_param, request: tonic::Request>) - -> std::result::Result>, tonic::Status> { - Err(tonic::Status::unimplemented("Not yet implemented")) - } + #partial_sig -> #return_ty #default_body } } - (true, true, false) => { + (true, false) => { let stream = quote::format_ident!("{}Stream", method.identifier()); let stream_doc = generate_doc_comment(format!( " Server streaming response type for the {} method.", method.identifier() )); - + let stream_item_ty = result(res_message); + let stream_ty = quote!(tonic::codegen::tokio_stream::Stream + std::marker::Send + 'static); + let return_ty = response_result(quote!(Self::#stream)); quote! { #stream_doc - type #stream: tonic::codegen::tokio_stream::Stream> + std::marker::Send + 'static; + type #stream: #stream_ty; - #method_doc - async fn #name(#self_param, request: tonic::Request>) - -> std::result::Result, tonic::Status>; + #partial_sig -> #return_ty; } } };