76 static void default_rsc_(RequestType&) {}
77 static void default_rhc_(
const ResponseType&) {}
78 static void default_ehc_(const ::grpc::Status* status) {
83 explicit ClientHelper(ClientType* client, StubType* stub, MethodType pfn)
84 : client_(client), stub_(stub), pfn_(pfn) {}
87 return with(extra, default_rsc_);
90 template <
typename RequestSetupCallable>
92 std::forward<RequestSetupCallable>(rsc)(request_);
96 template <
typename RequestSetupCallable>
97 ClientHelper& with(
const ProtoStruct& extra, RequestSetupCallable&& rsc) {
98 auto key = extra.find(impl::debug_map_key);
99 if (key != extra.end()) {
101 debug_key_ = *value.
get<std::string>();
105 return with(std::forward<RequestSetupCallable>(rsc));
108 template <
typename ResponseHandlerCallable = decltype(default_rhc_)>
109 auto invoke(ResponseHandlerCallable&& rhc = default_rhc_) {
110 return invoke(std::forward<ResponseHandlerCallable>(rhc), default_ehc_);
113 template <
typename ResponseHandlerCallable,
typename ErrorHandlerCallable>
114 auto invoke(ResponseHandlerCallable&& rhc, ErrorHandlerCallable&& ehc) {
115 client_helper_details::set_name(&request_, client_);
118 if (debug_key_ !=
"") {
119 ctx.set_debug_key(debug_key_);
121 const auto result = (stub_->*pfn_)(ctx, request_, &response_);
123 return std::forward<ResponseHandlerCallable>(rhc)(
124 const_cast<const ResponseType&
>(response_));
127 std::forward<ErrorHandlerCallable>(ehc)(&result);
128 client_helper_details::errorHandlerReturnedUnexpectedly(&result);
134 template <
typename ResponseHandlerCallable,
135 typename ErrorHandlerCallable =
decltype(default_ehc_)>
136 auto invoke_stream(ResponseHandlerCallable rhc, ErrorHandlerCallable&& ehc = default_ehc_) {
137 *request_.mutable_name() = client_->name();
140 auto reader = (stub_->*pfn_)(ctx, request_);
142 bool cancelled_by_handler =
false;
144 while (reader->Read(&response_)) {
145 if (!rhc(response_)) {
146 cancelled_by_handler =
true;
152 const auto result = reader->Finish();
154 if (result.ok() || (cancelled_by_handler &&
155 client_helper_details::isStatusCancelled(result.error_code()))) {
159 std::forward<ErrorHandlerCallable>(ehc)(&result);
160 client_helper_details::errorHandlerReturnedUnexpectedly(&result);
166 std::string debug_key_;
168 RequestType request_;
169 ResponseType response_;
180 SyncMethodType<StubType, RequestType, ResponseType>>(client, &stub, method);
Definition client_helper.hpp:39