/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include namespace apache::thrift { template class ClientInterceptor : public ClientInterceptorBase { private: template static T* getValueAsType( apache::thrift::util::TypeErasedValue& storage) { return storage.has_value() ? std::addressof(storage.template value_unchecked()) : nullptr; } public: virtual folly::coro::Task> onRequest( RequestInfo) { co_return std::nullopt; } virtual folly::coro::Task onResponse(RequestState*, ResponseInfo) { co_return; } private: folly::coro::Task internal_onRequest(RequestInfo requestInfo) final { if (auto value = co_await onRequest(std::move(requestInfo))) { requestInfo.storage->emplace(std::move(*value)); } } folly::coro::Task internal_onResponse(ResponseInfo responseInfo) final { auto* requestState = getValueAsType(*responseInfo.storage); co_await onResponse(requestState, std::move(responseInfo)); } }; } // namespace apache::thrift