// Copyright 2025 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/cloudsecuritycompliance/v1/config.proto

#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_CLOUDSECURITYCOMPLIANCE_V1_CONFIG_CLIENT_H
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_CLOUDSECURITYCOMPLIANCE_V1_CONFIG_CLIENT_H

#include "google/cloud/cloudsecuritycompliance/v1/config_connection.h"
#include "google/cloud/future.h"
#include "google/cloud/options.h"
#include "google/cloud/polling_policy.h"
#include "google/cloud/status_or.h"
#include "google/cloud/version.h"
#include <map>
#include <memory>
#include <string>

namespace google {
namespace cloud {
namespace cloudsecuritycompliance_v1 {
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN

///
/// Config Service manages compliance frameworks, cloud controls, and their
/// configurations.
///
/// @par Equality
///
/// Instances of this class created via copy-construction or copy-assignment
/// always compare equal. Instances created with equal
/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare
/// equal share the same underlying resources.
///
/// @par Performance
///
/// Creating a new instance of this class is a relatively expensive operation,
/// new objects establish new connections to the service. In contrast,
/// copy-construction, move-construction, and the corresponding assignment
/// operations are relatively efficient as the copies share all underlying
/// resources.
///
/// @par Thread Safety
///
/// Concurrent access to different instances of this class, even if they compare
/// equal, is guaranteed to work. Two or more threads operating on the same
/// instance of this class is not guaranteed to work. Since copy-construction
/// and move-construction is a relatively efficient operation, consider using
/// such a copy when using this class from multiple threads.
///
class ConfigClient {
 public:
  explicit ConfigClient(std::shared_ptr<ConfigConnection> connection,
                        Options opts = {});
  ~ConfigClient();

  ///@{
  /// @name Copy and move support
  ConfigClient(ConfigClient const&) = default;
  ConfigClient& operator=(ConfigClient const&) = default;
  ConfigClient(ConfigClient&&) = default;
  ConfigClient& operator=(ConfigClient&&) = default;
  ///@}

  ///@{
  /// @name Equality
  friend bool operator==(ConfigClient const& a, ConfigClient const& b) {
    return a.connection_ == b.connection_;
  }
  friend bool operator!=(ConfigClient const& a, ConfigClient const& b) {
    return !(a == b);
  }
  ///@}

  // clang-format off
  ///
  /// Lists the frameworks (both built-in and custom) that are available within
  /// the parent resource. The latest major version of each framework is
  /// returned.
  /// This method supports pagination.
  ///
  /// @param parent  Required. The parent resource name, in the format
  ///  `organizations/{organization}/locations/{location}`.
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.cloud.cloudsecuritycompliance.v1.Framework], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.ListFrameworksRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L187}
  ///
  // clang-format on
  StreamRange<google::cloud::cloudsecuritycompliance::v1::Framework>
  ListFrameworks(std::string const& parent, Options opts = {});

  // clang-format off
  ///
  /// Lists the frameworks (both built-in and custom) that are available within
  /// the parent resource. The latest major version of each framework is
  /// returned.
  /// This method supports pagination.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.ListFrameworksRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.cloud.cloudsecuritycompliance.v1.Framework], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.ListFrameworksRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L187}
  ///
  // clang-format on
  StreamRange<google::cloud::cloudsecuritycompliance::v1::Framework>
  ListFrameworks(
      google::cloud::cloudsecuritycompliance::v1::ListFrameworksRequest request,
      Options opts = {});

  // clang-format off
  ///
  /// Gets details about a framework.
  /// This method retrieves the latest major version of the framework.
  ///
  /// To retrieve a specific major version, include `major_revision_id` in
  /// the request.
  ///
  /// @param name  Required. The name of the framework to retrieve, in the format
  ///  `organizations/{organization}/locations/{location}/frameworks/{framework_id}`
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.GetFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L222}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework> GetFramework(
      std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Gets details about a framework.
  /// This method retrieves the latest major version of the framework.
  ///
  /// To retrieve a specific major version, include `major_revision_id` in
  /// the request.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.GetFrameworkRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.GetFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L222}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework> GetFramework(
      google::cloud::cloudsecuritycompliance::v1::GetFrameworkRequest const&
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Creates a custom framework in a given parent resource.
  /// You can't create built-in frameworks because those are managed by
  /// Google.
  ///
  /// @param parent  Required. The parent resource name, in the format
  ///  `organizations/{organization}/locations/{location}`.
  ///  The only supported location is `global`.
  /// @param framework  Required. The resource being created.
  /// @param framework_id  Required. The identifier (ID) of the framework. The ID is not the full name
  ///  of the framework; it's the last part of the full name of the framework.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CreateFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework>
  CreateFramework(
      std::string const& parent,
      google::cloud::cloudsecuritycompliance::v1::Framework const& framework,
      std::string const& framework_id, Options opts = {});

  // clang-format off
  ///
  /// Creates a custom framework in a given parent resource.
  /// You can't create built-in frameworks because those are managed by
  /// Google.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.CreateFrameworkRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CreateFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework>
  CreateFramework(
      google::cloud::cloudsecuritycompliance::v1::CreateFrameworkRequest const&
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Updates a custom framework.
  /// This method allows for partial updates of a framework. Use the
  /// `update_mask` to specify which fields to update. Consider the following:
  ///
  /// - If you provide an `update_mask`, only the fields that are specified
  /// in the mask are updated.
  /// - If you don't provide an `update_mask`, all the fields that are present
  /// in the request's `framework` body are used to overwrite the existing
  /// resource.
  ///
  /// You can only update frameworks with the `CUSTOM` type.
  /// A successful update creates a new version of the framework.
  ///
  /// @param framework  Required. The resource that is being updated.
  /// @param update_mask  Optional. A field mask is used to specify the fields to be overwritten in
  ///  the framework resource by the update. The fields specified in the
  ///  `update_mask` are relative to the resource, not the full request. A field
  ///  is overwritten if it is in the mask. If you don't provide a mask then all
  ///  fields present in the request will be overwritten.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.UpdateFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L259}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework>
  UpdateFramework(
      google::cloud::cloudsecuritycompliance::v1::Framework const& framework,
      google::protobuf::FieldMask const& update_mask, Options opts = {});

  // clang-format off
  ///
  /// Updates a custom framework.
  /// This method allows for partial updates of a framework. Use the
  /// `update_mask` to specify which fields to update. Consider the following:
  ///
  /// - If you provide an `update_mask`, only the fields that are specified
  /// in the mask are updated.
  /// - If you don't provide an `update_mask`, all the fields that are present
  /// in the request's `framework` body are used to overwrite the existing
  /// resource.
  ///
  /// You can only update frameworks with the `CUSTOM` type.
  /// A successful update creates a new version of the framework.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.UpdateFrameworkRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.Framework])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.Framework]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L239}
  /// [google.cloud.cloudsecuritycompliance.v1.UpdateFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L259}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::Framework>
  UpdateFramework(
      google::cloud::cloudsecuritycompliance::v1::UpdateFrameworkRequest const&
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Deletes a custom framework, including all its major and
  /// minor revisions. Consider the following:
  ///
  /// - You can't delete built-in frameworks. You can only delete frameworks
  ///   with type `CUSTOM`.
  /// - You can't delete frameworks that are deployed to a resource.
  /// - You can't restore a deleted framework. This action is permanent.
  ///
  /// @param name  Required. The name of the resource, in the format
  ///  `organizations/{organization}/locations/{location}/frameworks/{framework}`.
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.DeleteFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L276}
  ///
  // clang-format on
  Status DeleteFramework(std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Deletes a custom framework, including all its major and
  /// minor revisions. Consider the following:
  ///
  /// - You can't delete built-in frameworks. You can only delete frameworks
  ///   with type `CUSTOM`.
  /// - You can't delete frameworks that are deployed to a resource.
  /// - You can't restore a deleted framework. This action is permanent.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.DeleteFrameworkRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.DeleteFrameworkRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L276}
  ///
  // clang-format on
  Status DeleteFramework(
      google::cloud::cloudsecuritycompliance::v1::DeleteFrameworkRequest const&
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Lists the cloud controls (both built-in and custom) that are available
  /// in a given parent resource. The latest major version of each cloud control
  /// is returned.
  /// This method supports pagination.
  ///
  /// @param parent  Required. The parent resource name, in the format
  ///  `organizations/{organization}/locations/{location}`.
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.cloud.cloudsecuritycompliance.v1.CloudControl], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.ListCloudControlsRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L289}
  ///
  // clang-format on
  StreamRange<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  ListCloudControls(std::string const& parent, Options opts = {});

  // clang-format off
  ///
  /// Lists the cloud controls (both built-in and custom) that are available
  /// in a given parent resource. The latest major version of each cloud control
  /// is returned.
  /// This method supports pagination.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.ListCloudControlsRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.cloud.cloudsecuritycompliance.v1.CloudControl], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.ListCloudControlsRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L289}
  ///
  // clang-format on
  StreamRange<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  ListCloudControls(
      google::cloud::cloudsecuritycompliance::v1::ListCloudControlsRequest
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Gets details about a cloud control.
  /// This method retrieves the latest major version of a cloud control that
  /// you identify by name.
  ///
  /// By default, the latest major version of the cloud control is returned.
  /// To retrieve a specific major version, include `major_revision_id` in
  /// the request.
  ///
  /// @param name  Required. The name of the cloud control to retrieve, in the format
  ///  `organizations/{organization}/locations/{location}/cloudControls/{cloud_control}`.
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.GetCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L328}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  GetCloudControl(std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Gets details about a cloud control.
  /// This method retrieves the latest major version of a cloud control that
  /// you identify by name.
  ///
  /// By default, the latest major version of the cloud control is returned.
  /// To retrieve a specific major version, include `major_revision_id` in
  /// the request.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.GetCloudControlRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.GetCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L328}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  GetCloudControl(
      google::cloud::cloudsecuritycompliance::v1::GetCloudControlRequest const&
          request,
      Options opts = {});

  // clang-format off
  ///
  /// Creates a custom cloud control in a given parent
  /// resource.
  /// You can't create built-in cloud controls because those are managed by
  /// Google.
  ///
  /// @param parent  Required. The parent resource name, in the format
  ///  `organizations/{organization}/locations/{location}`.
  ///  The only supported location is `global`.
  /// @param cloud_control  Required. The cloud control that's being created.
  /// @param cloud_control_id  Required. The identifier for the cloud control, which is the last segment
  ///  of the cloud control name. The format is
  ///  `^[a-zA-Z][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.CreateCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L345}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  CreateCloudControl(
      std::string const& parent,
      google::cloud::cloudsecuritycompliance::v1::CloudControl const&
          cloud_control,
      std::string const& cloud_control_id, Options opts = {});

  // clang-format off
  ///
  /// Creates a custom cloud control in a given parent
  /// resource.
  /// You can't create built-in cloud controls because those are managed by
  /// Google.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.CreateCloudControlRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.CreateCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L345}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  CreateCloudControl(google::cloud::cloudsecuritycompliance::v1::
                         CreateCloudControlRequest const& request,
                     Options opts = {});

  // clang-format off
  ///
  /// Updates a custom cloud control.
  /// This method allows for partial updates of a cloud control. Use the
  /// `update_mask` to specify which fields to update. Consider the following:
  ///
  /// - If you provide an `update_mask`, only the fields that are specified
  /// in the mask are updated.
  /// - If you don't provide an `update_mask`, all the fields that are present
  /// in the request's `cloud_control` body are used to overwrite the existing
  /// resource.
  ///
  /// You can only update cloud controls with the `CUSTOM` type.
  /// A successful update creates a new version of the cloud control.
  ///
  /// @param cloud_control  Required. The cloud control that you're updating.
  /// @param update_mask  Optional. Use a field mask to specify the fields to be overwritten in the
  ///  cloud control during the update.
  ///  The fields that you specify in the `update_mask` are relative to the
  ///  cloud control, not the full request. A field is overwritten if it is in
  ///  the mask. If you don't provide a mask, all fields in the request
  ///  are updated.
  ///  @n
  ///  You can update the following fields:
  ///  @n
  ///  - Display name
  ///  - Description
  ///  - Parameters
  ///  - Rules
  ///  - Parameter specification
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.UpdateCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L366}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  UpdateCloudControl(
      google::cloud::cloudsecuritycompliance::v1::CloudControl const&
          cloud_control,
      google::protobuf::FieldMask const& update_mask, Options opts = {});

  // clang-format off
  ///
  /// Updates a custom cloud control.
  /// This method allows for partial updates of a cloud control. Use the
  /// `update_mask` to specify which fields to update. Consider the following:
  ///
  /// - If you provide an `update_mask`, only the fields that are specified
  /// in the mask are updated.
  /// - If you don't provide an `update_mask`, all the fields that are present
  /// in the request's `cloud_control` body are used to overwrite the existing
  /// resource.
  ///
  /// You can only update cloud controls with the `CUSTOM` type.
  /// A successful update creates a new version of the cloud control.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.UpdateCloudControlRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.cloudsecuritycompliance.v1.CloudControl])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.CloudControl]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/common.proto#L347}
  /// [google.cloud.cloudsecuritycompliance.v1.UpdateCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L366}
  ///
  // clang-format on
  StatusOr<google::cloud::cloudsecuritycompliance::v1::CloudControl>
  UpdateCloudControl(google::cloud::cloudsecuritycompliance::v1::
                         UpdateCloudControlRequest const& request,
                     Options opts = {});

  // clang-format off
  ///
  /// Deletes a custom cloud control, including all its
  /// major and minor revisions. Consider the following:
  ///
  /// - You can't delete built-in cloud controls. You can only delete cloud
  ///   controls with type `CUSTOM`.
  /// - You can't delete cloud controls if any of the versions are referenced
  ///   by a framework.
  /// - You can't restore a deleted cloud control. This action is permanent.
  ///
  /// @param name  Required. The name of the cloud control to delete, in the format
  ///  `organizations/{organization}/locations/{location}/CloudControls/{CloudControl}`.
  ///  The only supported location is `global`.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.DeleteCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L389}
  ///
  // clang-format on
  Status DeleteCloudControl(std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Deletes a custom cloud control, including all its
  /// major and minor revisions. Consider the following:
  ///
  /// - You can't delete built-in cloud controls. You can only delete cloud
  ///   controls with type `CUSTOM`.
  /// - You can't delete cloud controls if any of the versions are referenced
  ///   by a framework.
  /// - You can't restore a deleted cloud control. This action is permanent.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.cloudsecuritycompliance.v1.DeleteCloudControlRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.cloudsecuritycompliance.v1.DeleteCloudControlRequest]: @googleapis_reference_link{google/cloud/cloudsecuritycompliance/v1/config.proto#L389}
  ///
  // clang-format on
  Status DeleteCloudControl(google::cloud::cloudsecuritycompliance::v1::
                                DeleteCloudControlRequest const& request,
                            Options opts = {});

  // clang-format off
  ///
  /// Lists information about the supported locations for this service.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.location.ListLocationsRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.cloud.location.Location], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.location.ListLocationsRequest]: @googleapis_reference_link{google/cloud/location/locations.proto#L58}
  /// [google.cloud.location.Location]: @googleapis_reference_link{google/cloud/location/locations.proto#L88}
  ///
  // clang-format on
  StreamRange<google::cloud::location::Location> ListLocations(
      google::cloud::location::ListLocationsRequest request, Options opts = {});

  // clang-format off
  ///
  /// Gets information about a location.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.cloud.location.GetLocationRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.cloud.location.Location])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.cloud.location.GetLocationRequest]: @googleapis_reference_link{google/cloud/location/locations.proto#L82}
  /// [google.cloud.location.Location]: @googleapis_reference_link{google/cloud/location/locations.proto#L88}
  ///
  // clang-format on
  StatusOr<google::cloud::location::Location> GetLocation(
      google::cloud::location::GetLocationRequest const& request,
      Options opts = {});

  // clang-format off
  ///
  /// Lists operations that match the specified filter in the request. If the
  /// server doesn't support this method, it returns `UNIMPLEMENTED`.
  ///
  /// @param name  The name of the operation's parent resource.
  /// @param filter  The standard list filter.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.longrunning.Operation], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.ListOperationsRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L167}
  /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L121}
  ///
  // clang-format on
  StreamRange<google::longrunning::Operation> ListOperations(
      std::string const& name, std::string const& filter, Options opts = {});

  // clang-format off
  ///
  /// Lists operations that match the specified filter in the request. If the
  /// server doesn't support this method, it returns `UNIMPLEMENTED`.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.longrunning.ListOperationsRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [StreamRange](@ref google::cloud::StreamRange)
  ///     to iterate of the results. See the documentation of this type for
  ///     details. In brief, this class has `begin()` and `end()` member
  ///     functions returning a iterator class meeting the
  ///     [input iterator requirements]. The value type for this iterator is a
  ///     [`StatusOr`] as the iteration may fail even after some values are
  ///     retrieved successfully, for example, if there is a network disconnect.
  ///     An empty set of results does not indicate an error, it indicates
  ///     that there are no resources meeting the request criteria.
  ///     On a successful iteration the `StatusOr<T>` contains elements of type
  ///     [google.longrunning.Operation], or rather,
  ///     the C++ class generated by Protobuf from that type. Please consult the
  ///     Protobuf documentation for details on the [Protobuf mapping rules].
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.ListOperationsRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L167}
  /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L121}
  ///
  // clang-format on
  StreamRange<google::longrunning::Operation> ListOperations(
      google::longrunning::ListOperationsRequest request, Options opts = {});

  // clang-format off
  ///
  /// Gets the latest state of a long-running operation.  Clients can use this
  /// method to poll the operation result at intervals as recommended by the API
  /// service.
  ///
  /// @param name  The name of the operation resource.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.longrunning.Operation])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.GetOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L160}
  /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L121}
  ///
  // clang-format on
  StatusOr<google::longrunning::Operation> GetOperation(std::string const& name,
                                                        Options opts = {});

  // clang-format off
  ///
  /// Gets the latest state of a long-running operation.  Clients can use this
  /// method to poll the operation result at intervals as recommended by the API
  /// service.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.longrunning.GetOperationRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return the result of the RPC. The response message type
  ///     ([google.longrunning.Operation])
  ///     is mapped to a C++ class using the [Protobuf mapping rules].
  ///     If the request fails, the [`StatusOr`] contains the error details.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.GetOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L160}
  /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L121}
  ///
  // clang-format on
  StatusOr<google::longrunning::Operation> GetOperation(
      google::longrunning::GetOperationRequest const& request,
      Options opts = {});

  // clang-format off
  ///
  /// Deletes a long-running operation. This method indicates that the client is
  /// no longer interested in the operation result. It does not cancel the
  /// operation. If the server doesn't support this method, it returns
  /// `google.rpc.Code.UNIMPLEMENTED`.
  ///
  /// @param name  The name of the operation resource to be deleted.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.DeleteOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L219}
  ///
  // clang-format on
  Status DeleteOperation(std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Deletes a long-running operation. This method indicates that the client is
  /// no longer interested in the operation result. It does not cancel the
  /// operation. If the server doesn't support this method, it returns
  /// `google.rpc.Code.UNIMPLEMENTED`.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.longrunning.DeleteOperationRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.DeleteOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L219}
  ///
  // clang-format on
  Status DeleteOperation(
      google::longrunning::DeleteOperationRequest const& request,
      Options opts = {});

  // clang-format off
  ///
  /// Starts asynchronous cancellation on a long-running operation.  The server
  /// makes a best effort to cancel the operation, but success is not
  /// guaranteed.  If the server doesn't support this method, it returns
  /// `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
  /// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
  /// other methods to check whether the cancellation succeeded or whether the
  /// operation completed despite cancellation. On successful cancellation,
  /// the operation is not deleted; instead, it becomes an operation with
  /// an [Operation.error][google.longrunning.Operation.error] value with a
  /// [google.rpc.Status.code][google.rpc.Status.code] of `1`, corresponding to
  /// `Code.CANCELLED`.
  ///
  /// @param name  The name of the operation resource to be cancelled.
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.CancelOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L212}
  /// [google.longrunning.Operation.error]: @googleapis_reference_link{google/longrunning/operations.proto#L144}
  /// [google.longrunning.Operations.GetOperation]: @googleapis_reference_link{google/longrunning/operations.proto#L70}
  /// [google.rpc.Status.code]: @googleapis_reference_link{google/rpc/status.proto#L38}
  ///
  // clang-format on
  Status CancelOperation(std::string const& name, Options opts = {});

  // clang-format off
  ///
  /// Starts asynchronous cancellation on a long-running operation.  The server
  /// makes a best effort to cancel the operation, but success is not
  /// guaranteed.  If the server doesn't support this method, it returns
  /// `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
  /// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
  /// other methods to check whether the cancellation succeeded or whether the
  /// operation completed despite cancellation. On successful cancellation,
  /// the operation is not deleted; instead, it becomes an operation with
  /// an [Operation.error][google.longrunning.Operation.error] value with a
  /// [google.rpc.Status.code][google.rpc.Status.code] of `1`, corresponding to
  /// `Code.CANCELLED`.
  ///
  /// @param request Unary RPCs, such as the one wrapped by this
  ///     function, receive a single `request` proto message which includes all
  ///     the inputs for the RPC. In this case, the proto message is a
  ///     [google.longrunning.CancelOperationRequest].
  ///     Proto messages are converted to C++ classes by Protobuf, using the
  ///     [Protobuf mapping rules].
  /// @param opts Optional. Override the class-level options, such as retry and
  ///     backoff policies.
  /// @return a [`Status`] object. If the request failed, the
  ///     status contains the details of the failure.
  ///
  /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/
  /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator
  /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string
  /// [`future`]: @ref google::cloud::future
  /// [`StatusOr`]: @ref google::cloud::StatusOr
  /// [`Status`]: @ref google::cloud::Status
  /// [google.longrunning.CancelOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L212}
  /// [google.longrunning.Operation.error]: @googleapis_reference_link{google/longrunning/operations.proto#L144}
  /// [google.longrunning.Operations.GetOperation]: @googleapis_reference_link{google/longrunning/operations.proto#L70}
  /// [google.rpc.Status.code]: @googleapis_reference_link{google/rpc/status.proto#L38}
  ///
  // clang-format on
  Status CancelOperation(
      google::longrunning::CancelOperationRequest const& request,
      Options opts = {});

 private:
  std::shared_ptr<ConfigConnection> connection_;
  Options options_;
};

GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
}  // namespace cloudsecuritycompliance_v1
}  // namespace cloud
}  // namespace google

#endif  // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_CLOUDSECURITYCOMPLIANCE_V1_CONFIG_CLIENT_H
