34 static void default_rsc_(RequestType&) {}
35 static void default_rhc_(
const ResponseType&) {}
36 static void default_ehc_(const ::grpc::Status& status) {
41 explicit ClientHelper(ClientType* client, StubType* stub, MethodType pfn)
42 : client_(client), stub_(stub), pfn_(pfn) {}
45 return with(extra, default_rsc_);
48 template <
typename RequestSetupCallable>
50 std::forward<RequestSetupCallable>(rsc)(request_);
54 template <
typename RequestSetupCallable>
55 ClientHelper& with(
const AttributeMap& extra, RequestSetupCallable&& rsc) {
56 *request_.mutable_extra() = map_to_struct(extra);
57 return with(std::forward<RequestSetupCallable>(rsc));
60 template <
typename ResponseHandlerCallable = decltype(default_rhc_)>
61 auto invoke(ResponseHandlerCallable&& rhc = default_rhc_) {
62 return invoke(std::forward<ResponseHandlerCallable>(rhc), default_ehc_);
65 template <
typename ResponseHandlerCallable,
typename ErrorHandlerCallable>
66 auto invoke(ResponseHandlerCallable&& rhc, ErrorHandlerCallable&& ehc) {
67 *request_.mutable_name() = client_->name();
70 const auto result = (stub_->*pfn_)(ctx, request_, &response_);
72 return std::forward<ResponseHandlerCallable>(rhc)(
73 const_cast<const ResponseType&
>(response_));
76 std::forward<ErrorHandlerCallable>(ehc)(result);
77 client_helper_details::errorHandlerReturnedUnexpectedly(result);
83 template <
typename ResponseHandlerCallable,
84 typename ErrorHandlerCallable =
decltype(default_ehc_)>
85 auto invoke_stream(ResponseHandlerCallable rhc, ErrorHandlerCallable&& ehc = default_ehc_) {
86 *request_.mutable_name() = client_->name();
89 auto reader = (stub_->*pfn_)(ctx, request_);
91 bool cancelled_by_handler =
false;
93 while (reader->Read(&response_)) {
94 if (!rhc(response_)) {
95 cancelled_by_handler =
true;
96 static_cast<::grpc::ClientContext*
>(ctx)->TryCancel();
101 const auto result = reader->Finish();
104 (cancelled_by_handler && result.error_code() == ::grpc::StatusCode::CANCELLED)) {
108 std::forward<ErrorHandlerCallable>(ehc)(result);
109 client_helper_details::errorHandlerReturnedUnexpectedly(result);
116 RequestType request_;
117 ResponseType response_;
128 SyncMethodType<StubType, RequestType, ResponseType>>(client, &stub, method);