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.CloudFunctions.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.CloudFunctions.Internal.Product
    ( -- * AbortFunctionUpgradeRequest
      AbortFunctionUpgradeRequest (..),
      newAbortFunctionUpgradeRequest,
  
      -- * AuditConfig
      AuditConfig (..),
      newAuditConfig,
  
      -- * AuditLogConfig
      AuditLogConfig (..),
      newAuditLogConfig,
  
      -- * AutomaticUpdatePolicy
      AutomaticUpdatePolicy (..),
      newAutomaticUpdatePolicy,
  
      -- * Binding
      Binding (..),
      newBinding,
  
      -- * BuildConfig
      BuildConfig (..),
      newBuildConfig,
  
      -- * BuildConfig_EnvironmentVariables
      BuildConfig_EnvironmentVariables (..),
      newBuildConfig_EnvironmentVariables,
  
      -- * CommitFunctionUpgradeRequest
      CommitFunctionUpgradeRequest (..),
      newCommitFunctionUpgradeRequest,
  
      -- * Date
      Date (..),
      newDate,
  
      -- * DetachFunctionRequest
      DetachFunctionRequest (..),
      newDetachFunctionRequest,
  
      -- * EventFilter
      EventFilter (..),
      newEventFilter,
  
      -- * EventTrigger
      EventTrigger (..),
      newEventTrigger,
  
      -- * Expr
      Expr (..),
      newExpr,
  
      -- * Function
      Function (..),
      newFunction,
  
      -- * Function_Labels
      Function_Labels (..),
      newFunction_Labels,
  
      -- * GenerateDownloadUrlRequest
      GenerateDownloadUrlRequest (..),
      newGenerateDownloadUrlRequest,
  
      -- * GenerateDownloadUrlResponse
      GenerateDownloadUrlResponse (..),
      newGenerateDownloadUrlResponse,
  
      -- * GenerateUploadUrlRequest
      GenerateUploadUrlRequest (..),
      newGenerateUploadUrlRequest,
  
      -- * GenerateUploadUrlResponse
      GenerateUploadUrlResponse (..),
      newGenerateUploadUrlResponse,
  
      -- * GoogleCloudFunctionsV2LocationMetadata
      GoogleCloudFunctionsV2LocationMetadata (..),
      newGoogleCloudFunctionsV2LocationMetadata,
  
      -- * GoogleCloudFunctionsV2OperationMetadata
      GoogleCloudFunctionsV2OperationMetadata (..),
      newGoogleCloudFunctionsV2OperationMetadata,
  
      -- * GoogleCloudFunctionsV2OperationMetadata_RequestResource
      GoogleCloudFunctionsV2OperationMetadata_RequestResource (..),
      newGoogleCloudFunctionsV2OperationMetadata_RequestResource,
  
      -- * GoogleCloudFunctionsV2Stage
      GoogleCloudFunctionsV2Stage (..),
      newGoogleCloudFunctionsV2Stage,
  
      -- * GoogleCloudFunctionsV2StateMessage
      GoogleCloudFunctionsV2StateMessage (..),
      newGoogleCloudFunctionsV2StateMessage,
  
      -- * ListFunctionsResponse
      ListFunctionsResponse (..),
      newListFunctionsResponse,
  
      -- * ListLocationsResponse
      ListLocationsResponse (..),
      newListLocationsResponse,
  
      -- * ListOperationsResponse
      ListOperationsResponse (..),
      newListOperationsResponse,
  
      -- * ListRuntimesResponse
      ListRuntimesResponse (..),
      newListRuntimesResponse,
  
      -- * Location
      Location (..),
      newLocation,
  
      -- * Location_Labels
      Location_Labels (..),
      newLocation_Labels,
  
      -- * Location_Metadata
      Location_Metadata (..),
      newLocation_Metadata,
  
      -- * OnDeployUpdatePolicy
      OnDeployUpdatePolicy (..),
      newOnDeployUpdatePolicy,
  
      -- * Operation
      Operation (..),
      newOperation,
  
      -- * Operation_Metadata
      Operation_Metadata (..),
      newOperation_Metadata,
  
      -- * Operation_Response
      Operation_Response (..),
      newOperation_Response,
  
      -- * OperationMetadataV1
      OperationMetadataV1 (..),
      newOperationMetadataV1,
  
      -- * OperationMetadataV1_Request
      OperationMetadataV1_Request (..),
      newOperationMetadataV1_Request,
  
      -- * Policy
      Policy (..),
      newPolicy,
  
      -- * RedirectFunctionUpgradeTrafficRequest
      RedirectFunctionUpgradeTrafficRequest (..),
      newRedirectFunctionUpgradeTrafficRequest,
  
      -- * RepoSource
      RepoSource (..),
      newRepoSource,
  
      -- * RollbackFunctionUpgradeTrafficRequest
      RollbackFunctionUpgradeTrafficRequest (..),
      newRollbackFunctionUpgradeTrafficRequest,
  
      -- * Runtime
      Runtime (..),
      newRuntime,
  
      -- * SecretEnvVar
      SecretEnvVar (..),
      newSecretEnvVar,
  
      -- * SecretVersion
      SecretVersion (..),
      newSecretVersion,
  
      -- * SecretVolume
      SecretVolume (..),
      newSecretVolume,
  
      -- * ServiceConfig
      ServiceConfig (..),
      newServiceConfig,
  
      -- * ServiceConfig_EnvironmentVariables
      ServiceConfig_EnvironmentVariables (..),
      newServiceConfig_EnvironmentVariables,
  
      -- * SetIamPolicyRequest
      SetIamPolicyRequest (..),
      newSetIamPolicyRequest,
  
      -- * SetupFunctionUpgradeConfigRequest
      SetupFunctionUpgradeConfigRequest (..),
      newSetupFunctionUpgradeConfigRequest,
  
      -- * Source
      Source (..),
      newSource,
  
      -- * SourceProvenance
      SourceProvenance (..),
      newSourceProvenance,
  
      -- * Status
      Status (..),
      newStatus,
  
      -- * Status_DetailsItem
      Status_DetailsItem (..),
      newStatus_DetailsItem,
  
      -- * StorageSource
      StorageSource (..),
      newStorageSource,
  
      -- * TestIamPermissionsRequest
      TestIamPermissionsRequest (..),
      newTestIamPermissionsRequest,
  
      -- * TestIamPermissionsResponse
      TestIamPermissionsResponse (..),
      newTestIamPermissionsResponse,
  
      -- * UpgradeInfo
      UpgradeInfo (..),
      newUpgradeInfo,
    )
  where
  
  import Gogol.CloudFunctions.Internal.Sum
  import Gogol.Prelude qualified as Core
  
  -- | Request for the @AbortFunctionUpgrade@ method.
  --
  -- /See:/ 'newAbortFunctionUpgradeRequest' smart constructor.
  data AbortFunctionUpgradeRequest = AbortFunctionUpgradeRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AbortFunctionUpgradeRequest' with the minimum fields required to make a request.
  newAbortFunctionUpgradeRequest ::
    AbortFunctionUpgradeRequest
  newAbortFunctionUpgradeRequest = AbortFunctionUpgradeRequest
  
  instance Core.FromJSON AbortFunctionUpgradeRequest where
    parseJSON =
      Core.withObject
        "AbortFunctionUpgradeRequest"
        (\o -> Core.pure AbortFunctionUpgradeRequest)
  
  instance Core.ToJSON AbortFunctionUpgradeRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | 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:/ 'newAuditConfig' smart constructor.
  data AuditConfig = AuditConfig
    { -- | The configuration for logging of each type of permission.
      auditLogConfigs :: (Core.Maybe [AuditLogConfig]),
      -- | 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 'AuditConfig' with the minimum fields required to make a request.
  newAuditConfig ::
    AuditConfig
  newAuditConfig =
    AuditConfig
      { auditLogConfigs = Core.Nothing,
        service = Core.Nothing
      }
  
  instance Core.FromJSON AuditConfig where
    parseJSON =
      Core.withObject
        "AuditConfig"
        ( \o ->
            AuditConfig
              Core.<$> (o Core..:? "auditLogConfigs")
              Core.<*> (o Core..:? "service")
        )
  
  instance Core.ToJSON AuditConfig where
    toJSON AuditConfig {..} =
      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:/ 'newAuditLogConfig' smart constructor.
  data AuditLogConfig = AuditLogConfig
    { -- | 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 AuditLogConfig_LogType)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AuditLogConfig' with the minimum fields required to make a request.
  newAuditLogConfig ::
    AuditLogConfig
  newAuditLogConfig =
    AuditLogConfig
      { exemptedMembers = Core.Nothing,
        logType = Core.Nothing
      }
  
  instance Core.FromJSON AuditLogConfig where
    parseJSON =
      Core.withObject
        "AuditLogConfig"
        ( \o ->
            AuditLogConfig
              Core.<$> (o Core..:? "exemptedMembers")
              Core.<*> (o Core..:? "logType")
        )
  
  instance Core.ToJSON AuditLogConfig where
    toJSON AuditLogConfig {..} =
      Core.object
        ( Core.catMaybes
            [ ("exemptedMembers" Core..=) Core.<$> exemptedMembers,
              ("logType" Core..=) Core.<$> logType
            ]
        )
  
  -- | Security patches are applied automatically to the runtime without requiring the function to be redeployed.
  --
  -- /See:/ 'newAutomaticUpdatePolicy' smart constructor.
  data AutomaticUpdatePolicy = AutomaticUpdatePolicy
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AutomaticUpdatePolicy' with the minimum fields required to make a request.
  newAutomaticUpdatePolicy ::
    AutomaticUpdatePolicy
  newAutomaticUpdatePolicy = AutomaticUpdatePolicy
  
  instance Core.FromJSON AutomaticUpdatePolicy where
    parseJSON =
      Core.withObject
        "AutomaticUpdatePolicy"
        (\o -> Core.pure AutomaticUpdatePolicy)
  
  instance Core.ToJSON AutomaticUpdatePolicy where
    toJSON = Core.const Core.emptyObject
  
  -- | Associates @members@, or principals, with a @role@.
  --
  -- /See:/ 'newBinding' smart constructor.
  data Binding = Binding
    { -- | The condition that is associated with this binding. If the condition evaluates to @true@, then this binding applies to the current request. If the condition evaluates to @false@, then this binding does not apply to the current request. However, a different role binding might grant the same role to one or more of the principals in this binding. To learn which resources support conditions in their IAM policies, see the <https://cloud.google.com/iam/help/conditions/resource-policies IAM documentation>.
      condition :: (Core.Maybe Expr),
      -- | Specifies the principals requesting access for a Google Cloud 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. Does not include identities that come from external identity providers (IdPs) through identity federation. * @user:{emailid}@: An email address that represents a specific Google account. For example, @alice\@example.com@ . * @serviceAccount:{emailid}@: An email address that represents a Google service account. For example, @my-other-app\@appspot.gserviceaccount.com@. * @serviceAccount:{projectid}.svc.id.goog[{namespace}\/{kubernetes-sa}]@: An identifier for a <https://cloud.google.com/kubernetes-engine/docs/how-to/kubernetes-service-accounts Kubernetes service account>. For example, @my-project.svc.id.goog[my-namespace\/my-kubernetes-sa]@. *
      -- @group:{emailid}@: An email address that represents a Google group. For example, @admins\@example.com@. * @domain:{domain}@: The G Suite domain (primary) that represents all the users of that domain. For example, @google.com@ or @example.com@. * @principal:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/{pool_id}\/subject\/{subject_attribute_value}@: A single identity in a workforce identity pool. * @principalSet:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/{pool_id}\/group\/{group_id}@: All workforce identities in a group. * @principalSet:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/{pool_id}\/attribute.{attribute_name}\/{attribute_value}@: All workforce identities with a specific attribute value. * @principalSet:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/{pool_id}\/*@: All identities in a workforce identity pool. *
      -- @principal:\/\/iam.googleapis.com\/projects\/{project_number}\/locations\/global\/workloadIdentityPools\/{pool_id}\/subject\/{subject_attribute_value}@: A single identity in a workload identity pool. * @principalSet:\/\/iam.googleapis.com\/projects\/{project_number}\/locations\/global\/workloadIdentityPools\/{pool_id}\/group\/{group_id}@: A workload identity pool group. * @principalSet:\/\/iam.googleapis.com\/projects\/{project_number}\/locations\/global\/workloadIdentityPools\/{pool_id}\/attribute.{attribute_name}\/{attribute_value}@: All identities in a workload identity pool with a certain attribute. * @principalSet:\/\/iam.googleapis.com\/projects\/{project_number}\/locations\/global\/workloadIdentityPools\/{pool_id}\/*@: All identities in a workload identity pool. * @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. * @deleted:principal:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/{pool_id}\/subject\/{subject_attribute_value}@: Deleted single identity in a workforce identity pool. For example,
      -- @deleted:principal:\/\/iam.googleapis.com\/locations\/global\/workforcePools\/my-pool-id\/subject\/my-subject-attribute-value@.
      members :: (Core.Maybe [Core.Text]),
      -- | Role that is assigned to the list of @members@, or principals. For example, @roles\/viewer@, @roles\/editor@, or @roles\/owner@. For an overview of the IAM roles and permissions, see the <https://cloud.google.com/iam/docs/roles-overview IAM documentation>. For a list of the available pre-defined roles, see <https://cloud.google.com/iam/docs/understanding-roles here>.
      role' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Binding' with the minimum fields required to make a request.
  newBinding ::
    Binding
  newBinding =
    Binding
      { condition = Core.Nothing,
        members = Core.Nothing,
        role' = Core.Nothing
      }
  
  instance Core.FromJSON Binding where
    parseJSON =
      Core.withObject
        "Binding"
        ( \o ->
            Binding
              Core.<$> (o Core..:? "condition")
              Core.<*> (o Core..:? "members")
              Core.<*> (o Core..:? "role")
        )
  
  instance Core.ToJSON Binding where
    toJSON Binding {..} =
      Core.object
        ( Core.catMaybes
            [ ("condition" Core..=) Core.<$> condition,
              ("members" Core..=) Core.<$> members,
              ("role" Core..=) Core.<$> role'
            ]
        )
  
  -- | Describes the Build step of the function that builds a container from the given source.
  --
  -- /See:/ 'newBuildConfig' smart constructor.
  data BuildConfig = BuildConfig
    { automaticUpdatePolicy :: (Core.Maybe AutomaticUpdatePolicy),
      -- | Output only. The Cloud Build name of the latest successful deployment of the function.
      build :: (Core.Maybe Core.Text),
      -- | Docker Registry to use for this deployment. This configuration is only applicable to 1st Gen functions, 2nd Gen functions can only use Artifact Registry. Deprecated: Container Registry option will no longer be available after March 2025: https:\/\/cloud.google.com\/artifact-registry\/docs\/transition\/transition-from-gcr Please use Artifact Registry instead, which is the default choice. If unspecified, it defaults to @ARTIFACT_REGISTRY@. If @docker_repository@ field is specified, this field should either be left unspecified or set to @ARTIFACT_REGISTRY@.
      dockerRegistry :: (Core.Maybe BuildConfig_DockerRegistry),
      -- | Repository in Artifact Registry to which the function docker image will be pushed after it is built by Cloud Build. If specified by user, it is created and managed by user with a customer managed encryption key. Otherwise, GCF will create and use a repository named \'gcf-artifacts\' for every deployed region. It must match the pattern @projects\/{project}\/locations\/{location}\/repositories\/{repository}@. Repository format must be \'DOCKER\'.
      dockerRepository :: (Core.Maybe Core.Text),
      -- | The name of the function (as defined in source code) that will be executed. Defaults to the resource name suffix, if not specified. For backward compatibility, if function with given name is not found, then the system will try to use function named \"function\". For Node.js this is name of a function exported by the module specified in @source_location@.
      entryPoint :: (Core.Maybe Core.Text),
      -- | User-provided build-time environment variables for the function
      environmentVariables :: (Core.Maybe BuildConfig_EnvironmentVariables),
      onDeployUpdatePolicy :: (Core.Maybe OnDeployUpdatePolicy),
      -- | The runtime in which to run the function. Required when deploying a new function, optional when updating an existing function. For a complete list of possible choices, see the <https://cloud.google.com/sdk/gcloud/reference/functions/deploy#--runtime gcloud command reference>.
      runtime :: (Core.Maybe Core.Text),
      -- | Service account to be used for building the container. The format of this field is @projects\/{projectId}\/serviceAccounts\/{serviceAccountEmail}@.
      serviceAccount :: (Core.Maybe Core.Text),
      -- | The location of the function source code.
      source :: (Core.Maybe Source),
      -- | Output only. A permanent fixed identifier for source.
      sourceProvenance :: (Core.Maybe SourceProvenance),
      -- | An identifier for Firebase function sources. Disclaimer: This field is only supported for Firebase function deployments.
      sourceToken :: (Core.Maybe Core.Text),
      -- | Name of the Cloud Build Custom Worker Pool that should be used to build the function. The format of this field is @projects\/{project}\/locations\/{region}\/workerPools\/{workerPool}@ where {project} and {region} are the project id and region respectively where the worker pool is defined and {workerPool} is the short name of the worker pool. If the project id is not the same as the function, then the Cloud Functions Service Agent (service-\@gcf-admin-robot.iam.gserviceaccount.com) must be granted the role Cloud Build Custom Workers Builder (roles\/cloudbuild.customworkers.builder) in the project.
      workerPool :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'BuildConfig' with the minimum fields required to make a request.
  newBuildConfig ::
    BuildConfig
  newBuildConfig =
    BuildConfig
      { automaticUpdatePolicy = Core.Nothing,
        build = Core.Nothing,
        dockerRegistry = Core.Nothing,
        dockerRepository = Core.Nothing,
        entryPoint = Core.Nothing,
        environmentVariables = Core.Nothing,
        onDeployUpdatePolicy = Core.Nothing,
        runtime = Core.Nothing,
        serviceAccount = Core.Nothing,
        source = Core.Nothing,
        sourceProvenance = Core.Nothing,
        sourceToken = Core.Nothing,
        workerPool = Core.Nothing
      }
  
  instance Core.FromJSON BuildConfig where
    parseJSON =
      Core.withObject
        "BuildConfig"
        ( \o ->
            BuildConfig
              Core.<$> (o Core..:? "automaticUpdatePolicy")
              Core.<*> (o Core..:? "build")
              Core.<*> (o Core..:? "dockerRegistry")
              Core.<*> (o Core..:? "dockerRepository")
              Core.<*> (o Core..:? "entryPoint")
              Core.<*> (o Core..:? "environmentVariables")
              Core.<*> (o Core..:? "onDeployUpdatePolicy")
              Core.<*> (o Core..:? "runtime")
              Core.<*> (o Core..:? "serviceAccount")
              Core.<*> (o Core..:? "source")
              Core.<*> (o Core..:? "sourceProvenance")
              Core.<*> (o Core..:? "sourceToken")
              Core.<*> (o Core..:? "workerPool")
        )
  
  instance Core.ToJSON BuildConfig where
    toJSON BuildConfig {..} =
      Core.object
        ( Core.catMaybes
            [ ("automaticUpdatePolicy" Core..=) Core.<$> automaticUpdatePolicy,
              ("build" Core..=) Core.<$> build,
              ("dockerRegistry" Core..=) Core.<$> dockerRegistry,
              ("dockerRepository" Core..=) Core.<$> dockerRepository,
              ("entryPoint" Core..=) Core.<$> entryPoint,
              ("environmentVariables" Core..=) Core.<$> environmentVariables,
              ("onDeployUpdatePolicy" Core..=) Core.<$> onDeployUpdatePolicy,
              ("runtime" Core..=) Core.<$> runtime,
              ("serviceAccount" Core..=) Core.<$> serviceAccount,
              ("source" Core..=) Core.<$> source,
              ("sourceProvenance" Core..=) Core.<$> sourceProvenance,
              ("sourceToken" Core..=) Core.<$> sourceToken,
              ("workerPool" Core..=) Core.<$> workerPool
            ]
        )
  
  -- | User-provided build-time environment variables for the function
  --
  -- /See:/ 'newBuildConfig_EnvironmentVariables' smart constructor.
  newtype BuildConfig_EnvironmentVariables = BuildConfig_EnvironmentVariables
    { additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'BuildConfig_EnvironmentVariables' with the minimum fields required to make a request.
  newBuildConfig_EnvironmentVariables ::
    -- |  See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    BuildConfig_EnvironmentVariables
  newBuildConfig_EnvironmentVariables additional =
    BuildConfig_EnvironmentVariables {additional = additional}
  
  instance Core.FromJSON BuildConfig_EnvironmentVariables where
    parseJSON =
      Core.withObject
        "BuildConfig_EnvironmentVariables"
        ( \o ->
            BuildConfig_EnvironmentVariables Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON BuildConfig_EnvironmentVariables where
    toJSON BuildConfig_EnvironmentVariables {..} =
      Core.toJSON additional
  
  -- | Request for the @CommitFunctionUpgrade@ method.
  --
  -- /See:/ 'newCommitFunctionUpgradeRequest' smart constructor.
  data CommitFunctionUpgradeRequest = CommitFunctionUpgradeRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CommitFunctionUpgradeRequest' with the minimum fields required to make a request.
  newCommitFunctionUpgradeRequest ::
    CommitFunctionUpgradeRequest
  newCommitFunctionUpgradeRequest = CommitFunctionUpgradeRequest
  
  instance Core.FromJSON CommitFunctionUpgradeRequest where
    parseJSON =
      Core.withObject
        "CommitFunctionUpgradeRequest"
        (\o -> Core.pure CommitFunctionUpgradeRequest)
  
  instance Core.ToJSON CommitFunctionUpgradeRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values. * A month and day, with a zero year (for example, an anniversary). * A year on its own, with a zero month and a zero day. * A year and month, with a zero day (for example, a credit card expiration date). Related types: * google.type.TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
  --
  -- /See:/ 'newDate' smart constructor.
  data Date = Date
    { -- | Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn\'t significant.
      day :: (Core.Maybe Core.Int32),
      -- | Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
      month :: (Core.Maybe Core.Int32),
      -- | Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
      year :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Date' with the minimum fields required to make a request.
  newDate ::
    Date
  newDate =
    Date
      { day = Core.Nothing,
        month = Core.Nothing,
        year = Core.Nothing
      }
  
  instance Core.FromJSON Date where
    parseJSON =
      Core.withObject
        "Date"
        ( \o ->
            Date
              Core.<$> (o Core..:? "day")
              Core.<*> (o Core..:? "month")
              Core.<*> (o Core..:? "year")
        )
  
  instance Core.ToJSON Date where
    toJSON Date {..} =
      Core.object
        ( Core.catMaybes
            [ ("day" Core..=) Core.<$> day,
              ("month" Core..=) Core.<$> month,
              ("year" Core..=) Core.<$> year
            ]
        )
  
  -- | Request for the @DetachFunction@ method.
  --
  -- /See:/ 'newDetachFunctionRequest' smart constructor.
  data DetachFunctionRequest = DetachFunctionRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'DetachFunctionRequest' with the minimum fields required to make a request.
  newDetachFunctionRequest ::
    DetachFunctionRequest
  newDetachFunctionRequest = DetachFunctionRequest
  
  instance Core.FromJSON DetachFunctionRequest where
    parseJSON =
      Core.withObject
        "DetachFunctionRequest"
        (\o -> Core.pure DetachFunctionRequest)
  
  instance Core.ToJSON DetachFunctionRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | Filters events based on exact matches on the CloudEvents attributes.
  --
  -- /See:/ 'newEventFilter' smart constructor.
  data EventFilter = EventFilter
    { -- | Required. The name of a CloudEvents attribute.
      attribute :: (Core.Maybe Core.Text),
      -- | Optional. The operator used for matching the events with the value of the filter. If not specified, only events that have an exact key-value pair specified in the filter are matched. The only allowed value is @match-path-pattern@.
      operator :: (Core.Maybe Core.Text),
      -- | Required. The value for the attribute.
      value :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EventFilter' with the minimum fields required to make a request.
  newEventFilter ::
    EventFilter
  newEventFilter =
    EventFilter
      { attribute = Core.Nothing,
        operator = Core.Nothing,
        value = Core.Nothing
      }
  
  instance Core.FromJSON EventFilter where
    parseJSON =
      Core.withObject
        "EventFilter"
        ( \o ->
            EventFilter
              Core.<$> (o Core..:? "attribute")
              Core.<*> (o Core..:? "operator")
              Core.<*> (o Core..:? "value")
        )
  
  instance Core.ToJSON EventFilter where
    toJSON EventFilter {..} =
      Core.object
        ( Core.catMaybes
            [ ("attribute" Core..=) Core.<$> attribute,
              ("operator" Core..=) Core.<$> operator,
              ("value" Core..=) Core.<$> value
            ]
        )
  
  -- | Describes EventTrigger, used to request events to be sent from another service.
  --
  -- /See:/ 'newEventTrigger' smart constructor.
  data EventTrigger = EventTrigger
    { -- | Optional. The name of the channel associated with the trigger in @projects\/{project}\/locations\/{location}\/channels\/{channel}@ format. You must provide a channel to receive events from Eventarc SaaS partners.
      channel :: (Core.Maybe Core.Text),
      -- | Criteria used to filter events.
      eventFilters :: (Core.Maybe [EventFilter]),
      -- | Required. The type of event to observe. For example: @google.cloud.audit.log.v1.written@ or @google.cloud.pubsub.topic.v1.messagePublished@.
      eventType :: (Core.Maybe Core.Text),
      -- | Optional. The name of a Pub\/Sub topic in the same project that will be used as the transport topic for the event delivery. Format: @projects\/{project}\/topics\/{topic}@. This is only valid for events of type @google.cloud.pubsub.topic.v1.messagePublished@. The topic provided here will not be deleted at function deletion.
      pubsubTopic :: (Core.Maybe Core.Text),
      -- | Optional. If unset, then defaults to ignoring failures (i.e. not retrying them).
      retryPolicy :: (Core.Maybe EventTrigger_RetryPolicy),
      -- | Optional. The hostname of the service that 1st Gen function should be observed. If no string is provided, the default service implementing the API will be used. For example, @storage.googleapis.com@ is the default for all event types in the @google.storage@ namespace. The field is only applicable to 1st Gen functions.
      service :: (Core.Maybe Core.Text),
      -- | Optional. The email of the trigger\'s service account. The service account must have permission to invoke Cloud Run services, the permission is @run.routes.invoke@. If empty, defaults to the Compute Engine default service account: @{project_number}-compute\@developer.gserviceaccount.com@.
      serviceAccountEmail :: (Core.Maybe Core.Text),
      -- | Output only. The resource name of the Eventarc trigger. The format of this field is @projects\/{project}\/locations\/{region}\/triggers\/{trigger}@.
      trigger :: (Core.Maybe Core.Text),
      -- | The region that the trigger will be in. The trigger will only receive events originating in this region. It can be the same region as the function, a different region or multi-region, or the global region. If not provided, defaults to the same region as the function.
      triggerRegion :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EventTrigger' with the minimum fields required to make a request.
  newEventTrigger ::
    EventTrigger
  newEventTrigger =
    EventTrigger
      { channel = Core.Nothing,
        eventFilters = Core.Nothing,
        eventType = Core.Nothing,
        pubsubTopic = Core.Nothing,
        retryPolicy = Core.Nothing,
        service = Core.Nothing,
        serviceAccountEmail = Core.Nothing,
        trigger = Core.Nothing,
        triggerRegion = Core.Nothing
      }
  
  instance Core.FromJSON EventTrigger where
    parseJSON =
      Core.withObject
        "EventTrigger"
        ( \o ->
            EventTrigger
              Core.<$> (o Core..:? "channel")
              Core.<*> (o Core..:? "eventFilters")
              Core.<*> (o Core..:? "eventType")
              Core.<*> (o Core..:? "pubsubTopic")
              Core.<*> (o Core..:? "retryPolicy")
              Core.<*> (o Core..:? "service")
              Core.<*> (o Core..:? "serviceAccountEmail")
              Core.<*> (o Core..:? "trigger")
              Core.<*> (o Core..:? "triggerRegion")
        )
  
  instance Core.ToJSON EventTrigger where
    toJSON EventTrigger {..} =
      Core.object
        ( Core.catMaybes
            [ ("channel" Core..=) Core.<$> channel,
              ("eventFilters" Core..=) Core.<$> eventFilters,
              ("eventType" Core..=) Core.<$> eventType,
              ("pubsubTopic" Core..=) Core.<$> pubsubTopic,
              ("retryPolicy" Core..=) Core.<$> retryPolicy,
              ("service" Core..=) Core.<$> service,
              ("serviceAccountEmail" Core..=) Core.<$> serviceAccountEmail,
              ("trigger" Core..=) Core.<$> trigger,
              ("triggerRegion" Core..=) Core.<$> triggerRegion
            ]
        )
  
  -- | 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:/ 'newExpr' smart constructor.
  data Expr = Expr
    { -- | 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 'Expr' with the minimum fields required to make a request.
  newExpr ::
    Expr
  newExpr =
    Expr
      { description = Core.Nothing,
        expression = Core.Nothing,
        location = Core.Nothing,
        title = Core.Nothing
      }
  
  instance Core.FromJSON Expr where
    parseJSON =
      Core.withObject
        "Expr"
        ( \o ->
            Expr
              Core.<$> (o Core..:? "description")
              Core.<*> (o Core..:? "expression")
              Core.<*> (o Core..:? "location")
              Core.<*> (o Core..:? "title")
        )
  
  instance Core.ToJSON Expr where
    toJSON Expr {..} =
      Core.object
        ( Core.catMaybes
            [ ("description" Core..=) Core.<$> description,
              ("expression" Core..=) Core.<$> expression,
              ("location" Core..=) Core.<$> location,
              ("title" Core..=) Core.<$> title
            ]
        )
  
  -- | Describes a Cloud Function that contains user computation executed in response to an event. It encapsulates function and trigger configurations.
  --
  -- /See:/ 'newFunction' smart constructor.
  data Function = Function
    { -- | Describes the Build step of the function that builds a container from the given source.
      buildConfig :: (Core.Maybe BuildConfig),
      -- | Output only. The create timestamp of a Cloud Function. This is only applicable to 2nd Gen functions.
      createTime :: (Core.Maybe Core.DateTime),
      -- | User-provided description of a function.
      description :: (Core.Maybe Core.Text),
      -- | Describe whether the function is 1st Gen or 2nd Gen.
      environment :: (Core.Maybe Function_Environment),
      -- | An Eventarc trigger managed by Google Cloud Functions that fires events in response to a condition in another service.
      eventTrigger :: (Core.Maybe EventTrigger),
      -- | Resource name of a KMS crypto key (managed by the user) used to encrypt\/decrypt function resources. It must match the pattern @projects\/{project}\/locations\/{location}\/keyRings\/{key_ring}\/cryptoKeys\/{crypto_key}@.
      kmsKeyName :: (Core.Maybe Core.Text),
      -- | Labels associated with this Cloud Function.
      labels :: (Core.Maybe Function_Labels),
      -- | A user-defined name of the function. Function names must be unique globally and match pattern @projects\/*\/locations\/*\/functions\/*@
      name :: (Core.Maybe Core.Text),
      -- | Output only. Reserved for future use.
      satisfiesPzi :: (Core.Maybe Core.Bool),
      -- | Output only. Reserved for future use.
      satisfiesPzs :: (Core.Maybe Core.Bool),
      -- | Describes the Service being deployed. Currently deploys services to Cloud Run (fully managed).
      serviceConfig :: (Core.Maybe ServiceConfig),
      -- | Output only. State of the function.
      state :: (Core.Maybe Function_State),
      -- | Output only. State Messages for this Cloud Function.
      stateMessages :: (Core.Maybe [GoogleCloudFunctionsV2StateMessage]),
      -- | Output only. The last update timestamp of a Cloud Function.
      updateTime :: (Core.Maybe Core.DateTime),
      -- | Output only. UpgradeInfo for this Cloud Function
      upgradeInfo :: (Core.Maybe UpgradeInfo),
      -- | Output only. The deployed url for the function.
      url :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Function' with the minimum fields required to make a request.
  newFunction ::
    Function
  newFunction =
    Function
      { buildConfig = Core.Nothing,
        createTime = Core.Nothing,
        description = Core.Nothing,
        environment = Core.Nothing,
        eventTrigger = Core.Nothing,
        kmsKeyName = Core.Nothing,
        labels = Core.Nothing,
        name = Core.Nothing,
        satisfiesPzi = Core.Nothing,
        satisfiesPzs = Core.Nothing,
        serviceConfig = Core.Nothing,
        state = Core.Nothing,
        stateMessages = Core.Nothing,
        updateTime = Core.Nothing,
        upgradeInfo = Core.Nothing,
        url = Core.Nothing
      }
  
  instance Core.FromJSON Function where
    parseJSON =
      Core.withObject
        "Function"
        ( \o ->
            Function
              Core.<$> (o Core..:? "buildConfig")
              Core.<*> (o Core..:? "createTime")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "environment")
              Core.<*> (o Core..:? "eventTrigger")
              Core.<*> (o Core..:? "kmsKeyName")
              Core.<*> (o Core..:? "labels")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "satisfiesPzi")
              Core.<*> (o Core..:? "satisfiesPzs")
              Core.<*> (o Core..:? "serviceConfig")
              Core.<*> (o Core..:? "state")
              Core.<*> (o Core..:? "stateMessages")
              Core.<*> (o Core..:? "updateTime")
              Core.<*> (o Core..:? "upgradeInfo")
              Core.<*> (o Core..:? "url")
        )
  
  instance Core.ToJSON Function where
    toJSON Function {..} =
      Core.object
        ( Core.catMaybes
            [ ("buildConfig" Core..=) Core.<$> buildConfig,
              ("createTime" Core..=) Core.<$> createTime,
              ("description" Core..=) Core.<$> description,
              ("environment" Core..=) Core.<$> environment,
              ("eventTrigger" Core..=) Core.<$> eventTrigger,
              ("kmsKeyName" Core..=) Core.<$> kmsKeyName,
              ("labels" Core..=) Core.<$> labels,
              ("name" Core..=) Core.<$> name,
              ("satisfiesPzi" Core..=) Core.<$> satisfiesPzi,
              ("satisfiesPzs" Core..=) Core.<$> satisfiesPzs,
              ("serviceConfig" Core..=) Core.<$> serviceConfig,
              ("state" Core..=) Core.<$> state,
              ("stateMessages" Core..=) Core.<$> stateMessages,
              ("updateTime" Core..=) Core.<$> updateTime,
              ("upgradeInfo" Core..=) Core.<$> upgradeInfo,
              ("url" Core..=) Core.<$> url
            ]
        )
  
  -- | Labels associated with this Cloud Function.
  --
  -- /See:/ 'newFunction_Labels' smart constructor.
  newtype Function_Labels = Function_Labels
    { additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Function_Labels' with the minimum fields required to make a request.
  newFunction_Labels ::
    -- |  See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    Function_Labels
  newFunction_Labels additional =
    Function_Labels {additional = additional}
  
  instance Core.FromJSON Function_Labels where
    parseJSON =
      Core.withObject
        "Function_Labels"
        (\o -> Function_Labels Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Function_Labels where
    toJSON Function_Labels {..} = Core.toJSON additional
  
  -- | Request of @GenerateDownloadUrl@ method.
  --
  -- /See:/ 'newGenerateDownloadUrlRequest' smart constructor.
  data GenerateDownloadUrlRequest = GenerateDownloadUrlRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GenerateDownloadUrlRequest' with the minimum fields required to make a request.
  newGenerateDownloadUrlRequest ::
    GenerateDownloadUrlRequest
  newGenerateDownloadUrlRequest = GenerateDownloadUrlRequest
  
  instance Core.FromJSON GenerateDownloadUrlRequest where
    parseJSON =
      Core.withObject
        "GenerateDownloadUrlRequest"
        (\o -> Core.pure GenerateDownloadUrlRequest)
  
  instance Core.ToJSON GenerateDownloadUrlRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | Response of @GenerateDownloadUrl@ method.
  --
  -- /See:/ 'newGenerateDownloadUrlResponse' smart constructor.
  newtype GenerateDownloadUrlResponse = GenerateDownloadUrlResponse
    { -- | The generated Google Cloud Storage signed URL that should be used for function source code download.
      downloadUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GenerateDownloadUrlResponse' with the minimum fields required to make a request.
  newGenerateDownloadUrlResponse ::
    GenerateDownloadUrlResponse
  newGenerateDownloadUrlResponse =
    GenerateDownloadUrlResponse {downloadUrl = Core.Nothing}
  
  instance Core.FromJSON GenerateDownloadUrlResponse where
    parseJSON =
      Core.withObject
        "GenerateDownloadUrlResponse"
        ( \o ->
            GenerateDownloadUrlResponse Core.<$> (o Core..:? "downloadUrl")
        )
  
  instance Core.ToJSON GenerateDownloadUrlResponse where
    toJSON GenerateDownloadUrlResponse {..} =
      Core.object
        (Core.catMaybes [("downloadUrl" Core..=) Core.<$> downloadUrl])
  
  -- | Request of @GenerateSourceUploadUrl@ method.
  --
  -- /See:/ 'newGenerateUploadUrlRequest' smart constructor.
  data GenerateUploadUrlRequest = GenerateUploadUrlRequest
    { -- | The function environment the generated upload url will be used for. The upload url for 2nd Gen functions can also be used for 1st gen functions, but not vice versa. If not specified, 2nd generation-style upload URLs are generated.
      environment :: (Core.Maybe GenerateUploadUrlRequest_Environment),
      -- | Resource name of a KMS crypto key (managed by the user) used to encrypt\/decrypt function source code objects in intermediate Cloud Storage buckets. When you generate an upload url and upload your source code, it gets copied to an intermediate Cloud Storage bucket. The source code is then copied to a versioned directory in the sources bucket in the consumer project during the function deployment. It must match the pattern @projects\/{project}\/locations\/{location}\/keyRings\/{key_ring}\/cryptoKeys\/{crypto_key}@. The Google Cloud Functions service account (service-{project_number}\@gcf-admin-robot.iam.gserviceaccount.com) must be granted the role \'Cloud KMS CryptoKey Encrypter\/Decrypter (roles\/cloudkms.cryptoKeyEncrypterDecrypter)\' on the Key\/KeyRing\/Project\/Organization (least access preferred).
      kmsKeyName :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GenerateUploadUrlRequest' with the minimum fields required to make a request.
  newGenerateUploadUrlRequest ::
    GenerateUploadUrlRequest
  newGenerateUploadUrlRequest =
    GenerateUploadUrlRequest
      { environment = Core.Nothing,
        kmsKeyName = Core.Nothing
      }
  
  instance Core.FromJSON GenerateUploadUrlRequest where
    parseJSON =
      Core.withObject
        "GenerateUploadUrlRequest"
        ( \o ->
            GenerateUploadUrlRequest
              Core.<$> (o Core..:? "environment")
              Core.<*> (o Core..:? "kmsKeyName")
        )
  
  instance Core.ToJSON GenerateUploadUrlRequest where
    toJSON GenerateUploadUrlRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("environment" Core..=) Core.<$> environment,
              ("kmsKeyName" Core..=) Core.<$> kmsKeyName
            ]
        )
  
  -- | Response of @GenerateSourceUploadUrl@ method.
  --
  -- /See:/ 'newGenerateUploadUrlResponse' smart constructor.
  data GenerateUploadUrlResponse = GenerateUploadUrlResponse
    { -- | The location of the source code in the upload bucket. Once the archive is uploaded using the @upload_url@ use this field to set the @function.build_config.source.storage_source@ during CreateFunction and UpdateFunction. Generation defaults to 0, as Cloud Storage provides a new generation only upon uploading a new object or version of an object.
      storageSource :: (Core.Maybe StorageSource),
      -- | The generated Google Cloud Storage signed URL that should be used for a function source code upload. The uploaded file should be a zip archive which contains a function.
      uploadUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GenerateUploadUrlResponse' with the minimum fields required to make a request.
  newGenerateUploadUrlResponse ::
    GenerateUploadUrlResponse
  newGenerateUploadUrlResponse =
    GenerateUploadUrlResponse
      { storageSource = Core.Nothing,
        uploadUrl = Core.Nothing
      }
  
  instance Core.FromJSON GenerateUploadUrlResponse where
    parseJSON =
      Core.withObject
        "GenerateUploadUrlResponse"
        ( \o ->
            GenerateUploadUrlResponse
              Core.<$> (o Core..:? "storageSource")
              Core.<*> (o Core..:? "uploadUrl")
        )
  
  instance Core.ToJSON GenerateUploadUrlResponse where
    toJSON GenerateUploadUrlResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("storageSource" Core..=) Core.<$> storageSource,
              ("uploadUrl" Core..=) Core.<$> uploadUrl
            ]
        )
  
  -- | Extra GCF specific location information.
  --
  -- /See:/ 'newGoogleCloudFunctionsV2LocationMetadata' smart constructor.
  newtype GoogleCloudFunctionsV2LocationMetadata = GoogleCloudFunctionsV2LocationMetadata
    { -- | The Cloud Function environments this location supports.
      environments ::
        ( Core.Maybe
            [GoogleCloudFunctionsV2LocationMetadata_EnvironmentsItem]
        )
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudFunctionsV2LocationMetadata' with the minimum fields required to make a request.
  newGoogleCloudFunctionsV2LocationMetadata ::
    GoogleCloudFunctionsV2LocationMetadata
  newGoogleCloudFunctionsV2LocationMetadata =
    GoogleCloudFunctionsV2LocationMetadata
      { environments =
          Core.Nothing
      }
  
  instance Core.FromJSON GoogleCloudFunctionsV2LocationMetadata where
    parseJSON =
      Core.withObject
        "GoogleCloudFunctionsV2LocationMetadata"
        ( \o ->
            GoogleCloudFunctionsV2LocationMetadata
              Core.<$> (o Core..:? "environments")
        )
  
  instance Core.ToJSON GoogleCloudFunctionsV2LocationMetadata where
    toJSON GoogleCloudFunctionsV2LocationMetadata {..} =
      Core.object
        (Core.catMaybes [("environments" Core..=) Core.<$> environments])
  
  -- | Represents the metadata of the long-running operation.
  --
  -- /See:/ 'newGoogleCloudFunctionsV2OperationMetadata' smart constructor.
  data GoogleCloudFunctionsV2OperationMetadata = GoogleCloudFunctionsV2OperationMetadata
    { -- | API version used to start the operation.
      apiVersion :: (Core.Maybe Core.Text),
      -- | The build name of the function for create and update operations.
      buildName :: (Core.Maybe Core.Text),
      -- | Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have google.longrunning.Operation.error value with a google.rpc.Status.code of 1, corresponding to @Code.CANCELLED@.
      cancelRequested :: (Core.Maybe Core.Bool),
      -- | The time the operation was created.
      createTime :: (Core.Maybe Core.DateTime),
      -- | Output only. Whether a custom IAM role binding was detected during the upgrade.
      customIamRoleDetected :: (Core.Maybe Core.Bool),
      -- | The time the operation finished running.
      endTime :: (Core.Maybe Core.DateTime),
      -- | The operation type.
      operationType :: (Core.Maybe GoogleCloudFunctionsV2OperationMetadata_OperationType),
      -- | The original request that started the operation.
      requestResource ::
        ( Core.Maybe
            GoogleCloudFunctionsV2OperationMetadata_RequestResource
        ),
      -- | An identifier for Firebase function sources. Disclaimer: This field is only supported for Firebase function deployments.
      sourceToken :: (Core.Maybe Core.Text),
      -- | Mechanism for reporting in-progress stages
      stages :: (Core.Maybe [GoogleCloudFunctionsV2Stage]),
      -- | Human-readable status of the operation, if any.
      statusDetail :: (Core.Maybe Core.Text),
      -- | Server-defined resource path for the target of the operation.
      target :: (Core.Maybe Core.Text),
      -- | Name of the verb executed by the operation.
      verb :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudFunctionsV2OperationMetadata' with the minimum fields required to make a request.
  newGoogleCloudFunctionsV2OperationMetadata ::
    GoogleCloudFunctionsV2OperationMetadata
  newGoogleCloudFunctionsV2OperationMetadata =
    GoogleCloudFunctionsV2OperationMetadata
      { apiVersion =
          Core.Nothing,
        buildName = Core.Nothing,
        cancelRequested = Core.Nothing,
        createTime = Core.Nothing,
        customIamRoleDetected = Core.Nothing,
        endTime = Core.Nothing,
        operationType = Core.Nothing,
        requestResource = Core.Nothing,
        sourceToken = Core.Nothing,
        stages = Core.Nothing,
        statusDetail = Core.Nothing,
        target = Core.Nothing,
        verb = Core.Nothing
      }
  
  instance Core.FromJSON GoogleCloudFunctionsV2OperationMetadata where
    parseJSON =
      Core.withObject
        "GoogleCloudFunctionsV2OperationMetadata"
        ( \o ->
            GoogleCloudFunctionsV2OperationMetadata
              Core.<$> (o Core..:? "apiVersion")
              Core.<*> (o Core..:? "buildName")
              Core.<*> (o Core..:? "cancelRequested")
              Core.<*> (o Core..:? "createTime")
              Core.<*> (o Core..:? "customIamRoleDetected")
              Core.<*> (o Core..:? "endTime")
              Core.<*> (o Core..:? "operationType")
              Core.<*> (o Core..:? "requestResource")
              Core.<*> (o Core..:? "sourceToken")
              Core.<*> (o Core..:? "stages")
              Core.<*> (o Core..:? "statusDetail")
              Core.<*> (o Core..:? "target")
              Core.<*> (o Core..:? "verb")
        )
  
  instance Core.ToJSON GoogleCloudFunctionsV2OperationMetadata where
    toJSON GoogleCloudFunctionsV2OperationMetadata {..} =
      Core.object
        ( Core.catMaybes
            [ ("apiVersion" Core..=) Core.<$> apiVersion,
              ("buildName" Core..=) Core.<$> buildName,
              ("cancelRequested" Core..=) Core.<$> cancelRequested,
              ("createTime" Core..=) Core.<$> createTime,
              ("customIamRoleDetected" Core..=) Core.<$> customIamRoleDetected,
              ("endTime" Core..=) Core.<$> endTime,
              ("operationType" Core..=) Core.<$> operationType,
              ("requestResource" Core..=) Core.<$> requestResource,
              ("sourceToken" Core..=) Core.<$> sourceToken,
              ("stages" Core..=) Core.<$> stages,
              ("statusDetail" Core..=) Core.<$> statusDetail,
              ("target" Core..=) Core.<$> target,
              ("verb" Core..=) Core.<$> verb
            ]
        )
  
  -- | The original request that started the operation.
  --
  -- /See:/ 'newGoogleCloudFunctionsV2OperationMetadata_RequestResource' smart constructor.
  newtype GoogleCloudFunctionsV2OperationMetadata_RequestResource = GoogleCloudFunctionsV2OperationMetadata_RequestResource
    { -- | 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 'GoogleCloudFunctionsV2OperationMetadata_RequestResource' with the minimum fields required to make a request.
  newGoogleCloudFunctionsV2OperationMetadata_RequestResource ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    GoogleCloudFunctionsV2OperationMetadata_RequestResource
  newGoogleCloudFunctionsV2OperationMetadata_RequestResource
    additional =
      GoogleCloudFunctionsV2OperationMetadata_RequestResource
        { additional =
            additional
        }
  
  instance
    Core.FromJSON
      GoogleCloudFunctionsV2OperationMetadata_RequestResource
    where
    parseJSON =
      Core.withObject
        "GoogleCloudFunctionsV2OperationMetadata_RequestResource"
        ( \o ->
            GoogleCloudFunctionsV2OperationMetadata_RequestResource
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance
    Core.ToJSON
      GoogleCloudFunctionsV2OperationMetadata_RequestResource
    where
    toJSON GoogleCloudFunctionsV2OperationMetadata_RequestResource {..} =
      Core.toJSON additional
  
  -- | Each Stage of the deployment process
  --
  -- /See:/ 'newGoogleCloudFunctionsV2Stage' smart constructor.
  data GoogleCloudFunctionsV2Stage = GoogleCloudFunctionsV2Stage
    { -- | Message describing the Stage
      message :: (Core.Maybe Core.Text),
      -- | Name of the Stage. This will be unique for each Stage.
      name :: (Core.Maybe GoogleCloudFunctionsV2Stage_Name),
      -- | Resource of the Stage
      resource :: (Core.Maybe Core.Text),
      -- | Link to the current Stage resource
      resourceUri :: (Core.Maybe Core.Text),
      -- | Current state of the Stage
      state :: (Core.Maybe GoogleCloudFunctionsV2Stage_State),
      -- | State messages from the current Stage.
      stateMessages :: (Core.Maybe [GoogleCloudFunctionsV2StateMessage])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudFunctionsV2Stage' with the minimum fields required to make a request.
  newGoogleCloudFunctionsV2Stage ::
    GoogleCloudFunctionsV2Stage
  newGoogleCloudFunctionsV2Stage =
    GoogleCloudFunctionsV2Stage
      { message = Core.Nothing,
        name = Core.Nothing,
        resource = Core.Nothing,
        resourceUri = Core.Nothing,
        state = Core.Nothing,
        stateMessages = Core.Nothing
      }
  
  instance Core.FromJSON GoogleCloudFunctionsV2Stage where
    parseJSON =
      Core.withObject
        "GoogleCloudFunctionsV2Stage"
        ( \o ->
            GoogleCloudFunctionsV2Stage
              Core.<$> (o Core..:? "message")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "resource")
              Core.<*> (o Core..:? "resourceUri")
              Core.<*> (o Core..:? "state")
              Core.<*> (o Core..:? "stateMessages")
        )
  
  instance Core.ToJSON GoogleCloudFunctionsV2Stage where
    toJSON GoogleCloudFunctionsV2Stage {..} =
      Core.object
        ( Core.catMaybes
            [ ("message" Core..=) Core.<$> message,
              ("name" Core..=) Core.<$> name,
              ("resource" Core..=) Core.<$> resource,
              ("resourceUri" Core..=) Core.<$> resourceUri,
              ("state" Core..=) Core.<$> state,
              ("stateMessages" Core..=) Core.<$> stateMessages
            ]
        )
  
  -- | Informational messages about the state of the Cloud Function or Operation.
  --
  -- /See:/ 'newGoogleCloudFunctionsV2StateMessage' smart constructor.
  data GoogleCloudFunctionsV2StateMessage = GoogleCloudFunctionsV2StateMessage
    { -- | The message.
      message :: (Core.Maybe Core.Text),
      -- | Severity of the state message.
      severity :: (Core.Maybe GoogleCloudFunctionsV2StateMessage_Severity),
      -- | One-word CamelCase type of the state message.
      type' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GoogleCloudFunctionsV2StateMessage' with the minimum fields required to make a request.
  newGoogleCloudFunctionsV2StateMessage ::
    GoogleCloudFunctionsV2StateMessage
  newGoogleCloudFunctionsV2StateMessage =
    GoogleCloudFunctionsV2StateMessage
      { message = Core.Nothing,
        severity = Core.Nothing,
        type' = Core.Nothing
      }
  
  instance Core.FromJSON GoogleCloudFunctionsV2StateMessage where
    parseJSON =
      Core.withObject
        "GoogleCloudFunctionsV2StateMessage"
        ( \o ->
            GoogleCloudFunctionsV2StateMessage
              Core.<$> (o Core..:? "message")
              Core.<*> (o Core..:? "severity")
              Core.<*> (o Core..:? "type")
        )
  
  instance Core.ToJSON GoogleCloudFunctionsV2StateMessage where
    toJSON GoogleCloudFunctionsV2StateMessage {..} =
      Core.object
        ( Core.catMaybes
            [ ("message" Core..=) Core.<$> message,
              ("severity" Core..=) Core.<$> severity,
              ("type" Core..=) Core.<$> type'
            ]
        )
  
  -- | Response for the @ListFunctions@ method.
  --
  -- /See:/ 'newListFunctionsResponse' smart constructor.
  data ListFunctionsResponse = ListFunctionsResponse
    { -- | The functions that match the request.
      functions :: (Core.Maybe [Function]),
      -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
      nextPageToken :: (Core.Maybe Core.Text),
      -- | Locations that could not be reached. The response does not include any functions from these locations.
      unreachable :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ListFunctionsResponse' with the minimum fields required to make a request.
  newListFunctionsResponse ::
    ListFunctionsResponse
  newListFunctionsResponse =
    ListFunctionsResponse
      { functions = Core.Nothing,
        nextPageToken = Core.Nothing,
        unreachable = Core.Nothing
      }
  
  instance Core.FromJSON ListFunctionsResponse where
    parseJSON =
      Core.withObject
        "ListFunctionsResponse"
        ( \o ->
            ListFunctionsResponse
              Core.<$> (o Core..:? "functions")
              Core.<*> (o Core..:? "nextPageToken")
              Core.<*> (o Core..:? "unreachable")
        )
  
  instance Core.ToJSON ListFunctionsResponse where
    toJSON ListFunctionsResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("functions" Core..=) Core.<$> functions,
              ("nextPageToken" Core..=) Core.<$> nextPageToken,
              ("unreachable" Core..=) Core.<$> unreachable
            ]
        )
  
  -- | The response message for Locations.ListLocations.
  --
  -- /See:/ 'newListLocationsResponse' smart constructor.
  data ListLocationsResponse = ListLocationsResponse
    { -- | A list of locations that matches the specified filter in the request.
      locations :: (Core.Maybe [Location]),
      -- | The standard List next-page token.
      nextPageToken :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ListLocationsResponse' with the minimum fields required to make a request.
  newListLocationsResponse ::
    ListLocationsResponse
  newListLocationsResponse =
    ListLocationsResponse
      { locations = Core.Nothing,
        nextPageToken = Core.Nothing
      }
  
  instance Core.FromJSON ListLocationsResponse where
    parseJSON =
      Core.withObject
        "ListLocationsResponse"
        ( \o ->
            ListLocationsResponse
              Core.<$> (o Core..:? "locations")
              Core.<*> (o Core..:? "nextPageToken")
        )
  
  instance Core.ToJSON ListLocationsResponse where
    toJSON ListLocationsResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("locations" Core..=) Core.<$> locations,
              ("nextPageToken" Core..=) Core.<$> nextPageToken
            ]
        )
  
  -- | The response message for Operations.ListOperations.
  --
  -- /See:/ 'newListOperationsResponse' smart constructor.
  data ListOperationsResponse = ListOperationsResponse
    { -- | 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 [Operation])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ListOperationsResponse' with the minimum fields required to make a request.
  newListOperationsResponse ::
    ListOperationsResponse
  newListOperationsResponse =
    ListOperationsResponse
      { nextPageToken = Core.Nothing,
        operations = Core.Nothing
      }
  
  instance Core.FromJSON ListOperationsResponse where
    parseJSON =
      Core.withObject
        "ListOperationsResponse"
        ( \o ->
            ListOperationsResponse
              Core.<$> (o Core..:? "nextPageToken")
              Core.<*> (o Core..:? "operations")
        )
  
  instance Core.ToJSON ListOperationsResponse where
    toJSON ListOperationsResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
              ("operations" Core..=) Core.<$> operations
            ]
        )
  
  -- | Response for the @ListRuntimes@ method.
  --
  -- /See:/ 'newListRuntimesResponse' smart constructor.
  newtype ListRuntimesResponse = ListRuntimesResponse
    { -- | The runtimes that match the request.
      runtimes :: (Core.Maybe [Runtime])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ListRuntimesResponse' with the minimum fields required to make a request.
  newListRuntimesResponse ::
    ListRuntimesResponse
  newListRuntimesResponse =
    ListRuntimesResponse {runtimes = Core.Nothing}
  
  instance Core.FromJSON ListRuntimesResponse where
    parseJSON =
      Core.withObject
        "ListRuntimesResponse"
        (\o -> ListRuntimesResponse Core.<$> (o Core..:? "runtimes"))
  
  instance Core.ToJSON ListRuntimesResponse where
    toJSON ListRuntimesResponse {..} =
      Core.object
        (Core.catMaybes [("runtimes" Core..=) Core.<$> runtimes])
  
  -- | A resource that represents a Google Cloud location.
  --
  -- /See:/ 'newLocation' smart constructor.
  data Location = Location
    { -- | The friendly name for this location, typically a nearby city name. For example, \"Tokyo\".
      displayName :: (Core.Maybe Core.Text),
      -- | Cross-service attributes for the location. For example {\"cloud.googleapis.com\/region\": \"us-east1\"}
      labels :: (Core.Maybe Location_Labels),
      -- | The canonical id for this location. For example: @\"us-east1\"@.
      locationId :: (Core.Maybe Core.Text),
      -- | Service-specific metadata. For example the available capacity at the given location.
      metadata :: (Core.Maybe Location_Metadata),
      -- | Resource name for the location, which may vary between implementations. For example: @\"projects\/example-project\/locations\/us-east1\"@
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Location' with the minimum fields required to make a request.
  newLocation ::
    Location
  newLocation =
    Location
      { displayName = Core.Nothing,
        labels = Core.Nothing,
        locationId = Core.Nothing,
        metadata = Core.Nothing,
        name = Core.Nothing
      }
  
  instance Core.FromJSON Location where
    parseJSON =
      Core.withObject
        "Location"
        ( \o ->
            Location
              Core.<$> (o Core..:? "displayName")
              Core.<*> (o Core..:? "labels")
              Core.<*> (o Core..:? "locationId")
              Core.<*> (o Core..:? "metadata")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON Location where
    toJSON Location {..} =
      Core.object
        ( Core.catMaybes
            [ ("displayName" Core..=) Core.<$> displayName,
              ("labels" Core..=) Core.<$> labels,
              ("locationId" Core..=) Core.<$> locationId,
              ("metadata" Core..=) Core.<$> metadata,
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | Cross-service attributes for the location. For example {\"cloud.googleapis.com\/region\": \"us-east1\"}
  --
  -- /See:/ 'newLocation_Labels' smart constructor.
  newtype Location_Labels = Location_Labels
    { additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Location_Labels' with the minimum fields required to make a request.
  newLocation_Labels ::
    -- |  See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    Location_Labels
  newLocation_Labels additional =
    Location_Labels {additional = additional}
  
  instance Core.FromJSON Location_Labels where
    parseJSON =
      Core.withObject
        "Location_Labels"
        (\o -> Location_Labels Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Location_Labels where
    toJSON Location_Labels {..} = Core.toJSON additional
  
  -- | Service-specific metadata. For example the available capacity at the given location.
  --
  -- /See:/ 'newLocation_Metadata' smart constructor.
  newtype Location_Metadata = Location_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 'Location_Metadata' with the minimum fields required to make a request.
  newLocation_Metadata ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    Location_Metadata
  newLocation_Metadata additional =
    Location_Metadata {additional = additional}
  
  instance Core.FromJSON Location_Metadata where
    parseJSON =
      Core.withObject
        "Location_Metadata"
        (\o -> Location_Metadata Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Location_Metadata where
    toJSON Location_Metadata {..} = Core.toJSON additional
  
  -- | Security patches are only applied when a function is redeployed.
  --
  -- /See:/ 'newOnDeployUpdatePolicy' smart constructor.
  newtype OnDeployUpdatePolicy = OnDeployUpdatePolicy
    { -- | Output only. contains the runtime version which was used during latest function deployment.
      runtimeVersion :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'OnDeployUpdatePolicy' with the minimum fields required to make a request.
  newOnDeployUpdatePolicy ::
    OnDeployUpdatePolicy
  newOnDeployUpdatePolicy =
    OnDeployUpdatePolicy {runtimeVersion = Core.Nothing}
  
  instance Core.FromJSON OnDeployUpdatePolicy where
    parseJSON =
      Core.withObject
        "OnDeployUpdatePolicy"
        ( \o ->
            OnDeployUpdatePolicy Core.<$> (o Core..:? "runtimeVersion")
        )
  
  instance Core.ToJSON OnDeployUpdatePolicy where
    toJSON OnDeployUpdatePolicy {..} =
      Core.object
        ( Core.catMaybes
            [("runtimeVersion" Core..=) Core.<$> runtimeVersion]
        )
  
  -- | This resource represents a long-running operation that is the result of a network API call.
  --
  -- /See:/ 'newOperation' smart constructor.
  data Operation = Operation
    { -- | 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 Status),
      -- | 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 Operation_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, successful response of the operation. 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 Operation_Response)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Operation' with the minimum fields required to make a request.
  newOperation ::
    Operation
  newOperation =
    Operation
      { done = Core.Nothing,
        error = Core.Nothing,
        metadata = Core.Nothing,
        name = Core.Nothing,
        response = Core.Nothing
      }
  
  instance Core.FromJSON Operation where
    parseJSON =
      Core.withObject
        "Operation"
        ( \o ->
            Operation
              Core.<$> (o Core..:? "done")
              Core.<*> (o Core..:? "error")
              Core.<*> (o Core..:? "metadata")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "response")
        )
  
  instance Core.ToJSON Operation where
    toJSON Operation {..} =
      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:/ 'newOperation_Metadata' smart constructor.
  newtype Operation_Metadata = Operation_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 'Operation_Metadata' with the minimum fields required to make a request.
  newOperation_Metadata ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    Operation_Metadata
  newOperation_Metadata additional =
    Operation_Metadata {additional = additional}
  
  instance Core.FromJSON Operation_Metadata where
    parseJSON =
      Core.withObject
        "Operation_Metadata"
        (\o -> Operation_Metadata Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Operation_Metadata where
    toJSON Operation_Metadata {..} = Core.toJSON additional
  
  -- | The normal, successful response of the operation. 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:/ 'newOperation_Response' smart constructor.
  newtype Operation_Response = Operation_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 'Operation_Response' with the minimum fields required to make a request.
  newOperation_Response ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    Operation_Response
  newOperation_Response additional =
    Operation_Response {additional = additional}
  
  instance Core.FromJSON Operation_Response where
    parseJSON =
      Core.withObject
        "Operation_Response"
        (\o -> Operation_Response Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Operation_Response where
    toJSON Operation_Response {..} = Core.toJSON additional
  
  -- | Metadata describing an Operation
  --
  -- /See:/ 'newOperationMetadataV1' smart constructor.
  data OperationMetadataV1 = OperationMetadataV1
    { -- | The Cloud Build ID of the function created or updated by an API call. This field is only populated for Create and Update operations.
      buildId :: (Core.Maybe Core.Text),
      -- | The Cloud Build Name of the function deployment. This field is only populated for Create and Update operations. @projects\/\/locations\/\/builds\/@.
      buildName :: (Core.Maybe Core.Text),
      -- | The original request that started the operation.
      request' :: (Core.Maybe OperationMetadataV1_Request),
      -- | An identifier for Firebase function sources. Disclaimer: This field is only supported for Firebase function deployments.
      sourceToken :: (Core.Maybe Core.Text),
      -- | Target of the operation - for example @projects\/project-1\/locations\/region-1\/functions\/function-1@
      target :: (Core.Maybe Core.Text),
      -- | Type of operation.
      type' :: (Core.Maybe OperationMetadataV1_Type),
      -- | The last update timestamp of the operation.
      updateTime :: (Core.Maybe Core.DateTime),
      -- | Version id of the function created or updated by an API call. This field is only populated for Create and Update operations.
      versionId :: (Core.Maybe Core.Int64)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'OperationMetadataV1' with the minimum fields required to make a request.
  newOperationMetadataV1 ::
    OperationMetadataV1
  newOperationMetadataV1 =
    OperationMetadataV1
      { buildId = Core.Nothing,
        buildName = Core.Nothing,
        request' = Core.Nothing,
        sourceToken = Core.Nothing,
        target = Core.Nothing,
        type' = Core.Nothing,
        updateTime = Core.Nothing,
        versionId = Core.Nothing
      }
  
  instance Core.FromJSON OperationMetadataV1 where
    parseJSON =
      Core.withObject
        "OperationMetadataV1"
        ( \o ->
            OperationMetadataV1
              Core.<$> (o Core..:? "buildId")
              Core.<*> (o Core..:? "buildName")
              Core.<*> (o Core..:? "request")
              Core.<*> (o Core..:? "sourceToken")
              Core.<*> (o Core..:? "target")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updateTime")
              Core.<*> (o Core..:? "versionId" Core.<&> Core.fmap Core.fromAsText)
        )
  
  instance Core.ToJSON OperationMetadataV1 where
    toJSON OperationMetadataV1 {..} =
      Core.object
        ( Core.catMaybes
            [ ("buildId" Core..=) Core.<$> buildId,
              ("buildName" Core..=) Core.<$> buildName,
              ("request" Core..=) Core.<$> request',
              ("sourceToken" Core..=) Core.<$> sourceToken,
              ("target" Core..=) Core.<$> target,
              ("type" Core..=) Core.<$> type',
              ("updateTime" Core..=) Core.<$> updateTime,
              ("versionId" Core..=) Core.. Core.AsText Core.<$> versionId
            ]
        )
  
  -- | The original request that started the operation.
  --
  -- /See:/ 'newOperationMetadataV1_Request' smart constructor.
  newtype OperationMetadataV1_Request = OperationMetadataV1_Request
    { -- | 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 'OperationMetadataV1_Request' with the minimum fields required to make a request.
  newOperationMetadataV1_Request ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    OperationMetadataV1_Request
  newOperationMetadataV1_Request additional =
    OperationMetadataV1_Request {additional = additional}
  
  instance Core.FromJSON OperationMetadataV1_Request where
    parseJSON =
      Core.withObject
        "OperationMetadataV1_Request"
        ( \o ->
            OperationMetadataV1_Request Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON OperationMetadataV1_Request where
    toJSON OperationMetadataV1_Request {..} = Core.toJSON additional
  
  -- | 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@, or principals, to a single @role@. Principals 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. For some types of Google Cloud resources, a @binding@ can also 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. To learn which resources support conditions in their IAM policies, see the <https://cloud.google.com/iam/help/conditions/resource-policies IAM documentation>. __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:/ 'newPolicy' smart constructor.
  data Policy = Policy
    { -- | Specifies cloud audit logging configuration for this policy.
      auditConfigs :: (Core.Maybe [AuditConfig]),
      -- | Associates a list of @members@, or principals, with 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 principal. The @bindings@ in a @Policy@ can refer to up to 1,500 principals; up to 250 of these principals can be Google groups. Each occurrence of a principal counts towards these limits. For example, if the @bindings@ grant 50 different roles to @user:alice\@example.com@, and not to any other principal, then you can add another 1,450 principals to the @bindings@ in the @Policy@.
      bindings :: (Core.Maybe [Binding]),
      -- | @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. To learn which resources support conditions in their IAM policies, see the
      -- <https://cloud.google.com/iam/help/conditions/resource-policies IAM documentation>.
      version :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Policy' with the minimum fields required to make a request.
  newPolicy ::
    Policy
  newPolicy =
    Policy
      { auditConfigs = Core.Nothing,
        bindings = Core.Nothing,
        etag = Core.Nothing,
        version = Core.Nothing
      }
  
  instance Core.FromJSON Policy where
    parseJSON =
      Core.withObject
        "Policy"
        ( \o ->
            Policy
              Core.<$> (o Core..:? "auditConfigs")
              Core.<*> (o Core..:? "bindings")
              Core.<*> (o Core..:? "etag")
              Core.<*> (o Core..:? "version")
        )
  
  instance Core.ToJSON Policy where
    toJSON Policy {..} =
      Core.object
        ( Core.catMaybes
            [ ("auditConfigs" Core..=) Core.<$> auditConfigs,
              ("bindings" Core..=) Core.<$> bindings,
              ("etag" Core..=) Core.<$> etag,
              ("version" Core..=) Core.<$> version
            ]
        )
  
  -- | Request for the @RedirectFunctionUpgradeTraffic@ method.
  --
  -- /See:/ 'newRedirectFunctionUpgradeTrafficRequest' smart constructor.
  data RedirectFunctionUpgradeTrafficRequest = RedirectFunctionUpgradeTrafficRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RedirectFunctionUpgradeTrafficRequest' with the minimum fields required to make a request.
  newRedirectFunctionUpgradeTrafficRequest ::
    RedirectFunctionUpgradeTrafficRequest
  newRedirectFunctionUpgradeTrafficRequest =
    RedirectFunctionUpgradeTrafficRequest
  
  instance Core.FromJSON RedirectFunctionUpgradeTrafficRequest where
    parseJSON =
      Core.withObject
        "RedirectFunctionUpgradeTrafficRequest"
        (\o -> Core.pure RedirectFunctionUpgradeTrafficRequest)
  
  instance Core.ToJSON RedirectFunctionUpgradeTrafficRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | Location of the source in a Google Cloud Source Repository.
  --
  -- /See:/ 'newRepoSource' smart constructor.
  data RepoSource = RepoSource
    { -- | Regex matching branches to build. The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https:\/\/github.com\/google\/re2\/wiki\/Syntax
      branchName :: (Core.Maybe Core.Text),
      -- | Explicit commit SHA to build.
      commitSha :: (Core.Maybe Core.Text),
      -- | Directory, relative to the source root, in which to run the build. This must be a relative path. If a step\'s @dir@ is specified and is an absolute path, this value is ignored for that step\'s execution. eg. helloworld (no leading slash allowed)
      dir :: (Core.Maybe Core.Text),
      -- | ID of the project that owns the Cloud Source Repository. If omitted, the project ID requesting the build is assumed.
      projectId :: (Core.Maybe Core.Text),
      -- | Name of the Cloud Source Repository.
      repoName :: (Core.Maybe Core.Text),
      -- | Regex matching tags to build. The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https:\/\/github.com\/google\/re2\/wiki\/Syntax
      tagName :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RepoSource' with the minimum fields required to make a request.
  newRepoSource ::
    RepoSource
  newRepoSource =
    RepoSource
      { branchName = Core.Nothing,
        commitSha = Core.Nothing,
        dir = Core.Nothing,
        projectId = Core.Nothing,
        repoName = Core.Nothing,
        tagName = Core.Nothing
      }
  
  instance Core.FromJSON RepoSource where
    parseJSON =
      Core.withObject
        "RepoSource"
        ( \o ->
            RepoSource
              Core.<$> (o Core..:? "branchName")
              Core.<*> (o Core..:? "commitSha")
              Core.<*> (o Core..:? "dir")
              Core.<*> (o Core..:? "projectId")
              Core.<*> (o Core..:? "repoName")
              Core.<*> (o Core..:? "tagName")
        )
  
  instance Core.ToJSON RepoSource where
    toJSON RepoSource {..} =
      Core.object
        ( Core.catMaybes
            [ ("branchName" Core..=) Core.<$> branchName,
              ("commitSha" Core..=) Core.<$> commitSha,
              ("dir" Core..=) Core.<$> dir,
              ("projectId" Core..=) Core.<$> projectId,
              ("repoName" Core..=) Core.<$> repoName,
              ("tagName" Core..=) Core.<$> tagName
            ]
        )
  
  -- | Request for the @RollbackFunctionUpgradeTraffic@ method.
  --
  -- /See:/ 'newRollbackFunctionUpgradeTrafficRequest' smart constructor.
  data RollbackFunctionUpgradeTrafficRequest = RollbackFunctionUpgradeTrafficRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RollbackFunctionUpgradeTrafficRequest' with the minimum fields required to make a request.
  newRollbackFunctionUpgradeTrafficRequest ::
    RollbackFunctionUpgradeTrafficRequest
  newRollbackFunctionUpgradeTrafficRequest =
    RollbackFunctionUpgradeTrafficRequest
  
  instance Core.FromJSON RollbackFunctionUpgradeTrafficRequest where
    parseJSON =
      Core.withObject
        "RollbackFunctionUpgradeTrafficRequest"
        (\o -> Core.pure RollbackFunctionUpgradeTrafficRequest)
  
  instance Core.ToJSON RollbackFunctionUpgradeTrafficRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | Describes a runtime and any special information (e.g., deprecation status) related to it.
  --
  -- /See:/ 'newRuntime' smart constructor.
  data Runtime = Runtime
    { -- | Decommission date for the runtime.
      decommissionDate :: (Core.Maybe Date),
      -- | Deprecation date for the runtime.
      deprecationDate :: (Core.Maybe Date),
      -- | The user facing name, eg \'Go 1.13\', \'Node.js 12\', etc.
      displayName :: (Core.Maybe Core.Text),
      -- | The environment for the runtime.
      environment :: (Core.Maybe Runtime_Environment),
      -- | The name of the runtime, e.g., \'go113\', \'nodejs12\', etc.
      name :: (Core.Maybe Core.Text),
      -- | The stage of life this runtime is in, e.g., BETA, GA, etc.
      stage :: (Core.Maybe Runtime_Stage),
      -- | Warning messages, e.g., a deprecation warning.
      warnings :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Runtime' with the minimum fields required to make a request.
  newRuntime ::
    Runtime
  newRuntime =
    Runtime
      { decommissionDate = Core.Nothing,
        deprecationDate = Core.Nothing,
        displayName = Core.Nothing,
        environment = Core.Nothing,
        name = Core.Nothing,
        stage = Core.Nothing,
        warnings = Core.Nothing
      }
  
  instance Core.FromJSON Runtime where
    parseJSON =
      Core.withObject
        "Runtime"
        ( \o ->
            Runtime
              Core.<$> (o Core..:? "decommissionDate")
              Core.<*> (o Core..:? "deprecationDate")
              Core.<*> (o Core..:? "displayName")
              Core.<*> (o Core..:? "environment")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "stage")
              Core.<*> (o Core..:? "warnings")
        )
  
  instance Core.ToJSON Runtime where
    toJSON Runtime {..} =
      Core.object
        ( Core.catMaybes
            [ ("decommissionDate" Core..=) Core.<$> decommissionDate,
              ("deprecationDate" Core..=) Core.<$> deprecationDate,
              ("displayName" Core..=) Core.<$> displayName,
              ("environment" Core..=) Core.<$> environment,
              ("name" Core..=) Core.<$> name,
              ("stage" Core..=) Core.<$> stage,
              ("warnings" Core..=) Core.<$> warnings
            ]
        )
  
  -- | Configuration for a secret environment variable. It has the information necessary to fetch the secret value from secret manager and expose it as an environment variable.
  --
  -- /See:/ 'newSecretEnvVar' smart constructor.
  data SecretEnvVar = SecretEnvVar
    { -- | Name of the environment variable.
      key :: (Core.Maybe Core.Text),
      -- | Project identifier (preferably project number but can also be the project ID) of the project that contains the secret. If not set, it is assumed that the secret is in the same project as the function.
      projectId :: (Core.Maybe Core.Text),
      -- | Name of the secret in secret manager (not the full resource name).
      secret :: (Core.Maybe Core.Text),
      -- | Version of the secret (version number or the string \'latest\'). It is recommended to use a numeric version for secret environment variables as any updates to the secret value is not reflected until new instances start.
      version :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SecretEnvVar' with the minimum fields required to make a request.
  newSecretEnvVar ::
    SecretEnvVar
  newSecretEnvVar =
    SecretEnvVar
      { key = Core.Nothing,
        projectId = Core.Nothing,
        secret = Core.Nothing,
        version = Core.Nothing
      }
  
  instance Core.FromJSON SecretEnvVar where
    parseJSON =
      Core.withObject
        "SecretEnvVar"
        ( \o ->
            SecretEnvVar
              Core.<$> (o Core..:? "key")
              Core.<*> (o Core..:? "projectId")
              Core.<*> (o Core..:? "secret")
              Core.<*> (o Core..:? "version")
        )
  
  instance Core.ToJSON SecretEnvVar where
    toJSON SecretEnvVar {..} =
      Core.object
        ( Core.catMaybes
            [ ("key" Core..=) Core.<$> key,
              ("projectId" Core..=) Core.<$> projectId,
              ("secret" Core..=) Core.<$> secret,
              ("version" Core..=) Core.<$> version
            ]
        )
  
  -- | Configuration for a single version.
  --
  -- /See:/ 'newSecretVersion' smart constructor.
  data SecretVersion = SecretVersion
    { -- | Relative path of the file under the mount path where the secret value for this version will be fetched and made available. For example, setting the mount_path as \'\/etc\/secrets\' and path as @secret_foo@ would mount the secret value file at @\/etc\/secrets\/secret_foo@.
      path :: (Core.Maybe Core.Text),
      -- | Version of the secret (version number or the string \'latest\'). It is preferable to use @latest@ version with secret volumes as secret value changes are reflected immediately.
      version :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SecretVersion' with the minimum fields required to make a request.
  newSecretVersion ::
    SecretVersion
  newSecretVersion =
    SecretVersion {path = Core.Nothing, version = Core.Nothing}
  
  instance Core.FromJSON SecretVersion where
    parseJSON =
      Core.withObject
        "SecretVersion"
        ( \o ->
            SecretVersion
              Core.<$> (o Core..:? "path")
              Core.<*> (o Core..:? "version")
        )
  
  instance Core.ToJSON SecretVersion where
    toJSON SecretVersion {..} =
      Core.object
        ( Core.catMaybes
            [ ("path" Core..=) Core.<$> path,
              ("version" Core..=) Core.<$> version
            ]
        )
  
  -- | Configuration for a secret volume. It has the information necessary to fetch the secret value from secret manager and make it available as files mounted at the requested paths within the application container.
  --
  -- /See:/ 'newSecretVolume' smart constructor.
  data SecretVolume = SecretVolume
    { -- | The path within the container to mount the secret volume. For example, setting the mount_path as @\/etc\/secrets@ would mount the secret value files under the @\/etc\/secrets@ directory. This directory will also be completely shadowed and unavailable to mount any other secrets. Recommended mount path: \/etc\/secrets
      mountPath :: (Core.Maybe Core.Text),
      -- | Project identifier (preferably project number but can also be the project ID) of the project that contains the secret. If not set, it is assumed that the secret is in the same project as the function.
      projectId :: (Core.Maybe Core.Text),
      -- | Name of the secret in secret manager (not the full resource name).
      secret :: (Core.Maybe Core.Text),
      -- | List of secret versions to mount for this secret. If empty, the @latest@ version of the secret will be made available in a file named after the secret under the mount point.
      versions :: (Core.Maybe [SecretVersion])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SecretVolume' with the minimum fields required to make a request.
  newSecretVolume ::
    SecretVolume
  newSecretVolume =
    SecretVolume
      { mountPath = Core.Nothing,
        projectId = Core.Nothing,
        secret = Core.Nothing,
        versions = Core.Nothing
      }
  
  instance Core.FromJSON SecretVolume where
    parseJSON =
      Core.withObject
        "SecretVolume"
        ( \o ->
            SecretVolume
              Core.<$> (o Core..:? "mountPath")
              Core.<*> (o Core..:? "projectId")
              Core.<*> (o Core..:? "secret")
              Core.<*> (o Core..:? "versions")
        )
  
  instance Core.ToJSON SecretVolume where
    toJSON SecretVolume {..} =
      Core.object
        ( Core.catMaybes
            [ ("mountPath" Core..=) Core.<$> mountPath,
              ("projectId" Core..=) Core.<$> projectId,
              ("secret" Core..=) Core.<$> secret,
              ("versions" Core..=) Core.<$> versions
            ]
        )
  
  -- | Describes the Service being deployed. Currently Supported : Cloud Run (fully managed).
  --
  -- /See:/ 'newServiceConfig' smart constructor.
  data ServiceConfig = ServiceConfig
    { -- | Whether 100% of traffic is routed to the latest revision. On CreateFunction and UpdateFunction, when set to true, the revision being deployed will serve 100% of traffic, ignoring any traffic split settings, if any. On GetFunction, true will be returned if the latest revision is serving 100% of traffic.
      allTrafficOnLatestRevision :: (Core.Maybe Core.Bool),
      -- | The number of CPUs used in a single container instance. Default value is calculated from available memory. Supports the same values as Cloud Run, see https:\/\/cloud.google.com\/run\/docs\/reference\/rest\/v1\/Container#resourcerequirements Example: \"1\" indicates 1 vCPU
      availableCpu :: (Core.Maybe Core.Text),
      -- | The amount of memory available for a function. Defaults to 256M. Supported units are k, M, G, Mi, Gi. If no unit is supplied the value is interpreted as bytes. See https:\/\/github.com\/kubernetes\/kubernetes\/blob\/master\/staging\/src\/k8s.io\/apimachinery\/pkg\/api\/resource\/quantity.go a full description.
      availableMemory :: (Core.Maybe Core.Text),
      -- | Optional. The binary authorization policy to be checked when deploying the Cloud Run service.
      binaryAuthorizationPolicy :: (Core.Maybe Core.Text),
      -- | Environment variables that shall be available during function execution.
      environmentVariables :: (Core.Maybe ServiceConfig_EnvironmentVariables),
      -- | The ingress settings for the function, controlling what traffic can reach it.
      ingressSettings :: (Core.Maybe ServiceConfig_IngressSettings),
      -- | The limit on the maximum number of function instances that may coexist at a given time. In some cases, such as rapid traffic surges, Cloud Functions may, for a short period of time, create more instances than the specified max instances limit. If your function cannot tolerate this temporary behavior, you may want to factor in a safety margin and set a lower max instances value than your function can tolerate. See the <https://cloud.google.com/functions/docs/max-instances Max Instances> Guide for more details.
      maxInstanceCount :: (Core.Maybe Core.Int32),
      -- | Sets the maximum number of concurrent requests that each instance can receive. Defaults to 1.
      maxInstanceRequestConcurrency :: (Core.Maybe Core.Int32),
      -- | The limit on the minimum number of function instances that may coexist at a given time. Function instances are kept in idle state for a short period after they finished executing the request to reduce cold start time for subsequent requests. Setting a minimum instance count will ensure that the given number of instances are kept running in idle state always. This can help with cold start times when jump in incoming request count occurs after the idle instance would have been stopped in the default case.
      minInstanceCount :: (Core.Maybe Core.Int32),
      -- | Output only. The name of service revision.
      revision :: (Core.Maybe Core.Text),
      -- | Secret environment variables configuration.
      secretEnvironmentVariables :: (Core.Maybe [SecretEnvVar]),
      -- | Secret volumes configuration.
      secretVolumes :: (Core.Maybe [SecretVolume]),
      -- | Security level configure whether the function only accepts https. This configuration is only applicable to 1st Gen functions with Http trigger. By default https is optional for 1st Gen functions; 2nd Gen functions are https ONLY.
      securityLevel :: (Core.Maybe ServiceConfig_SecurityLevel),
      -- | Output only. Name of the service associated with a Function. The format of this field is @projects\/{project}\/locations\/{region}\/services\/{service}@
      service :: (Core.Maybe Core.Text),
      -- | The email of the service\'s service account. If empty, defaults to @{project_number}-compute\@developer.gserviceaccount.com@.
      serviceAccountEmail :: (Core.Maybe Core.Text),
      -- | The function execution timeout. Execution is considered failed and can be terminated if the function is not completed at the end of the timeout period. Defaults to 60 seconds.
      timeoutSeconds :: (Core.Maybe Core.Int32),
      -- | Output only. URI of the Service deployed.
      uri :: (Core.Maybe Core.Text),
      -- | The Serverless VPC Access connector that this cloud function can connect to. The format of this field is @projects\/*\/locations\/*\/connectors\/*@.
      vpcConnector :: (Core.Maybe Core.Text),
      -- | The egress settings for the connector, controlling what traffic is diverted through it.
      vpcConnectorEgressSettings :: (Core.Maybe ServiceConfig_VpcConnectorEgressSettings)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ServiceConfig' with the minimum fields required to make a request.
  newServiceConfig ::
    ServiceConfig
  newServiceConfig =
    ServiceConfig
      { allTrafficOnLatestRevision = Core.Nothing,
        availableCpu = Core.Nothing,
        availableMemory = Core.Nothing,
        binaryAuthorizationPolicy = Core.Nothing,
        environmentVariables = Core.Nothing,
        ingressSettings = Core.Nothing,
        maxInstanceCount = Core.Nothing,
        maxInstanceRequestConcurrency = Core.Nothing,
        minInstanceCount = Core.Nothing,
        revision = Core.Nothing,
        secretEnvironmentVariables = Core.Nothing,
        secretVolumes = Core.Nothing,
        securityLevel = Core.Nothing,
        service = Core.Nothing,
        serviceAccountEmail = Core.Nothing,
        timeoutSeconds = Core.Nothing,
        uri = Core.Nothing,
        vpcConnector = Core.Nothing,
        vpcConnectorEgressSettings = Core.Nothing
      }
  
  instance Core.FromJSON ServiceConfig where
    parseJSON =
      Core.withObject
        "ServiceConfig"
        ( \o ->
            ServiceConfig
              Core.<$> (o Core..:? "allTrafficOnLatestRevision")
              Core.<*> (o Core..:? "availableCpu")
              Core.<*> (o Core..:? "availableMemory")
              Core.<*> (o Core..:? "binaryAuthorizationPolicy")
              Core.<*> (o Core..:? "environmentVariables")
              Core.<*> (o Core..:? "ingressSettings")
              Core.<*> (o Core..:? "maxInstanceCount")
              Core.<*> (o Core..:? "maxInstanceRequestConcurrency")
              Core.<*> (o Core..:? "minInstanceCount")
              Core.<*> (o Core..:? "revision")
              Core.<*> (o Core..:? "secretEnvironmentVariables")
              Core.<*> (o Core..:? "secretVolumes")
              Core.<*> (o Core..:? "securityLevel")
              Core.<*> (o Core..:? "service")
              Core.<*> (o Core..:? "serviceAccountEmail")
              Core.<*> (o Core..:? "timeoutSeconds")
              Core.<*> (o Core..:? "uri")
              Core.<*> (o Core..:? "vpcConnector")
              Core.<*> (o Core..:? "vpcConnectorEgressSettings")
        )
  
  instance Core.ToJSON ServiceConfig where
    toJSON ServiceConfig {..} =
      Core.object
        ( Core.catMaybes
            [ ("allTrafficOnLatestRevision" Core..=)
                Core.<$> allTrafficOnLatestRevision,
              ("availableCpu" Core..=) Core.<$> availableCpu,
              ("availableMemory" Core..=) Core.<$> availableMemory,
              ("binaryAuthorizationPolicy" Core..=)
                Core.<$> binaryAuthorizationPolicy,
              ("environmentVariables" Core..=) Core.<$> environmentVariables,
              ("ingressSettings" Core..=) Core.<$> ingressSettings,
              ("maxInstanceCount" Core..=) Core.<$> maxInstanceCount,
              ("maxInstanceRequestConcurrency" Core..=)
                Core.<$> maxInstanceRequestConcurrency,
              ("minInstanceCount" Core..=) Core.<$> minInstanceCount,
              ("revision" Core..=) Core.<$> revision,
              ("secretEnvironmentVariables" Core..=)
                Core.<$> secretEnvironmentVariables,
              ("secretVolumes" Core..=) Core.<$> secretVolumes,
              ("securityLevel" Core..=) Core.<$> securityLevel,
              ("service" Core..=) Core.<$> service,
              ("serviceAccountEmail" Core..=) Core.<$> serviceAccountEmail,
              ("timeoutSeconds" Core..=) Core.<$> timeoutSeconds,
              ("uri" Core..=) Core.<$> uri,
              ("vpcConnector" Core..=) Core.<$> vpcConnector,
              ("vpcConnectorEgressSettings" Core..=)
                Core.<$> vpcConnectorEgressSettings
            ]
        )
  
  -- | Environment variables that shall be available during function execution.
  --
  -- /See:/ 'newServiceConfig_EnvironmentVariables' smart constructor.
  newtype ServiceConfig_EnvironmentVariables = ServiceConfig_EnvironmentVariables
    { additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ServiceConfig_EnvironmentVariables' with the minimum fields required to make a request.
  newServiceConfig_EnvironmentVariables ::
    -- |  See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    ServiceConfig_EnvironmentVariables
  newServiceConfig_EnvironmentVariables additional =
    ServiceConfig_EnvironmentVariables {additional = additional}
  
  instance Core.FromJSON ServiceConfig_EnvironmentVariables where
    parseJSON =
      Core.withObject
        "ServiceConfig_EnvironmentVariables"
        ( \o ->
            ServiceConfig_EnvironmentVariables
              Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON ServiceConfig_EnvironmentVariables where
    toJSON ServiceConfig_EnvironmentVariables {..} =
      Core.toJSON additional
  
  -- | Request message for @SetIamPolicy@ method.
  --
  -- /See:/ 'newSetIamPolicyRequest' smart constructor.
  data SetIamPolicyRequest = SetIamPolicyRequest
    { -- | 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 Google Cloud services (such as Projects) might reject them.
      policy :: (Core.Maybe Policy),
      -- | 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\"@
      updateMask :: (Core.Maybe Core.FieldMask)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SetIamPolicyRequest' with the minimum fields required to make a request.
  newSetIamPolicyRequest ::
    SetIamPolicyRequest
  newSetIamPolicyRequest =
    SetIamPolicyRequest
      { policy = Core.Nothing,
        updateMask = Core.Nothing
      }
  
  instance Core.FromJSON SetIamPolicyRequest where
    parseJSON =
      Core.withObject
        "SetIamPolicyRequest"
        ( \o ->
            SetIamPolicyRequest
              Core.<$> (o Core..:? "policy")
              Core.<*> (o Core..:? "updateMask")
        )
  
  instance Core.ToJSON SetIamPolicyRequest where
    toJSON SetIamPolicyRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("policy" Core..=) Core.<$> policy,
              ("updateMask" Core..=) Core.<$> updateMask
            ]
        )
  
  -- | Request for the @SetupFunctionUpgradeConfig@ method.
  --
  -- /See:/ 'newSetupFunctionUpgradeConfigRequest' smart constructor.
  data SetupFunctionUpgradeConfigRequest = SetupFunctionUpgradeConfigRequest
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SetupFunctionUpgradeConfigRequest' with the minimum fields required to make a request.
  newSetupFunctionUpgradeConfigRequest ::
    SetupFunctionUpgradeConfigRequest
  newSetupFunctionUpgradeConfigRequest =
    SetupFunctionUpgradeConfigRequest
  
  instance Core.FromJSON SetupFunctionUpgradeConfigRequest where
    parseJSON =
      Core.withObject
        "SetupFunctionUpgradeConfigRequest"
        (\o -> Core.pure SetupFunctionUpgradeConfigRequest)
  
  instance Core.ToJSON SetupFunctionUpgradeConfigRequest where
    toJSON = Core.const Core.emptyObject
  
  -- | The location of the function source code.
  --
  -- /See:/ 'newSource' smart constructor.
  data Source = Source
    { -- | If provided, get the source from GitHub repository. This option is valid only for GCF 1st Gen function. Example: https:\/\/github.com\/\/\/blob\/\/
      gitUri :: (Core.Maybe Core.Text),
      -- | If provided, get the source from this location in a Cloud Source Repository.
      repoSource :: (Core.Maybe RepoSource),
      -- | If provided, get the source from this location in Google Cloud Storage.
      storageSource :: (Core.Maybe StorageSource)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Source' with the minimum fields required to make a request.
  newSource ::
    Source
  newSource =
    Source
      { gitUri = Core.Nothing,
        repoSource = Core.Nothing,
        storageSource = Core.Nothing
      }
  
  instance Core.FromJSON Source where
    parseJSON =
      Core.withObject
        "Source"
        ( \o ->
            Source
              Core.<$> (o Core..:? "gitUri")
              Core.<*> (o Core..:? "repoSource")
              Core.<*> (o Core..:? "storageSource")
        )
  
  instance Core.ToJSON Source where
    toJSON Source {..} =
      Core.object
        ( Core.catMaybes
            [ ("gitUri" Core..=) Core.<$> gitUri,
              ("repoSource" Core..=) Core.<$> repoSource,
              ("storageSource" Core..=) Core.<$> storageSource
            ]
        )
  
  -- | Provenance of the source. Ways to find the original source, or verify that some source was used for this build.
  --
  -- /See:/ 'newSourceProvenance' smart constructor.
  data SourceProvenance = SourceProvenance
    { -- | A copy of the build\'s @source.git_uri@, if exists, with any commits resolved.
      gitUri :: (Core.Maybe Core.Text),
      -- | A copy of the build\'s @source.repo_source@, if exists, with any revisions resolved.
      resolvedRepoSource :: (Core.Maybe RepoSource),
      -- | A copy of the build\'s @source.storage_source@, if exists, with any generations resolved.
      resolvedStorageSource :: (Core.Maybe StorageSource)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'SourceProvenance' with the minimum fields required to make a request.
  newSourceProvenance ::
    SourceProvenance
  newSourceProvenance =
    SourceProvenance
      { gitUri = Core.Nothing,
        resolvedRepoSource = Core.Nothing,
        resolvedStorageSource = Core.Nothing
      }
  
  instance Core.FromJSON SourceProvenance where
    parseJSON =
      Core.withObject
        "SourceProvenance"
        ( \o ->
            SourceProvenance
              Core.<$> (o Core..:? "gitUri")
              Core.<*> (o Core..:? "resolvedRepoSource")
              Core.<*> (o Core..:? "resolvedStorageSource")
        )
  
  instance Core.ToJSON SourceProvenance where
    toJSON SourceProvenance {..} =
      Core.object
        ( Core.catMaybes
            [ ("gitUri" Core..=) Core.<$> gitUri,
              ("resolvedRepoSource" Core..=) Core.<$> resolvedRepoSource,
              ("resolvedStorageSource" Core..=) Core.<$> resolvedStorageSource
            ]
        )
  
  -- | 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:/ 'newStatus' smart constructor.
  data Status = Status
    { -- | 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 [Status_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 'Status' with the minimum fields required to make a request.
  newStatus ::
    Status
  newStatus =
    Status
      { code = Core.Nothing,
        details = Core.Nothing,
        message = Core.Nothing
      }
  
  instance Core.FromJSON Status where
    parseJSON =
      Core.withObject
        "Status"
        ( \o ->
            Status
              Core.<$> (o Core..:? "code")
              Core.<*> (o Core..:? "details")
              Core.<*> (o Core..:? "message")
        )
  
  instance Core.ToJSON Status where
    toJSON Status {..} =
      Core.object
        ( Core.catMaybes
            [ ("code" Core..=) Core.<$> code,
              ("details" Core..=) Core.<$> details,
              ("message" Core..=) Core.<$> message
            ]
        )
  
  --
  -- /See:/ 'newStatus_DetailsItem' smart constructor.
  newtype Status_DetailsItem = Status_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 'Status_DetailsItem' with the minimum fields required to make a request.
  newStatus_DetailsItem ::
    -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
    Core.HashMap Core.Text Core.Value ->
    Status_DetailsItem
  newStatus_DetailsItem additional =
    Status_DetailsItem {additional = additional}
  
  instance Core.FromJSON Status_DetailsItem where
    parseJSON =
      Core.withObject
        "Status_DetailsItem"
        (\o -> Status_DetailsItem Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Status_DetailsItem where
    toJSON Status_DetailsItem {..} = Core.toJSON additional
  
  -- | Location of the source in an archive file in Google Cloud Storage.
  --
  -- /See:/ 'newStorageSource' smart constructor.
  data StorageSource = StorageSource
    { -- | Google Cloud Storage bucket containing the source (see <https://cloud.google.com/storage/docs/bucket-naming#requirements Bucket Name Requirements>).
      bucket :: (Core.Maybe Core.Text),
      -- | Google Cloud Storage generation for the object. If the generation is omitted, the latest generation will be used.
      generation :: (Core.Maybe Core.Int64),
      -- | Google Cloud Storage object containing the source. This object must be a gzipped archive file (@.tar.gz@) containing source to build.
      object :: (Core.Maybe Core.Text),
      -- | When the specified storage bucket is a 1st gen function uploard url bucket, this field should be set as the generated upload url for 1st gen deployment.
      sourceUploadUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'StorageSource' with the minimum fields required to make a request.
  newStorageSource ::
    StorageSource
  newStorageSource =
    StorageSource
      { bucket = Core.Nothing,
        generation = Core.Nothing,
        object = Core.Nothing,
        sourceUploadUrl = Core.Nothing
      }
  
  instance Core.FromJSON StorageSource where
    parseJSON =
      Core.withObject
        "StorageSource"
        ( \o ->
            StorageSource
              Core.<$> (o Core..:? "bucket")
              Core.<*> (o Core..:? "generation" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "object")
              Core.<*> (o Core..:? "sourceUploadUrl")
        )
  
  instance Core.ToJSON StorageSource where
    toJSON StorageSource {..} =
      Core.object
        ( Core.catMaybes
            [ ("bucket" Core..=) Core.<$> bucket,
              ("generation" Core..=) Core.. Core.AsText Core.<$> generation,
              ("object" Core..=) Core.<$> object,
              ("sourceUploadUrl" Core..=) Core.<$> sourceUploadUrl
            ]
        )
  
  -- | Request message for @TestIamPermissions@ method.
  --
  -- /See:/ 'newTestIamPermissionsRequest' smart constructor.
  newtype TestIamPermissionsRequest = TestIamPermissionsRequest
    { -- | 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 'TestIamPermissionsRequest' with the minimum fields required to make a request.
  newTestIamPermissionsRequest ::
    TestIamPermissionsRequest
  newTestIamPermissionsRequest =
    TestIamPermissionsRequest {permissions = Core.Nothing}
  
  instance Core.FromJSON TestIamPermissionsRequest where
    parseJSON =
      Core.withObject
        "TestIamPermissionsRequest"
        ( \o ->
            TestIamPermissionsRequest Core.<$> (o Core..:? "permissions")
        )
  
  instance Core.ToJSON TestIamPermissionsRequest where
    toJSON TestIamPermissionsRequest {..} =
      Core.object
        (Core.catMaybes [("permissions" Core..=) Core.<$> permissions])
  
  -- | Response message for @TestIamPermissions@ method.
  --
  -- /See:/ 'newTestIamPermissionsResponse' smart constructor.
  newtype TestIamPermissionsResponse = TestIamPermissionsResponse
    { -- | 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 'TestIamPermissionsResponse' with the minimum fields required to make a request.
  newTestIamPermissionsResponse ::
    TestIamPermissionsResponse
  newTestIamPermissionsResponse =
    TestIamPermissionsResponse {permissions = Core.Nothing}
  
  instance Core.FromJSON TestIamPermissionsResponse where
    parseJSON =
      Core.withObject
        "TestIamPermissionsResponse"
        ( \o ->
            TestIamPermissionsResponse Core.<$> (o Core..:? "permissions")
        )
  
  instance Core.ToJSON TestIamPermissionsResponse where
    toJSON TestIamPermissionsResponse {..} =
      Core.object
        (Core.catMaybes [("permissions" Core..=) Core.<$> permissions])
  
  -- | Information related to: * A function\'s eligibility for 1st Gen to 2nd Gen migration. * Current state of migration for function undergoing migration.
  --
  -- /See:/ 'newUpgradeInfo' smart constructor.
  data UpgradeInfo = UpgradeInfo
    { -- | Describes the Build step of the function that builds a container to prepare for 2nd gen upgrade.
      buildConfig :: (Core.Maybe BuildConfig),
      -- | Describes the Event trigger which has been setup to prepare for 2nd gen upgrade.
      eventTrigger :: (Core.Maybe EventTrigger),
      -- | Describes the Cloud Run service which has been setup to prepare for 2nd gen upgrade.
      serviceConfig :: (Core.Maybe ServiceConfig),
      -- | UpgradeState of the function
      upgradeState :: (Core.Maybe UpgradeInfo_UpgradeState)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UpgradeInfo' with the minimum fields required to make a request.
  newUpgradeInfo ::
    UpgradeInfo
  newUpgradeInfo =
    UpgradeInfo
      { buildConfig = Core.Nothing,
        eventTrigger = Core.Nothing,
        serviceConfig = Core.Nothing,
        upgradeState = Core.Nothing
      }
  
  instance Core.FromJSON UpgradeInfo where
    parseJSON =
      Core.withObject
        "UpgradeInfo"
        ( \o ->
            UpgradeInfo
              Core.<$> (o Core..:? "buildConfig")
              Core.<*> (o Core..:? "eventTrigger")
              Core.<*> (o Core..:? "serviceConfig")
              Core.<*> (o Core..:? "upgradeState")
        )
  
  instance Core.ToJSON UpgradeInfo where
    toJSON UpgradeInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("buildConfig" Core..=) Core.<$> buildConfig,
              ("eventTrigger" Core..=) Core.<$> eventTrigger,
              ("serviceConfig" Core..=) Core.<$> serviceConfig,
              ("upgradeState" Core..=) Core.<$> upgradeState
            ]
        )
  