content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE DerivingStrategies #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE ImportQualifiedPost #-}
  {-# LANGUAGE LambdaCase #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE PatternSynonyms #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE StrictData #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  {-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
  {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
  {-# OPTIONS_GHC -fno-warn-unused-binds #-}
  {-# OPTIONS_GHC -fno-warn-unused-imports #-}
  {-# OPTIONS_GHC -fno-warn-unused-matches #-}
  
  -- |
  -- Module      : Gogol.CloudPrivateCatalogProducer.Internal.Product
  -- Copyright   : (c) 2015-2025 Brendan Hay
  -- License     : Mozilla Public License, v. 2.0.
  -- Maintainer  : Brendan Hay <brendan.g.hay+gogol@gmail.com>
  --               Toni Cebrián <toni@tonicebrian.com>
  -- Stability   : auto-generated
  -- Portability : non-portable (GHC extensions)
  module Gogol.CloudPrivateCatalogProducer.Internal.Product
    ( -- * GoogleCloudPrivatecatalogproducerV1beta1Association
      GoogleCloudPrivatecatalogproducerV1beta1Association (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Association,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Catalog
      GoogleCloudPrivatecatalogproducerV1beta1Catalog (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Catalog,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
      GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest (..),
      newGoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
      GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest (..),
      newGoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
      GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse (..),
      newGoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
      GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse (..),
      newGoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
      GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse (..),
      newGoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
      GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse (..),
      newGoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Product
      GoogleCloudPrivatecatalogproducerV1beta1Product (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Product,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
      GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
      GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest (..),
      newGoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
      GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest (..),
      newGoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Version
      GoogleCloudPrivatecatalogproducerV1beta1Version (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Version,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
      GoogleCloudPrivatecatalogproducerV1beta1Version_Asset (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Version_Asset,
  
      -- * GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
      GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset (..),
      newGoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset,
  
      -- * GoogleIamV1AuditConfig
      GoogleIamV1AuditConfig (..),
      newGoogleIamV1AuditConfig,
  
      -- * GoogleIamV1AuditLogConfig
      GoogleIamV1AuditLogConfig (..),
      newGoogleIamV1AuditLogConfig,
  
      -- * GoogleIamV1Binding
      GoogleIamV1Binding (..),
      newGoogleIamV1Binding,
  
      -- * GoogleIamV1Policy
      GoogleIamV1Policy (..),
      newGoogleIamV1Policy,
  
      -- * GoogleIamV1SetIamPolicyRequest
      GoogleIamV1SetIamPolicyRequest (..),
      newGoogleIamV1SetIamPolicyRequest,
  
      -- * GoogleIamV1TestIamPermissionsRequest
      GoogleIamV1TestIamPermissionsRequest (..),
      newGoogleIamV1TestIamPermissionsRequest,
  
      -- * GoogleIamV1TestIamPermissionsResponse
      GoogleIamV1TestIamPermissionsResponse (..),
      newGoogleIamV1TestIamPermissionsResponse,
  
      -- * GoogleLongrunningCancelOperationRequest
      GoogleLongrunningCancelOperationRequest (..),
      newGoogleLongrunningCancelOperationRequest,
  
      -- * GoogleLongrunningListOperationsResponse
      GoogleLongrunningListOperationsResponse (..),
      newGoogleLongrunningListOperationsResponse,
  
      -- * GoogleLongrunningOperation
      GoogleLongrunningOperation (..),
      newGoogleLongrunningOperation,
  
      -- * GoogleLongrunningOperation_Metadata
      GoogleLongrunningOperation_Metadata (..),
      newGoogleLongrunningOperation_Metadata,
  
      -- * GoogleLongrunningOperation_Response
      GoogleLongrunningOperation_Response (..),
      newGoogleLongrunningOperation_Response,
  
      -- * GoogleProtobufEmpty
      GoogleProtobufEmpty (..),
      newGoogleProtobufEmpty,
  
      -- * GoogleRpcStatus
      GoogleRpcStatus (..),
      newGoogleRpcStatus,
  
      -- * GoogleRpcStatus_DetailsItem
      GoogleRpcStatus_DetailsItem (..),
      newGoogleRpcStatus_DetailsItem,
  
      -- * GoogleTypeExpr
      GoogleTypeExpr (..),
      newGoogleTypeExpr,
    )
  where
  
  import Gogol.CloudPrivateCatalogProducer.Internal.Sum
  import Gogol.Prelude qualified as Core
  
  -- | An association tuple that pairs a @Catalog@ to a resource that can use the @Catalog@. After association, a google.cloud.privatecatalog.v1beta1.Catalog becomes available to consumers under specified Association.resource and all of its child nodes. Users who have the @cloudprivatecatalog.targets.get@ permission on any of the resource nodes can access the catalog and child products under the node.
  --
  -- For example, suppose the cloud resource hierarchy is as follows:
  --
  -- -   organizations\/example.com
  --     -   folders\/team
  --         -   projects\/test
  --
  -- After creating an association with @organizations\/example.com@, the catalog @catalogs\/1@ is accessible from the following paths:
  --
  -- -   organizations\/example.com
  -- -   folders\/team
  -- -   projects\/test
  --
  -- Users can access them by google.cloud.v1beta1.PrivateCatalog.SearchCatalogs action.
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Association' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1Association = GoogleCloudPrivatecatalogproducerV1beta1Association
    { -- | The creation time of the association.
      createTime :: (Core.Maybe Core.DateTime),
      -- | Output only. The resource name of the catalog association, in the format \`catalogs\/{catalog/id}\/associations\/{association/id}\'.
      --
      -- A unique identifier for the catalog association, which is generated by catalog service.
      name :: (Core.Maybe Core.Text),
      -- | Required. The user-supplied fully qualified name of the @Resource@ associated to the @Catalog@. It supports @Organization@, @Folder@, and @Project@. Values are of the form
      --
      -- -   @\/\/cloudresourcemanager.googleapis.com\/projects\/{product_number}@
      -- -   @\/\/cloudresourcemanager.googleapis.com\/folders\/{folder_id}@
      -- -   @\/\/cloudresourcemanager.googleapis.com\/organizations\/{organization_id}@
      resource :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Association' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Association ::
    GoogleCloudPrivatecatalogproducerV1beta1Association
  newGoogleCloudPrivatecatalogproducerV1beta1Association =
    GoogleCloudPrivatecatalogproducerV1beta1Association
      { createTime =
          Core.Nothing,
        name = Core.Nothing,
        resource = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Association
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Association"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Association
              Core.<$> (o Core..:? "createTime")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "resource")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Association
    where
    toJSON GoogleCloudPrivatecatalogproducerV1beta1Association {..} =
      Core.object
        ( Core.catMaybes
            [ ("createTime" Core..=) Core.<$> createTime,
              ("name" Core..=) Core.<$> name,
              ("resource" Core..=) Core.<$> resource
            ]
        )
  
  -- | The producer representation of a catalog which is a curated collection of solutions that can be managed, controlled, and shared by cloud admins.
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Catalog' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1Catalog = GoogleCloudPrivatecatalogproducerV1beta1Catalog
    { -- | Output only. The time when the catalog was created.
      createTime :: (Core.Maybe Core.DateTime),
      -- | Required. The user-supplied description of the catalog. Maximum of 512 characters.
      description :: (Core.Maybe Core.Text),
      -- | Required. The user-supplied descriptive name of the catalog as it appears in UIs. Maximum 256 characters in length.
      displayName :: (Core.Maybe Core.Text),
      -- | Output only. The resource name of the catalog, in the format \`catalogs\/{catalog_id}\'.
      --
      -- A unique identifier for the catalog, which is generated by catalog service.
      name :: (Core.Maybe Core.Text),
      -- | Required. The parent resource name of the catalog, which can\'t be changed after a catalog is created. It can only be an organization. Values are of the form @\/\/cloudresourcemanager.googleapis.com\/organizations\/\<id>@. Maximum 256 characters in length.
      parent :: (Core.Maybe Core.Text),
      -- | Output only. The time when the catalog was last updated.
      updateTime :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Catalog' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Catalog ::
    GoogleCloudPrivatecatalogproducerV1beta1Catalog
  newGoogleCloudPrivatecatalogproducerV1beta1Catalog =
    GoogleCloudPrivatecatalogproducerV1beta1Catalog
      { createTime =
          Core.Nothing,
        description = Core.Nothing,
        displayName = Core.Nothing,
        name = Core.Nothing,
        parent = Core.Nothing,
        updateTime = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Catalog
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Catalog"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Catalog
              Core.<$> (o Core..:? "createTime")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "displayName")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parent")
              Core.<*> (o Core..:? "updateTime")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Catalog
    where
    toJSON GoogleCloudPrivatecatalogproducerV1beta1Catalog {..} =
      Core.object
        ( Core.catMaybes
            [ ("createTime" Core..=) Core.<$> createTime,
              ("description" Core..=) Core.<$> description,
              ("displayName" Core..=) Core.<$> displayName,
              ("name" Core..=) Core.<$> name,
              ("parent" Core..=) Core.<$> parent,
              ("updateTime" Core..=) Core.<$> updateTime
            ]
        )
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest = GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
    { -- | The resource name of the destination product that is copied to.
      destinationProductName :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest ::
    GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
  newGoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest =
    GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
      { destinationProductName =
          Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
              Core.<$> (o Core..:? "destinationProductName")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1CopyProductRequest {..} =
        Core.object
          ( Core.catMaybes
              [ ("destinationProductName" Core..=)
                  Core.<$> destinationProductName
              ]
          )
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest = GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
    { -- | The user-supplied @Association@ that is going to be created.
      --
      -- If the @resource@ field is set, the @privatecatalogproducer.catalogTargets.associate@ permission is checked on the target resource.
      association :: (Core.Maybe GoogleCloudPrivatecatalogproducerV1beta1Association)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest ::
    GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
  newGoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest =
    GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
      { association =
          Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
              Core.<$> (o Core..:? "association")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1CreateAssociationRequest {..} =
        Core.object
          (Core.catMaybes [("association" Core..=) Core.<$> association])
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse = GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
    { -- | The returned @Association@ resources from the list call.
      associations :: (Core.Maybe [GoogleCloudPrivatecatalogproducerV1beta1Association]),
      -- | A pagination token returned from a previous call to @ListAssociations@ that indicates where the listing should continue from. This field is optional.
      nextPageToken :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse ::
    GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
  newGoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse =
    GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
      { associations =
          Core.Nothing,
        nextPageToken = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
              Core.<$> (o Core..:? "associations")
              Core.<*> (o Core..:? "nextPageToken")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListAssociationsResponse {..} =
        Core.object
          ( Core.catMaybes
              [ ("associations" Core..=) Core.<$> associations,
                ("nextPageToken" Core..=) Core.<$> nextPageToken
              ]
          )
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse = GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
    { -- | The @Catalogs@ returned from the list call.
      catalogs :: (Core.Maybe [GoogleCloudPrivatecatalogproducerV1beta1Catalog]),
      -- | A pagination token returned from a previous call to ListCatalogs that indicates where the listing should continue from. This field is optional.
      nextPageToken :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse ::
    GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
  newGoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse =
    GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
      { catalogs =
          Core.Nothing,
        nextPageToken = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
              Core.<$> (o Core..:? "catalogs")
              Core.<*> (o Core..:? "nextPageToken")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListCatalogsResponse {..} =
        Core.object
          ( Core.catMaybes
              [ ("catalogs" Core..=) Core.<$> catalogs,
                ("nextPageToken" Core..=) Core.<$> nextPageToken
              ]
          )
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse = GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
    { -- | A pagination token returned from a previous call to ListProducts that indicates where the listing should continue from. This field is optional.
      nextPageToken :: (Core.Maybe Core.Text),
      -- | The @Product@ returned from the list call.
      products :: (Core.Maybe [GoogleCloudPrivatecatalogproducerV1beta1Product])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse ::
    GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
  newGoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse =
    GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
      { nextPageToken =
          Core.Nothing,
        products = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
              Core.<$> (o Core..:? "nextPageToken")
              Core.<*> (o Core..:? "products")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListProductsResponse {..} =
        Core.object
          ( Core.catMaybes
              [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
                ("products" Core..=) Core.<$> products
              ]
          )
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse = GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
    { -- | A pagination token returned from a previous call to ListProducts that indicates where the listing should continue from. This field is optional.
      nextPageToken :: (Core.Maybe Core.Text),
      -- | The @VersiVersionon@ returned from the list call.
      versions :: (Core.Maybe [GoogleCloudPrivatecatalogproducerV1beta1Version])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse ::
    GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
  newGoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse =
    GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
      { nextPageToken =
          Core.Nothing,
        versions = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
              Core.<$> (o Core..:? "nextPageToken")
              Core.<*> (o Core..:? "versions")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1ListVersionsResponse {..} =
        Core.object
          ( Core.catMaybes
              [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
                ("versions" Core..=) Core.<$> versions
              ]
          )
  
  -- | The producer representation of a product which is a child resource of @Catalog@ with display metadata and a list of @Version@ resources.
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Product' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1Product = GoogleCloudPrivatecatalogproducerV1beta1Product
    { -- | Required. The type of the product asset, which cannot be changed after the product is created. It supports the values @google.deploymentmanager.Template@ and @google.cloudprivatecatalog.ListingOnly@. Other values will be rejected by the server. Read only after creation.
      --
      -- The following fields or resource types have different validation rules under each @asset_type@ values:
      --
      -- -   Product.display_metadata has different validation schema for each asset type value. See its comment for details.
      -- -   Version resource isn\'t allowed to be added under the @google.cloudprivatecatalog.ListingOnly@ type.
      assetType :: (Core.Maybe Core.Text),
      -- | Output only. The time when the product was created.
      createTime :: (Core.Maybe Core.DateTime),
      -- | The user-supplied display metadata to describe the product. The JSON schema of the metadata differs by Product.asset_type. When the type is @google.deploymentmanager.Template@, the schema is as follows:
      --
      -- \`\`\` \"$schema\": http:\/\/json-schema.org\/draft-04\/schema# type: object properties: name: type: string minLength: 1 maxLength: 64 description: type: string minLength: 1 maxLength: 2048 tagline: type: string minLength: 1 maxLength: 100 support/info: type: string minLength: 1 maxLength: 2048 creator: type: string minLength: 1 maxLength: 100 documentation: type: array items: type: object properties: url: type: string pattern: \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~/|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\" title: type: string minLength: 1 maxLength: 64 description: type: string minLength: 1 maxLength: 2048 required: - name - description additionalProperties: false
      --
      -- \`\`\`
      --
      -- When the asset type is @google.cloudprivatecatalog.ListingOnly@, the schema is as follows:
      --
      -- @\"$schema\": http:\/\/json-schema.org\/draft-04\/schema# type: object properties:   name:     type: string     minLength: 1     maxLength: 64   description:     type: string     minLength: 1     maxLength: 2048   tagline:     type: string     minLength: 1     maxLength: 100   support_info:     type: string     minLength: 1     maxLength: 2048   creator:     type: string     minLength: 1     maxLength: 100   documentation:     type: array     items:       type: object       properties:         url:           type: string           pattern:           \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\"         title:           type: string           minLength: 1           maxLength: 64         description:           type: string           minLength: 1           maxLength: 2048   signup_url:     type: string     pattern:     \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\" required: - name - description - signup_url additionalProperties: false@
      displayMetadata ::
        ( Core.Maybe
            GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
        ),
      -- | Output only. The public accessible URI of the icon uploaded by PrivateCatalogProducer.UploadIcon.
      --
      -- If no icon is uploaded, it will be the default icon\'s URI.
      iconUri :: (Core.Maybe Core.Text),
      -- | Required. The resource name of the product in the format \`catalogs\/{catalog_id}\/products\/a-z*[a-z0-9]\'.
      --
      -- A unique identifier for the product under a catalog, which cannot be changed after the product is created. The final segment of the name must between 1 and 256 characters in length.
      name :: (Core.Maybe Core.Text),
      -- | Output only. The time when the product was last updated.
      updateTime :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Product' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Product ::
    GoogleCloudPrivatecatalogproducerV1beta1Product
  newGoogleCloudPrivatecatalogproducerV1beta1Product =
    GoogleCloudPrivatecatalogproducerV1beta1Product
      { assetType =
          Core.Nothing,
        createTime = Core.Nothing,
        displayMetadata = Core.Nothing,
        iconUri = Core.Nothing,
        name = Core.Nothing,
        updateTime = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Product
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Product"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Product
              Core.<$> (o Core..:? "assetType")
              Core.<*> (o Core..:? "createTime")
              Core.<*> (o Core..:? "displayMetadata")
              Core.<*> (o Core..:? "iconUri")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "updateTime")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Product
    where
    toJSON GoogleCloudPrivatecatalogproducerV1beta1Product {..} =
      Core.object
        ( Core.catMaybes
            [ ("assetType" Core..=) Core.<$> assetType,
              ("createTime" Core..=) Core.<$> createTime,
              ("displayMetadata" Core..=) Core.<$> displayMetadata,
              ("iconUri" Core..=) Core.<$> iconUri,
              ("name" Core..=) Core.<$> name,
              ("updateTime" Core..=) Core.<$> updateTime
            ]
        )
  
  -- | The user-supplied display metadata to describe the product. The JSON schema of the metadata differs by Product.asset_type. When the type is @google.deploymentmanager.Template@, the schema is as follows:
  --
  -- \`\`\` \"$schema\": http:\/\/json-schema.org\/draft-04\/schema# type: object properties: name: type: string minLength: 1 maxLength: 64 description: type: string minLength: 1 maxLength: 2048 tagline: type: string minLength: 1 maxLength: 100 support/info: type: string minLength: 1 maxLength: 2048 creator: type: string minLength: 1 maxLength: 100 documentation: type: array items: type: object properties: url: type: string pattern: \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~/|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\" title: type: string minLength: 1 maxLength: 64 description: type: string minLength: 1 maxLength: 2048 required: - name - description additionalProperties: false
  --
  -- \`\`\`
  --
  -- When the asset type is @google.cloudprivatecatalog.ListingOnly@, the schema is as follows:
  --
  -- @\"$schema\": http:\/\/json-schema.org\/draft-04\/schema# type: object properties:   name:     type: string     minLength: 1     maxLength: 64   description:     type: string     minLength: 1     maxLength: 2048   tagline:     type: string     minLength: 1     maxLength: 100   support_info:     type: string     minLength: 1     maxLength: 2048   creator:     type: string     minLength: 1     maxLength: 100   documentation:     type: array     items:       type: object       properties:         url:           type: string           pattern:           \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\"         title:           type: string           minLength: 1           maxLength: 64         description:           type: string           minLength: 1           maxLength: 2048   signup_url:     type: string     pattern:     \"^(https?):\/\/[-a-zA-Z0-9+&\@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&\@#\/%=~_|]\" required: - name - description - signup_url additionalProperties: false@
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata = GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
    { -- | Properties of the object.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata ::
    -- |  Properties of the object. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
  newGoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
    additional =
      GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
        { additional =
            additional
        }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1Product_DisplayMetadata {..} =
        Core.toJSON additional
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest = GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest ::
    GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
  newGoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest =
    GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest"
        ( \o ->
            Core.pure
              GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1UndeleteCatalogRequest
    where
    toJSON = Core.const Core.emptyObject
  
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest = GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
    { -- | The raw icon bytes user-supplied to be uploaded to the product. The format of the icon can only be PNG or JPEG. The minimum allowed dimensions are 130x130 pixels and the maximum dimensions are 10000x10000 pixels. Required.
      icon :: (Core.Maybe Core.Base64)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest ::
    GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
  newGoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest =
    GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
      { icon =
          Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
              Core.<$> (o Core..:? "icon")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1UploadIconRequest {..} =
        Core.object (Core.catMaybes [("icon" Core..=) Core.<$> icon])
  
  -- | The producer representation of a version, which is a child resource under a @Product@ with asset data.
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Version' smart constructor.
  data GoogleCloudPrivatecatalogproducerV1beta1Version = GoogleCloudPrivatecatalogproducerV1beta1Version
    { -- | Output only. The asset which has been validated and is ready to be provisioned. See Version.original_asset for the schema.
      asset :: (Core.Maybe GoogleCloudPrivatecatalogproducerV1beta1Version_Asset),
      -- | Output only. The time when the version was created.
      createTime :: (Core.Maybe Core.DateTime),
      -- | The user-supplied description of the version. Maximum of 256 characters.
      description :: (Core.Maybe Core.Text),
      -- | Required. The resource name of the version, in the format \`catalogs\/{catalog/id}\/products\/{product/id}\/versions\/a-z*[a-z0-9]\'.
      --
      -- A unique identifier for the version under a product, which can\'t be changed after the version is created. The final segment of the name must between 1 and 63 characters in length.
      name :: (Core.Maybe Core.Text),
      -- | The user-supplied asset payload. The maximum size of the payload is 2MB. The JSON schema of the payload is defined as:
      --
      -- @type: object properties:   mainTemplate:     type: string     description: The file name of the main template and name prefix of     schema file. The content of the main template should be set in the     imports list. The schema file name is expected to be     \<mainTemplate>.schema in the imports list. required: true   imports:     type: array     description: Import template and schema file contents. Required to have     both \<mainTemplate> and \<mainTemplate>.schema files. required: true     minItems: 2     items:       type: object       properties:         name:           type: string         content:           type: string@
      originalAsset ::
        ( Core.Maybe
            GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
        ),
      -- | Output only. The time when the version was last updated.
      updateTime :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Version' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Version ::
    GoogleCloudPrivatecatalogproducerV1beta1Version
  newGoogleCloudPrivatecatalogproducerV1beta1Version =
    GoogleCloudPrivatecatalogproducerV1beta1Version
      { asset =
          Core.Nothing,
        createTime = Core.Nothing,
        description = Core.Nothing,
        name = Core.Nothing,
        originalAsset = Core.Nothing,
        updateTime = Core.Nothing
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Version"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Version
              Core.<$> (o Core..:? "asset")
              Core.<*> (o Core..:? "createTime")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "originalAsset")
              Core.<*> (o Core..:? "updateTime")
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version
    where
    toJSON GoogleCloudPrivatecatalogproducerV1beta1Version {..} =
      Core.object
        ( Core.catMaybes
            [ ("asset" Core..=) Core.<$> asset,
              ("createTime" Core..=) Core.<$> createTime,
              ("description" Core..=) Core.<$> description,
              ("name" Core..=) Core.<$> name,
              ("originalAsset" Core..=) Core.<$> originalAsset,
              ("updateTime" Core..=) Core.<$> updateTime
            ]
        )
  
  -- | Output only. The asset which has been validated and is ready to be provisioned. See Version.original_asset for the schema.
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Version_Asset' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1Version_Asset = GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
    { -- | Properties of the object.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Version_Asset' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Version_Asset ::
    -- |  Properties of the object. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
  newGoogleCloudPrivatecatalogproducerV1beta1Version_Asset additional =
    GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
      { additional =
          additional
      }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Version_Asset"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version_Asset
    where
    toJSON GoogleCloudPrivatecatalogproducerV1beta1Version_Asset {..} =
      Core.toJSON additional
  
  -- | The user-supplied asset payload. The maximum size of the payload is 2MB. The JSON schema of the payload is defined as:
  --
  -- @type: object properties:   mainTemplate:     type: string     description: The file name of the main template and name prefix of     schema file. The content of the main template should be set in the     imports list. The schema file name is expected to be     \<mainTemplate>.schema in the imports list. required: true   imports:     type: array     description: Import template and schema file contents. Required to have     both \<mainTemplate> and \<mainTemplate>.schema files. required: true     minItems: 2     items:       type: object       properties:         name:           type: string         content:           type: string@
  --
  -- /See:/ 'newGoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset' smart constructor.
  newtype GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset = GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
    { -- | Properties of the object.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset' with the minimum fields required to make a request.
  newGoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset ::
    -- |  Properties of the object. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
  newGoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
    additional =
      GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
        { additional =
            additional
        }
  
  instance
    Core.FromJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
    where
    parseJSON =
      Core.withObject
        "GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset"
        ( \o ->
            GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance
    Core.ToJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset
    where
    toJSON
      GoogleCloudPrivatecatalogproducerV1beta1Version_OriginalAsset {..} =
        Core.toJSON additional
  
  -- | Specifies the audit configuration for a service. The configuration determines which permission types are logged, and what identities, if any, are exempted from logging. An AuditConfig must have one or more AuditLogConfigs.
  --
  -- If there are AuditConfigs for both @allServices@ and a specific service, the union of the two AuditConfigs is used for that service: the log/types specified in each AuditConfig are enabled, and the exempted/members in each AuditLogConfig are exempted.
  --
  -- Example Policy with multiple AuditConfigs:
  --
  -- > {
  -- >   "audit_configs": [
  -- >     {
  -- >       "service": "allServices"
  -- >       "audit_log_configs": [
  -- >         {
  -- >           "log_type": "DATA_READ",
  -- >           "exempted_members": [
  -- >             "user:jose@example.com"
  -- >           ]
  -- >         },
  -- >         {
  -- >           "log_type": "DATA_WRITE",
  -- >         },
  -- >         {
  -- >           "log_type": "ADMIN_READ",
  -- >         }
  -- >       ]
  -- >     },
  -- >     {
  -- >       "service": "sampleservice.googleapis.com"
  -- >       "audit_log_configs": [
  -- >         {
  -- >           "log_type": "DATA_READ",
  -- >         },
  -- >         {
  -- >           "log_type": "DATA_WRITE",
  -- >           "exempted_members": [
  -- >             "user:aliya@example.com"
  -- >           ]
  -- >         }
  -- >       ]
  -- >     }
  -- >   ]
  -- > }
  --
  -- For sampleservice, this policy enables DATA/READ, DATA/WRITE and ADMIN/READ logging. It also exempts jose\@example.com from DATA/READ logging, and aliya\@example.com from DATA_WRITE logging.
  --
  -- /See:/ 'newGoogleIamV1AuditConfig' smart constructor.
  data GoogleIamV1AuditConfig = GoogleIamV1AuditConfig
    { -- | The configuration for logging of each type of permission.
      auditLogConfigs :: (Core.Maybe [GoogleIamV1AuditLogConfig]),
      -- | Specifies a service that will be enabled for audit logging. For example, @storage.googleapis.com@, @cloudsql.googleapis.com@. @allServices@ is a special value that covers all services.
      service :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1AuditConfig' with the minimum fields required to make a request.
  newGoogleIamV1AuditConfig ::
    GoogleIamV1AuditConfig
  newGoogleIamV1AuditConfig =
    GoogleIamV1AuditConfig
      { auditLogConfigs = Core.Nothing,
        service = Core.Nothing
      }
  
  instance Core.FromJSON GoogleIamV1AuditConfig where
    parseJSON =
      Core.withObject
        "GoogleIamV1AuditConfig"
        ( \o ->
            GoogleIamV1AuditConfig
              Core.<$> (o Core..:? "auditLogConfigs")
              Core.<*> (o Core..:? "service")
        )
  
  instance Core.ToJSON GoogleIamV1AuditConfig where
    toJSON GoogleIamV1AuditConfig {..} =
      Core.object
        ( Core.catMaybes
            [ ("auditLogConfigs" Core..=) Core.<$> auditLogConfigs,
              ("service" Core..=) Core.<$> service
            ]
        )
  
  -- | Provides the configuration for logging a type of permissions. Example:
  --
  -- > {
  -- >   "audit_log_configs": [
  -- >     {
  -- >       "log_type": "DATA_READ",
  -- >       "exempted_members": [
  -- >         "user:jose@example.com"
  -- >       ]
  -- >     },
  -- >     {
  -- >       "log_type": "DATA_WRITE",
  -- >     }
  -- >   ]
  -- > }
  --
  -- This enables \'DATA/READ\' and \'DATA/WRITE\' logging, while exempting jose\@example.com from DATA_READ logging.
  --
  -- /See:/ 'newGoogleIamV1AuditLogConfig' smart constructor.
  data GoogleIamV1AuditLogConfig = GoogleIamV1AuditLogConfig
    { -- | Specifies the identities that do not cause logging for this type of permission. Follows the same format of Binding.members.
      exemptedMembers :: (Core.Maybe [Core.Text]),
      -- | The log type that this config enables.
      logType :: (Core.Maybe GoogleIamV1AuditLogConfig_LogType)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1AuditLogConfig' with the minimum fields required to make a request.
  newGoogleIamV1AuditLogConfig ::
    GoogleIamV1AuditLogConfig
  newGoogleIamV1AuditLogConfig =
    GoogleIamV1AuditLogConfig
      { exemptedMembers = Core.Nothing,
        logType = Core.Nothing
      }
  
  instance Core.FromJSON GoogleIamV1AuditLogConfig where
    parseJSON =
      Core.withObject
        "GoogleIamV1AuditLogConfig"
        ( \o ->
            GoogleIamV1AuditLogConfig
              Core.<$> (o Core..:? "exemptedMembers")
              Core.<*> (o Core..:? "logType")
        )
  
  instance Core.ToJSON GoogleIamV1AuditLogConfig where
    toJSON GoogleIamV1AuditLogConfig {..} =
      Core.object
        ( Core.catMaybes
            [ ("exemptedMembers" Core..=) Core.<$> exemptedMembers,
              ("logType" Core..=) Core.<$> logType
            ]
        )
  
  -- | Associates @members@ with a @role@.
  --
  -- /See:/ 'newGoogleIamV1Binding' smart constructor.
  data GoogleIamV1Binding = GoogleIamV1Binding
    { -- | The condition that is associated with this binding. NOTE: An unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently.
      condition :: (Core.Maybe GoogleTypeExpr),
      -- | Specifies the identities requesting access for a Cloud Platform resource. @members@ can have the following values:
      --
      -- -   @allUsers@: A special identifier that represents anyone who is on the internet; with or without a Google account.
      --
      -- -   @allAuthenticatedUsers@: A special identifier that represents anyone who is authenticated with a Google account or a service account.
      --
      -- -   @user:{emailid}@: An email address that represents a specific Google account. For example, @alice\@example.com@ .
      --
      -- -   @serviceAccount:{emailid}@: An email address that represents a service account. For example, @my-other-app\@appspot.gserviceaccount.com@.
      --
      -- -   @group:{emailid}@: An email address that represents a Google group. For example, @admins\@example.com@.
      --
      -- -   @deleted:user:{emailid}?uid={uniqueid}@: An email address (plus unique identifier) representing a user that has been recently deleted. For example, @alice\@example.com?uid=123456789012345678901@. If the user is recovered, this value reverts to @user:{emailid}@ and the recovered user retains the role in the binding.
      --
      -- -   @deleted:serviceAccount:{emailid}?uid={uniqueid}@: An email address (plus unique identifier) representing a service account that has been recently deleted. For example, @my-other-app\@appspot.gserviceaccount.com?uid=123456789012345678901@. If the service account is undeleted, this value reverts to @serviceAccount:{emailid}@ and the undeleted service account retains the role in the binding.
      --
      -- -   @deleted:group:{emailid}?uid={uniqueid}@: An email address (plus unique identifier) representing a Google group that has been recently deleted. For example, @admins\@example.com?uid=123456789012345678901@. If the group is recovered, this value reverts to @group:{emailid}@ and the recovered group retains the role in the binding.
      --
      -- -   @domain:{domain}@: The G Suite domain (primary) that represents all the users of that domain. For example, @google.com@ or @example.com@.
      members :: (Core.Maybe [Core.Text]),
      -- | Role that is assigned to @members@. For example, @roles\/viewer@, @roles\/editor@, or @roles\/owner@.
      role' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1Binding' with the minimum fields required to make a request.
  newGoogleIamV1Binding ::
    GoogleIamV1Binding
  newGoogleIamV1Binding =
    GoogleIamV1Binding
      { condition = Core.Nothing,
        members = Core.Nothing,
        role' = Core.Nothing
      }
  
  instance Core.FromJSON GoogleIamV1Binding where
    parseJSON =
      Core.withObject
        "GoogleIamV1Binding"
        ( \o ->
            GoogleIamV1Binding
              Core.<$> (o Core..:? "condition")
              Core.<*> (o Core..:? "members")
              Core.<*> (o Core..:? "role")
        )
  
  instance Core.ToJSON GoogleIamV1Binding where
    toJSON GoogleIamV1Binding {..} =
      Core.object
        ( Core.catMaybes
            [ ("condition" Core..=) Core.<$> condition,
              ("members" Core..=) Core.<$> members,
              ("role" Core..=) Core.<$> role'
            ]
        )
  
  -- | An Identity and Access Management (IAM) policy, which specifies access controls for Google Cloud resources.
  --
  -- A @Policy@ is a collection of @bindings@. A @binding@ binds one or more @members@ to a single @role@. Members can be user accounts, service accounts, Google groups, and domains (such as G Suite). A @role@ is a named list of permissions; each @role@ can be an IAM predefined role or a user-created custom role.
  --
  -- Optionally, a @binding@ can specify a @condition@, which is a logical expression that allows access to a resource only if the expression evaluates to @true@. A condition can add constraints based on attributes of the request, the resource, or both.
  --
  -- __JSON example:__
  --
  -- > {
  -- >   "bindings": [
  -- >     {
  -- >       "role": "roles/resourcemanager.organizationAdmin",
  -- >       "members": [
  -- >         "user:mike@example.com",
  -- >         "group:admins@example.com",
  -- >         "domain:google.com",
  -- >         "serviceAccount:my-project-id@appspot.gserviceaccount.com"
  -- >       ]
  -- >     },
  -- >     {
  -- >       "role": "roles/resourcemanager.organizationViewer",
  -- >       "members": ["user:eve@example.com"],
  -- >       "condition": {
  -- >         "title": "expirable access",
  -- >         "description": "Does not grant access after Sep 2020",
  -- >         "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')",
  -- >       }
  -- >     }
  -- >   ],
  -- >   "etag": "BwWWja0YfJA=",
  -- >   "version": 3
  -- > }
  --
  -- __YAML example:__
  --
  -- > bindings:
  -- > - members:
  -- >   - user:mike@example.com
  -- >   - group:admins@example.com
  -- >   - domain:google.com
  -- >   - serviceAccount:my-project-id@appspot.gserviceaccount.com
  -- >   role: roles/resourcemanager.organizationAdmin
  -- > - members:
  -- >   - user:eve@example.com
  -- >   role: roles/resourcemanager.organizationViewer
  -- >   condition:
  -- >     title: expirable access
  -- >     description: Does not grant access after Sep 2020
  -- >     expression: request.time < timestamp('2020-10-01T00:00:00.000Z')
  -- > - etag: BwWWja0YfJA=
  -- > - version: 3
  --
  -- For a description of IAM and its features, see the <https://cloud.google.com/iam/docs/ IAM documentation>.
  --
  -- /See:/ 'newGoogleIamV1Policy' smart constructor.
  data GoogleIamV1Policy = GoogleIamV1Policy
    { -- | Specifies cloud audit logging configuration for this policy.
      auditConfigs :: (Core.Maybe [GoogleIamV1AuditConfig]),
      -- | Associates a list of @members@ to a @role@. Optionally, may specify a @condition@ that determines how and when the @bindings@ are applied. Each of the @bindings@ must contain at least one member.
      bindings :: (Core.Maybe [GoogleIamV1Binding]),
      -- | @etag@ is used for optimistic concurrency control as a way to help prevent simultaneous updates of a policy from overwriting each other. It is strongly suggested that systems make use of the @etag@ in the read-modify-write cycle to perform policy updates in order to avoid race conditions: An @etag@ is returned in the response to @getIamPolicy@, and systems are expected to put that etag in the request to @setIamPolicy@ to ensure that their change will be applied to the same version of the policy.
      --
      -- __Important:__ If you use IAM Conditions, you must include the @etag@ field whenever you call @setIamPolicy@. If you omit this field, then IAM allows you to overwrite a version @3@ policy with a version @1@ policy, and all of the conditions in the version @3@ policy are lost.
      etag :: (Core.Maybe Core.Base64),
      -- | Specifies the format of the policy.
      --
      -- Valid values are @0@, @1@, and @3@. Requests that specify an invalid value are rejected.
      --
      -- Any operation that affects conditional role bindings must specify version @3@. This requirement applies to the following operations:
      --
      -- -   Getting a policy that includes a conditional role binding
      -- -   Adding a conditional role binding to a policy
      -- -   Changing a conditional role binding in a policy
      -- -   Removing any role binding, with or without a condition, from a policy that includes conditions
      --
      -- __Important:__ If you use IAM Conditions, you must include the @etag@ field whenever you call @setIamPolicy@. If you omit this field, then IAM allows you to overwrite a version @3@ policy with a version @1@ policy, and all of the conditions in the version @3@ policy are lost.
      --
      -- If a policy does not include any conditions, operations on that policy may specify any valid version or leave the field unset.
      version :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1Policy' with the minimum fields required to make a request.
  newGoogleIamV1Policy ::
    GoogleIamV1Policy
  newGoogleIamV1Policy =
    GoogleIamV1Policy
      { auditConfigs = Core.Nothing,
        bindings = Core.Nothing,
        etag = Core.Nothing,
        version = Core.Nothing
      }
  
  instance Core.FromJSON GoogleIamV1Policy where
    parseJSON =
      Core.withObject
        "GoogleIamV1Policy"
        ( \o ->
            GoogleIamV1Policy
              Core.<$> (o Core..:? "auditConfigs")
              Core.<*> (o Core..:? "bindings")
              Core.<*> (o Core..:? "etag")
              Core.<*> (o Core..:? "version")
        )
  
  instance Core.ToJSON GoogleIamV1Policy where
    toJSON GoogleIamV1Policy {..} =
      Core.object
        ( Core.catMaybes
            [ ("auditConfigs" Core..=) Core.<$> auditConfigs,
              ("bindings" Core..=) Core.<$> bindings,
              ("etag" Core..=) Core.<$> etag,
              ("version" Core..=) Core.<$> version
            ]
        )
  
  -- | Request message for @SetIamPolicy@ method.
  --
  -- /See:/ 'newGoogleIamV1SetIamPolicyRequest' smart constructor.
  data GoogleIamV1SetIamPolicyRequest = GoogleIamV1SetIamPolicyRequest
    { -- | REQUIRED: The complete policy to be applied to the @resource@. The size of the policy is limited to a few 10s of KB. An empty policy is a valid policy but certain Cloud Platform services (such as Projects) might reject them.
      policy :: (Core.Maybe GoogleIamV1Policy),
      -- | OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only the fields in the mask will be modified. If no mask is provided, the following default mask is used: paths: \"bindings, etag\" This field is only used by Cloud IAM.
      updateMask :: (Core.Maybe Core.FieldMask)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1SetIamPolicyRequest' with the minimum fields required to make a request.
  newGoogleIamV1SetIamPolicyRequest ::
    GoogleIamV1SetIamPolicyRequest
  newGoogleIamV1SetIamPolicyRequest =
    GoogleIamV1SetIamPolicyRequest
      { policy = Core.Nothing,
        updateMask = Core.Nothing
      }
  
  instance Core.FromJSON GoogleIamV1SetIamPolicyRequest where
    parseJSON =
      Core.withObject
        "GoogleIamV1SetIamPolicyRequest"
        ( \o ->
            GoogleIamV1SetIamPolicyRequest
              Core.<$> (o Core..:? "policy")
              Core.<*> (o Core..:? "updateMask")
        )
  
  instance Core.ToJSON GoogleIamV1SetIamPolicyRequest where
    toJSON GoogleIamV1SetIamPolicyRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("policy" Core..=) Core.<$> policy,
              ("updateMask" Core..=) Core.<$> updateMask
            ]
        )
  
  -- | Request message for @TestIamPermissions@ method.
  --
  -- /See:/ 'newGoogleIamV1TestIamPermissionsRequest' smart constructor.
  newtype GoogleIamV1TestIamPermissionsRequest = GoogleIamV1TestIamPermissionsRequest
    { -- | The set of permissions to check for the @resource@. Permissions with wildcards (such as \'/\' or \'storage./\') are not allowed. For more information see <https://cloud.google.com/iam/docs/overview#permissions IAM Overview>.
      permissions :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1TestIamPermissionsRequest' with the minimum fields required to make a request.
  newGoogleIamV1TestIamPermissionsRequest ::
    GoogleIamV1TestIamPermissionsRequest
  newGoogleIamV1TestIamPermissionsRequest =
    GoogleIamV1TestIamPermissionsRequest {permissions = Core.Nothing}
  
  instance Core.FromJSON GoogleIamV1TestIamPermissionsRequest where
    parseJSON =
      Core.withObject
        "GoogleIamV1TestIamPermissionsRequest"
        ( \o ->
            GoogleIamV1TestIamPermissionsRequest
              Core.<$> (o Core..:? "permissions")
        )
  
  instance Core.ToJSON GoogleIamV1TestIamPermissionsRequest where
    toJSON GoogleIamV1TestIamPermissionsRequest {..} =
      Core.object
        (Core.catMaybes [("permissions" Core..=) Core.<$> permissions])
  
  -- | Response message for @TestIamPermissions@ method.
  --
  -- /See:/ 'newGoogleIamV1TestIamPermissionsResponse' smart constructor.
  newtype GoogleIamV1TestIamPermissionsResponse = GoogleIamV1TestIamPermissionsResponse
    { -- | A subset of @TestPermissionsRequest.permissions@ that the caller is allowed.
      permissions :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleIamV1TestIamPermissionsResponse' with the minimum fields required to make a request.
  newGoogleIamV1TestIamPermissionsResponse ::
    GoogleIamV1TestIamPermissionsResponse
  newGoogleIamV1TestIamPermissionsResponse =
    GoogleIamV1TestIamPermissionsResponse {permissions = Core.Nothing}
  
  instance Core.FromJSON GoogleIamV1TestIamPermissionsResponse where
    parseJSON =
      Core.withObject
        "GoogleIamV1TestIamPermissionsResponse"
        ( \o ->
            GoogleIamV1TestIamPermissionsResponse
              Core.<$> (o Core..:? "permissions")
        )
  
  instance Core.ToJSON GoogleIamV1TestIamPermissionsResponse where
    toJSON GoogleIamV1TestIamPermissionsResponse {..} =
      Core.object
        (Core.catMaybes [("permissions" Core..=) Core.<$> permissions])
  
  -- | The request message for Operations.CancelOperation.
  --
  -- /See:/ 'newGoogleLongrunningCancelOperationRequest' smart constructor.
  data GoogleLongrunningCancelOperationRequest = GoogleLongrunningCancelOperationRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleLongrunningCancelOperationRequest' with the minimum fields required to make a request.
  newGoogleLongrunningCancelOperationRequest ::
    GoogleLongrunningCancelOperationRequest
  newGoogleLongrunningCancelOperationRequest =
    GoogleLongrunningCancelOperationRequest
  
  instance Core.FromJSON GoogleLongrunningCancelOperationRequest where
    parseJSON =
      Core.withObject
        "GoogleLongrunningCancelOperationRequest"
        (\o -> Core.pure GoogleLongrunningCancelOperationRequest)
  
  instance Core.ToJSON GoogleLongrunningCancelOperationRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | The response message for Operations.ListOperations.
  --
  -- /See:/ 'newGoogleLongrunningListOperationsResponse' smart constructor.
  data GoogleLongrunningListOperationsResponse = GoogleLongrunningListOperationsResponse
    { -- | The standard List next-page token.
      nextPageToken :: (Core.Maybe Core.Text),
      -- | A list of operations that matches the specified filter in the request.
      operations :: (Core.Maybe [GoogleLongrunningOperation])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleLongrunningListOperationsResponse' with the minimum fields required to make a request.
  newGoogleLongrunningListOperationsResponse ::
    GoogleLongrunningListOperationsResponse
  newGoogleLongrunningListOperationsResponse =
    GoogleLongrunningListOperationsResponse
      { nextPageToken =
          Core.Nothing,
        operations = Core.Nothing
      }
  
  instance Core.FromJSON GoogleLongrunningListOperationsResponse where
    parseJSON =
      Core.withObject
        "GoogleLongrunningListOperationsResponse"
        ( \o ->
            GoogleLongrunningListOperationsResponse
              Core.<$> (o Core..:? "nextPageToken")
              Core.<*> (o Core..:? "operations")
        )
  
  instance Core.ToJSON GoogleLongrunningListOperationsResponse where
    toJSON GoogleLongrunningListOperationsResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
              ("operations" Core..=) Core.<$> operations
            ]
        )
  
  -- | This resource represents a long-running operation that is the result of a network API call.
  --
  -- /See:/ 'newGoogleLongrunningOperation' smart constructor.
  data GoogleLongrunningOperation = GoogleLongrunningOperation
    { -- | If the value is @false@, it means the operation is still in progress. If @true@, the operation is completed, and either @error@ or @response@ is available.
      done :: (Core.Maybe Core.Bool),
      -- | The error result of the operation in case of failure or cancellation.
      error :: (Core.Maybe GoogleRpcStatus),
      -- | Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
      metadata :: (Core.Maybe GoogleLongrunningOperation_Metadata),
      -- | The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the @name@ should be a resource name ending with @operations\/{unique_id}@.
      name :: (Core.Maybe Core.Text),
      -- | The normal response of the operation in case of success. If the original method returns no data on success, such as @Delete@, the response is @google.protobuf.Empty@. If the original method is standard @Get@\/@Create@\/@Update@, the response should be the resource. For other methods, the response should have the type @XxxResponse@, where @Xxx@ is the original method name. For example, if the original method name is @TakeSnapshot()@, the inferred response type is @TakeSnapshotResponse@.
      response :: (Core.Maybe GoogleLongrunningOperation_Response)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleLongrunningOperation' with the minimum fields required to make a request.
  newGoogleLongrunningOperation ::
    GoogleLongrunningOperation
  newGoogleLongrunningOperation =
    GoogleLongrunningOperation
      { done = Core.Nothing,
        error = Core.Nothing,
        metadata = Core.Nothing,
        name = Core.Nothing,
        response = Core.Nothing
      }
  
  instance Core.FromJSON GoogleLongrunningOperation where
    parseJSON =
      Core.withObject
        "GoogleLongrunningOperation"
        ( \o ->
            GoogleLongrunningOperation
              Core.<$> (o Core..:? "done")
              Core.<*> (o Core..:? "error")
              Core.<*> (o Core..:? "metadata")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "response")
        )
  
  instance Core.ToJSON GoogleLongrunningOperation where
    toJSON GoogleLongrunningOperation {..} =
      Core.object
        ( Core.catMaybes
            [ ("done" Core..=) Core.<$> done,
              ("error" Core..=) Core.<$> error,
              ("metadata" Core..=) Core.<$> metadata,
              ("name" Core..=) Core.<$> name,
              ("response" Core..=) Core.<$> response
            ]
        )
  
  -- | Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
  --
  -- /See:/ 'newGoogleLongrunningOperation_Metadata' smart constructor.
  newtype GoogleLongrunningOperation_Metadata = GoogleLongrunningOperation_Metadata
    { -- | Properties of the object. Contains field \@type with type URL.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleLongrunningOperation_Metadata' with the minimum fields required to make a request.
  newGoogleLongrunningOperation_Metadata ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleLongrunningOperation_Metadata
  newGoogleLongrunningOperation_Metadata additional =
    GoogleLongrunningOperation_Metadata {additional = additional}
  
  instance Core.FromJSON GoogleLongrunningOperation_Metadata where
    parseJSON =
      Core.withObject
        "GoogleLongrunningOperation_Metadata"
        ( \o ->
            GoogleLongrunningOperation_Metadata
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON GoogleLongrunningOperation_Metadata where
    toJSON GoogleLongrunningOperation_Metadata {..} =
      Core.toJSON additional
  
  -- | The normal response of the operation in case of success. If the original method returns no data on success, such as @Delete@, the response is @google.protobuf.Empty@. If the original method is standard @Get@\/@Create@\/@Update@, the response should be the resource. For other methods, the response should have the type @XxxResponse@, where @Xxx@ is the original method name. For example, if the original method name is @TakeSnapshot()@, the inferred response type is @TakeSnapshotResponse@.
  --
  -- /See:/ 'newGoogleLongrunningOperation_Response' smart constructor.
  newtype GoogleLongrunningOperation_Response = GoogleLongrunningOperation_Response
    { -- | Properties of the object. Contains field \@type with type URL.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleLongrunningOperation_Response' with the minimum fields required to make a request.
  newGoogleLongrunningOperation_Response ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleLongrunningOperation_Response
  newGoogleLongrunningOperation_Response additional =
    GoogleLongrunningOperation_Response {additional = additional}
  
  instance Core.FromJSON GoogleLongrunningOperation_Response where
    parseJSON =
      Core.withObject
        "GoogleLongrunningOperation_Response"
        ( \o ->
            GoogleLongrunningOperation_Response
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON GoogleLongrunningOperation_Response where
    toJSON GoogleLongrunningOperation_Response {..} =
      Core.toJSON additional
  
  -- | A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:
  --
  -- > service Foo {
  -- >   rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
  -- > }
  --
  -- The JSON representation for @Empty@ is empty JSON object @{}@.
  --
  -- /See:/ 'newGoogleProtobufEmpty' smart constructor.
  data GoogleProtobufEmpty = GoogleProtobufEmpty
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleProtobufEmpty' with the minimum fields required to make a request.
  newGoogleProtobufEmpty ::
    GoogleProtobufEmpty
  newGoogleProtobufEmpty = GoogleProtobufEmpty
  
  instance Core.FromJSON GoogleProtobufEmpty where
    parseJSON =
      Core.withObject
        "GoogleProtobufEmpty"
        (\o -> Core.pure GoogleProtobufEmpty)
  
  instance Core.ToJSON GoogleProtobufEmpty where
    toJSON = Core.const Core.emptyObject
  
  -- | The @Status@ type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by <https://github.com/grpc gRPC>. Each @Status@ message contains three pieces of data: error code, error message, and error details.
  --
  -- You can find out more about this error model and how to work with it in the <https://cloud.google.com/apis/design/errors API Design Guide>.
  --
  -- /See:/ 'newGoogleRpcStatus' smart constructor.
  data GoogleRpcStatus = GoogleRpcStatus
    { -- | The status code, which should be an enum value of google.rpc.Code.
      code :: (Core.Maybe Core.Int32),
      -- | A list of messages that carry the error details. There is a common set of message types for APIs to use.
      details :: (Core.Maybe [GoogleRpcStatus_DetailsItem]),
      -- | A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
      message :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleRpcStatus' with the minimum fields required to make a request.
  newGoogleRpcStatus ::
    GoogleRpcStatus
  newGoogleRpcStatus =
    GoogleRpcStatus
      { code = Core.Nothing,
        details = Core.Nothing,
        message = Core.Nothing
      }
  
  instance Core.FromJSON GoogleRpcStatus where
    parseJSON =
      Core.withObject
        "GoogleRpcStatus"
        ( \o ->
            GoogleRpcStatus
              Core.<$> (o Core..:? "code")
              Core.<*> (o Core..:? "details")
              Core.<*> (o Core..:? "message")
        )
  
  instance Core.ToJSON GoogleRpcStatus where
    toJSON GoogleRpcStatus {..} =
      Core.object
        ( Core.catMaybes
            [ ("code" Core..=) Core.<$> code,
              ("details" Core..=) Core.<$> details,
              ("message" Core..=) Core.<$> message
            ]
        )
  
  --
  -- /See:/ 'newGoogleRpcStatus_DetailsItem' smart constructor.
  newtype GoogleRpcStatus_DetailsItem = GoogleRpcStatus_DetailsItem
    { -- | Properties of the object. Contains field \@type with type URL.
      additional :: (Core.HashMap Core.Text Core.Value)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleRpcStatus_DetailsItem' with the minimum fields required to make a request.
  newGoogleRpcStatus_DetailsItem ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleRpcStatus_DetailsItem
  newGoogleRpcStatus_DetailsItem additional =
    GoogleRpcStatus_DetailsItem {additional = additional}
  
  instance Core.FromJSON GoogleRpcStatus_DetailsItem where
    parseJSON =
      Core.withObject
        "GoogleRpcStatus_DetailsItem"
        ( \o ->
            GoogleRpcStatus_DetailsItem Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON GoogleRpcStatus_DetailsItem where
    toJSON GoogleRpcStatus_DetailsItem {..} = Core.toJSON additional
  
  -- | Represents a textual expression in the Common Expression Language (CEL) syntax. CEL is a C-like expression language. The syntax and semantics of CEL are documented at https:\/\/github.com\/google\/cel-spec.
  --
  -- Example (Comparison):
  --
  -- > title: "Summary size limit"
  -- > description: "Determines if a summary is less than 100 chars"
  -- > expression: "document.summary.size() < 100"
  --
  -- Example (Equality):
  --
  -- > title: "Requestor is owner"
  -- > description: "Determines if requestor is the document owner"
  -- > expression: "document.owner == request.auth.claims.email"
  --
  -- Example (Logic):
  --
  -- > title: "Public documents"
  -- > description: "Determine whether the document should be publicly visible"
  -- > expression: "document.type != 'private' && document.type != 'internal'"
  --
  -- Example (Data Manipulation):
  --
  -- > title: "Notification string"
  -- > description: "Create a notification string with a timestamp."
  -- > expression: "'New message received at ' + string(document.create_time)"
  --
  -- The exact variables and functions that may be referenced within an expression are determined by the service that evaluates it. See the service documentation for additional information.
  --
  -- /See:/ 'newGoogleTypeExpr' smart constructor.
  data GoogleTypeExpr = GoogleTypeExpr
    { -- | Optional. Description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI.
      description :: (Core.Maybe Core.Text),
      -- | Textual representation of an expression in Common Expression Language syntax.
      expression :: (Core.Maybe Core.Text),
      -- | Optional. String indicating the location of the expression for error reporting, e.g. a file name and a position in the file.
      location :: (Core.Maybe Core.Text),
      -- | Optional. Title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression.
      title :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleTypeExpr' with the minimum fields required to make a request.
  newGoogleTypeExpr ::
    GoogleTypeExpr
  newGoogleTypeExpr =
    GoogleTypeExpr
      { description = Core.Nothing,
        expression = Core.Nothing,
        location = Core.Nothing,
        title = Core.Nothing
      }
  
  instance Core.FromJSON GoogleTypeExpr where
    parseJSON =
      Core.withObject
        "GoogleTypeExpr"
        ( \o ->
            GoogleTypeExpr
              Core.<$> (o Core..:? "description")
              Core.<*> (o Core..:? "expression")
              Core.<*> (o Core..:? "location")
              Core.<*> (o Core..:? "title")
        )
  
  instance Core.ToJSON GoogleTypeExpr where
    toJSON GoogleTypeExpr {..} =
      Core.object
        ( Core.catMaybes
            [ ("description" Core..=) Core.<$> description,
              ("expression" Core..=) Core.<$> expression,
              ("location" Core..=) Core.<$> location,
              ("title" Core..=) Core.<$> title
            ]
        )
  