79 static void default_rsc_(RequestType&) {}
80 static void default_rhc_(
const ResponseType&) {}
81 static void default_ehc_(const ::grpc::Status* status) {
86 explicit ClientHelper(ClientType* client, StubType* stub, MethodType pfn)
87 : client_(client), stub_(stub), pfn_(pfn) {}
90 return with(extra, default_rsc_);
93 template <
typename RequestSetupCallable>
95 std::forward<RequestSetupCallable>(rsc)(request_);
99 template <
typename RequestSetupCallable>
100 ClientHelper& with(
const ProtoStruct& extra, RequestSetupCallable&& rsc) {
101 if (
auto val = client_helper_details::debug_map_value(extra)) {
102 debug_key_ = std::move(*val);
106 return with(std::forward<RequestSetupCallable>(rsc));
109 template <
typename ResponseHandlerCallable = decltype(default_rhc_)>
110 auto invoke(ResponseHandlerCallable&& rhc = default_rhc_) {
111 return invoke(std::forward<ResponseHandlerCallable>(rhc), default_ehc_);
114 template <
typename ResponseHandlerCallable,
typename ErrorHandlerCallable>
115 auto invoke(ResponseHandlerCallable&& rhc, ErrorHandlerCallable&& ehc) {
116 client_helper_details::set_name(&request_, client_);
119 if (debug_key_ !=
"") {
120 ctx.set_debug_key(debug_key_);
122 const auto result = (stub_->*pfn_)(ctx, request_, &response_);
124 return std::forward<ResponseHandlerCallable>(rhc)(
125 const_cast<const ResponseType&
>(response_));
128 std::forward<ErrorHandlerCallable>(ehc)(&result);
129 client_helper_details::errorHandlerReturnedUnexpectedly(&result);
135 template <
typename ResponseHandlerCallable,
136 typename ErrorHandlerCallable =
decltype(default_ehc_)>
137 auto invoke_stream(ResponseHandlerCallable rhc, ErrorHandlerCallable&& ehc = default_ehc_) {
138 *request_.mutable_name() = client_->name();
141 auto reader = (stub_->*pfn_)(ctx, request_);
143 bool cancelled_by_handler =
false;
145 while (reader->Read(&response_)) {
146 if (!rhc(response_)) {
147 cancelled_by_handler =
true;
153 const auto result = reader->Finish();
155 if (result.ok() || (cancelled_by_handler &&
156 client_helper_details::isStatusCancelled(result.error_code()))) {
160 std::forward<ErrorHandlerCallable>(ehc)(&result);
161 client_helper_details::errorHandlerReturnedUnexpectedly(&result);
167 std::string debug_key_;
169 RequestType request_;
170 ResponseType response_;
181 SyncMethodType<StubType, RequestType, ResponseType>>(client, &stub, method);
Definition client_helper.hpp:42