text: // Copyright 2022 Google LLC
  //
  // 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
  //
  //      https://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.
  
  // Generated by the Codegen C++ plugin.
  // If you make any local changes, they will be lost.
  // source: google/cloud/dialogflow/v2/context.proto
  
  #include "google/cloud/dialogflow_es/internal/contexts_connection_impl.h"
  #include "google/cloud/dialogflow_es/internal/contexts_option_defaults.h"
  #include "google/cloud/background_threads.h"
  #include "google/cloud/common_options.h"
  #include "google/cloud/grpc_options.h"
  #include "google/cloud/internal/pagination_range.h"
  #include "google/cloud/internal/retry_loop.h"
  #include <memory>
  
  namespace google {
  namespace cloud {
  namespace dialogflow_es_internal {
  GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
  
  ContextsConnectionImpl::ContextsConnectionImpl(
      std::unique_ptr<google::cloud::BackgroundThreads> background,
      std::shared_ptr<dialogflow_es_internal::ContextsStub> stub, Options options)
      : background_(std::move(background)),
        stub_(std::move(stub)),
        options_(internal::MergeOptions(
            std::move(options), dialogflow_es_internal::ContextsDefaultOptions(
                                    ContextsConnection::options()))) {}
  
  StreamRange<google::cloud::dialogflow::v2::Context>
  ContextsConnectionImpl::ListContexts(
      google::cloud::dialogflow::v2::ListContextsRequest request) {
    request.clear_page_token();
    auto stub = stub_;
    auto retry =
        std::shared_ptr<dialogflow_es::ContextsRetryPolicy const>(retry_policy());
    auto backoff = std::shared_ptr<BackoffPolicy const>(backoff_policy());
    auto idempotency = idempotency_policy()->ListContexts(request);
    char const* function_name = __func__;
    return google::cloud::internal::MakePaginationRange<
        StreamRange<google::cloud::dialogflow::v2::Context>>(
        std::move(request),
        [stub, retry, backoff, idempotency, function_name](
            google::cloud::dialogflow::v2::ListContextsRequest const& r) {
          return google::cloud::internal::RetryLoop(
              retry->clone(), backoff->clone(), idempotency,
              [stub](grpc::ClientContext& context,
                     google::cloud::dialogflow::v2::ListContextsRequest const&
                         request) {
                return stub->ListContexts(context, request);
              },
              r, function_name);
        },
        [](google::cloud::dialogflow::v2::ListContextsResponse r) {
          std::vector<google::cloud::dialogflow::v2::Context> result(
              r.contexts().size());
          auto& messages = *r.mutable_contexts();
          std::move(messages.begin(), messages.end(), result.begin());
          return result;
        });
  }
  
  StatusOr<google::cloud::dialogflow::v2::Context>
  ContextsConnectionImpl::GetContext(
      google::cloud::dialogflow::v2::GetContextRequest const& request) {
    return google::cloud::internal::RetryLoop(
        retry_policy(), backoff_policy(),
        idempotency_policy()->GetContext(request),
        [this](grpc::ClientContext& context,
               google::cloud::dialogflow::v2::GetContextRequest const& request) {
          return stub_->GetContext(context, request);
        },
        request, __func__);
  }
  
  StatusOr<google::cloud::dialogflow::v2::Context>
  ContextsConnectionImpl::CreateContext(
      google::cloud::dialogflow::v2::CreateContextRequest const& request) {
    return google::cloud::internal::RetryLoop(
        retry_policy(), backoff_policy(),
        idempotency_policy()->CreateContext(request),
        [this](
            grpc::ClientContext& context,
            google::cloud::dialogflow::v2::CreateContextRequest const& request) {
          return stub_->CreateContext(context, request);
        },
        request, __func__);
  }
  
  StatusOr<google::cloud::dialogflow::v2::Context>
  ContextsConnectionImpl::UpdateContext(
      google::cloud::dialogflow::v2::UpdateContextRequest const& request) {
    return google::cloud::internal::RetryLoop(
        retry_policy(), backoff_policy(),
        idempotency_policy()->UpdateContext(request),
        [this](
            grpc::ClientContext& context,
            google::cloud::dialogflow::v2::UpdateContextRequest const& request) {
          return stub_->UpdateContext(context, request);
        },
        request, __func__);
  }
  
  Status ContextsConnectionImpl::DeleteContext(
      google::cloud::dialogflow::v2::DeleteContextRequest const& request) {
    return google::cloud::internal::RetryLoop(
        retry_policy(), backoff_policy(),
        idempotency_policy()->DeleteContext(request),
        [this](
            grpc::ClientContext& context,
            google::cloud::dialogflow::v2::DeleteContextRequest const& request) {
          return stub_->DeleteContext(context, request);
        },
        request, __func__);
  }
  
  Status ContextsConnectionImpl::DeleteAllContexts(
      google::cloud::dialogflow::v2::DeleteAllContextsRequest const& request) {
    return google::cloud::internal::RetryLoop(
        retry_policy(), backoff_policy(),
        idempotency_policy()->DeleteAllContexts(request),
        [this](grpc::ClientContext& context,
               google::cloud::dialogflow::v2::DeleteAllContextsRequest const&
                   request) {
          return stub_->DeleteAllContexts(context, request);
        },
        request, __func__);
  }
  
  GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
  }  // namespace dialogflow_es_internal
  }  // namespace cloud
  }  // namespace google
  