# WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
# See https://github.com/aws-beam/aws-codegen for more details.

defmodule AWS.Amplify do
  @moduledoc """
  Amplify enables developers to develop and deploy cloud-powered mobile and web
  apps.

  Amplify Hosting provides a continuous delivery and hosting service for web
  applications.
  For more information, see the [Amplify Hosting User Guide](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html). The
  Amplify Framework is a comprehensive set of SDKs, libraries, tools, and
  documentation
  for client app development. For more information, see the [Amplify Framework.](https://docs.amplify.aws/)
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      app() :: %{
        "appArn" => String.t() | atom(),
        "appId" => String.t() | atom(),
        "autoBranchCreationConfig" => auto_branch_creation_config(),
        "autoBranchCreationPatterns" => list(String.t() | atom()),
        "basicAuthCredentials" => String.t() | atom(),
        "buildSpec" => String.t() | atom(),
        "cacheConfig" => cache_config(),
        "computeRoleArn" => String.t() | atom(),
        "createTime" => non_neg_integer(),
        "customHeaders" => String.t() | atom(),
        "customRules" => list(custom_rule()),
        "defaultDomain" => String.t() | atom(),
        "description" => String.t() | atom(),
        "enableAutoBranchCreation" => boolean(),
        "enableBasicAuth" => boolean(),
        "enableBranchAutoBuild" => boolean(),
        "enableBranchAutoDeletion" => boolean(),
        "environmentVariables" => map(),
        "iamServiceRoleArn" => String.t() | atom(),
        "jobConfig" => job_config(),
        "name" => String.t() | atom(),
        "platform" => list(any()),
        "productionBranch" => production_branch(),
        "repository" => String.t() | atom(),
        "repositoryCloneMethod" => list(any()),
        "tags" => map(),
        "updateTime" => non_neg_integer(),
        "wafConfiguration" => waf_configuration(),
        "webhookCreateTime" => non_neg_integer()
      }

  """
  @type app() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      branch() :: %{
        "activeJobId" => String.t() | atom(),
        "associatedResources" => list(String.t() | atom()),
        "backend" => backend(),
        "backendEnvironmentArn" => String.t() | atom(),
        "basicAuthCredentials" => String.t() | atom(),
        "branchArn" => String.t() | atom(),
        "branchName" => String.t() | atom(),
        "buildSpec" => String.t() | atom(),
        "computeRoleArn" => String.t() | atom(),
        "createTime" => non_neg_integer(),
        "customDomains" => list(String.t() | atom()),
        "description" => String.t() | atom(),
        "destinationBranch" => String.t() | atom(),
        "displayName" => String.t() | atom(),
        "enableAutoBuild" => boolean(),
        "enableBasicAuth" => boolean(),
        "enableNotification" => boolean(),
        "enablePerformanceMode" => boolean(),
        "enablePullRequestPreview" => boolean(),
        "enableSkewProtection" => boolean(),
        "environmentVariables" => map(),
        "framework" => String.t() | atom(),
        "pullRequestEnvironmentName" => String.t() | atom(),
        "sourceBranch" => String.t() | atom(),
        "stage" => list(any()),
        "tags" => map(),
        "thumbnailUrl" => String.t() | atom(),
        "totalNumberOfJobs" => String.t() | atom(),
        "ttl" => String.t() | atom(),
        "updateTime" => non_neg_integer()
      }

  """
  @type branch() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      start_job_result() :: %{
        "jobSummary" => job_summary()
      }

  """
  @type start_job_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_domain_association_request() :: %{}

  """
  @type get_domain_association_request() :: %{}

  @typedoc """

  ## Example:

      tag_resource_request() :: %{
        required("tags") => map()
      }

  """
  @type tag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      internal_failure_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type internal_failure_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      generate_access_logs_result() :: %{
        "logUrl" => String.t() | atom()
      }

  """
  @type generate_access_logs_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      sub_domain() :: %{
        "dnsRecord" => String.t() | atom(),
        "subDomainSetting" => sub_domain_setting(),
        "verified" => boolean()
      }

  """
  @type sub_domain() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_app_request() :: %{
        optional("accessToken") => String.t() | atom(),
        optional("autoBranchCreationConfig") => auto_branch_creation_config(),
        optional("autoBranchCreationPatterns") => list(String.t() | atom()),
        optional("basicAuthCredentials") => String.t() | atom(),
        optional("buildSpec") => String.t() | atom(),
        optional("cacheConfig") => cache_config(),
        optional("computeRoleArn") => String.t() | atom(),
        optional("customHeaders") => String.t() | atom(),
        optional("customRules") => list(custom_rule()),
        optional("description") => String.t() | atom(),
        optional("enableAutoBranchCreation") => boolean(),
        optional("enableBasicAuth") => boolean(),
        optional("enableBranchAutoBuild") => boolean(),
        optional("enableBranchAutoDeletion") => boolean(),
        optional("environmentVariables") => map(),
        optional("iamServiceRoleArn") => String.t() | atom(),
        optional("jobConfig") => job_config(),
        optional("oauthToken") => String.t() | atom(),
        optional("platform") => list(any()),
        optional("repository") => String.t() | atom(),
        optional("tags") => map(),
        required("name") => String.t() | atom()
      }

  """
  @type create_app_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      unauthorized_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type unauthorized_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_branch_request() :: %{
        optional("backend") => backend(),
        optional("backendEnvironmentArn") => String.t() | atom(),
        optional("basicAuthCredentials") => String.t() | atom(),
        optional("buildSpec") => String.t() | atom(),
        optional("computeRoleArn") => String.t() | atom(),
        optional("description") => String.t() | atom(),
        optional("displayName") => String.t() | atom(),
        optional("enableAutoBuild") => boolean(),
        optional("enableBasicAuth") => boolean(),
        optional("enableNotification") => boolean(),
        optional("enablePerformanceMode") => boolean(),
        optional("enablePullRequestPreview") => boolean(),
        optional("enableSkewProtection") => boolean(),
        optional("environmentVariables") => map(),
        optional("framework") => String.t() | atom(),
        optional("pullRequestEnvironmentName") => String.t() | atom(),
        optional("stage") => list(any()),
        optional("tags") => map(),
        optional("ttl") => String.t() | atom(),
        required("branchName") => String.t() | atom()
      }

  """
  @type create_branch_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_jobs_result() :: %{
        "jobSummaries" => list(job_summary()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_jobs_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_backend_environment_result() :: %{
        "backendEnvironment" => backend_environment()
      }

  """
  @type create_backend_environment_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_domain_association_request() :: %{
        optional("autoSubDomainCreationPatterns") => list(String.t() | atom()),
        optional("autoSubDomainIAMRole") => String.t() | atom(),
        optional("certificateSettings") => certificate_settings(),
        optional("enableAutoSubDomain") => boolean(),
        optional("subDomainSettings") => list(sub_domain_setting())
      }

  """
  @type update_domain_association_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_domain_association_request() :: %{
        optional("autoSubDomainCreationPatterns") => list(String.t() | atom()),
        optional("autoSubDomainIAMRole") => String.t() | atom(),
        optional("certificateSettings") => certificate_settings(),
        optional("enableAutoSubDomain") => boolean(),
        required("domainName") => String.t() | atom(),
        required("subDomainSettings") => list(sub_domain_setting())
      }

  """
  @type create_domain_association_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      untag_resource_response() :: %{}

  """
  @type untag_resource_response() :: %{}

  @typedoc """

  ## Example:

      list_jobs_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_jobs_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      backend() :: %{
        "stackArn" => String.t() | atom()
      }

  """
  @type backend() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_webhook_result() :: %{
        "webhook" => webhook()
      }

  """
  @type create_webhook_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_deployment_request() :: %{
        optional("fileMap") => map()
      }

  """
  @type create_deployment_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_job_result() :: %{
        "jobSummary" => job_summary()
      }

  """
  @type delete_job_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      generate_access_logs_request() :: %{
        optional("endTime") => non_neg_integer(),
        optional("startTime") => non_neg_integer(),
        required("domainName") => String.t() | atom()
      }

  """
  @type generate_access_logs_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_branches_result() :: %{
        "branches" => list(branch()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_branches_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_artifact_url_request() :: %{}

  """
  @type get_artifact_url_request() :: %{}

  @typedoc """

  ## Example:

      stop_job_request() :: %{}

  """
  @type stop_job_request() :: %{}

  @typedoc """

  ## Example:

      delete_domain_association_request() :: %{}

  """
  @type delete_domain_association_request() :: %{}

  @typedoc """

  ## Example:

      untag_resource_request() :: %{
        required("tagKeys") => list(String.t() | atom())
      }

  """
  @type untag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_backend_environments_result() :: %{
        "backendEnvironments" => list(backend_environment()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_backend_environments_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_webhook_request() :: %{}

  """
  @type delete_webhook_request() :: %{}

  @typedoc """

  ## Example:

      list_apps_result() :: %{
        "apps" => list(app()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_apps_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_backend_environment_request() :: %{
        optional("deploymentArtifacts") => String.t() | atom(),
        optional("stackName") => String.t() | atom(),
        required("environmentName") => String.t() | atom()
      }

  """
  @type create_backend_environment_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_backend_environment_result() :: %{
        "backendEnvironment" => backend_environment()
      }

  """
  @type delete_backend_environment_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_job_result() :: %{
        "job" => job()
      }

  """
  @type get_job_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_app_request() :: %{}

  """
  @type get_app_request() :: %{}

  @typedoc """

  ## Example:

      job_summary() :: %{
        "commitId" => String.t() | atom(),
        "commitMessage" => String.t() | atom(),
        "commitTime" => non_neg_integer(),
        "endTime" => non_neg_integer(),
        "jobArn" => String.t() | atom(),
        "jobId" => String.t() | atom(),
        "jobType" => list(any()),
        "sourceUrl" => String.t() | atom(),
        "sourceUrlType" => list(any()),
        "startTime" => non_neg_integer(),
        "status" => list(any())
      }

  """
  @type job_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      sub_domain_setting() :: %{
        "branchName" => String.t() | atom(),
        "prefix" => String.t() | atom()
      }

  """
  @type sub_domain_setting() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_app_result() :: %{
        "app" => app()
      }

  """
  @type update_app_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      domain_association() :: %{
        "autoSubDomainCreationPatterns" => list(String.t() | atom()),
        "autoSubDomainIAMRole" => String.t() | atom(),
        "certificate" => certificate(),
        "certificateVerificationDNSRecord" => String.t() | atom(),
        "domainAssociationArn" => String.t() | atom(),
        "domainName" => String.t() | atom(),
        "domainStatus" => list(any()),
        "enableAutoSubDomain" => boolean(),
        "statusReason" => String.t() | atom(),
        "subDomains" => list(sub_domain()),
        "updateStatus" => list(any())
      }

  """
  @type domain_association() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_backend_environment_result() :: %{
        "backendEnvironment" => backend_environment()
      }

  """
  @type get_backend_environment_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      start_deployment_result() :: %{
        "jobSummary" => job_summary()
      }

  """
  @type start_deployment_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      resource_not_found_exception() :: %{
        "code" => String.t() | atom(),
        "message" => String.t() | atom()
      }

  """
  @type resource_not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      dependent_service_failure_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type dependent_service_failure_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_webhook_result() :: %{
        "webhook" => webhook()
      }

  """
  @type delete_webhook_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      production_branch() :: %{
        "branchName" => String.t() | atom(),
        "lastDeployTime" => non_neg_integer(),
        "status" => String.t() | atom(),
        "thumbnailUrl" => String.t() | atom()
      }

  """
  @type production_branch() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_deployment_result() :: %{
        "fileUploadUrls" => map(),
        "jobId" => String.t() | atom(),
        "zipUploadUrl" => String.t() | atom()
      }

  """
  @type create_deployment_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_webhook_request() :: %{
        optional("branchName") => String.t() | atom(),
        optional("description") => String.t() | atom()
      }

  """
  @type update_webhook_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_webhooks_result() :: %{
        "nextToken" => String.t() | atom(),
        "webhooks" => list(webhook())
      }

  """
  @type list_webhooks_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      not_found_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_webhook_request() :: %{
        optional("description") => String.t() | atom(),
        required("branchName") => String.t() | atom()
      }

  """
  @type create_webhook_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      backend_environment() :: %{
        "backendEnvironmentArn" => String.t() | atom(),
        "createTime" => non_neg_integer(),
        "deploymentArtifacts" => String.t() | atom(),
        "environmentName" => String.t() | atom(),
        "stackName" => String.t() | atom(),
        "updateTime" => non_neg_integer()
      }

  """
  @type backend_environment() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_response() :: %{
        "tags" => map()
      }

  """
  @type list_tags_for_resource_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      waf_configuration() :: %{
        "statusReason" => String.t() | atom(),
        "wafStatus" => list(any()),
        "webAclArn" => String.t() | atom()
      }

  """
  @type waf_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_app_result() :: %{
        "app" => app()
      }

  """
  @type delete_app_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_branch_result() :: %{
        "branch" => branch()
      }

  """
  @type update_branch_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_branch_request() :: %{}

  """
  @type get_branch_request() :: %{}

  @typedoc """

  ## Example:

      list_domain_associations_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_domain_associations_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      start_job_request() :: %{
        optional("commitId") => String.t() | atom(),
        optional("commitMessage") => String.t() | atom(),
        optional("commitTime") => non_neg_integer(),
        optional("jobId") => String.t() | atom(),
        optional("jobReason") => String.t() | atom(),
        required("jobType") => list(any())
      }

  """
  @type start_job_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      cache_config() :: %{
        "type" => list(any())
      }

  """
  @type cache_config() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_backend_environments_request() :: %{
        optional("environmentName") => String.t() | atom(),
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_backend_environments_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_backend_environment_request() :: %{}

  """
  @type delete_backend_environment_request() :: %{}

  @typedoc """

  ## Example:

      custom_rule() :: %{
        "condition" => String.t() | atom(),
        "source" => String.t() | atom(),
        "status" => String.t() | atom(),
        "target" => String.t() | atom()
      }

  """
  @type custom_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_branch_result() :: %{
        "branch" => branch()
      }

  """
  @type create_branch_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      certificate() :: %{
        "certificateVerificationDNSRecord" => String.t() | atom(),
        "customCertificateArn" => String.t() | atom(),
        "type" => list(any())
      }

  """
  @type certificate() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_branch_request() :: %{}

  """
  @type delete_branch_request() :: %{}

  @typedoc """

  ## Example:

      get_webhook_request() :: %{}

  """
  @type get_webhook_request() :: %{}

  @typedoc """

  ## Example:

      delete_app_request() :: %{}

  """
  @type delete_app_request() :: %{}

  @typedoc """

  ## Example:

      job_config() :: %{
        "buildComputeType" => list(any())
      }

  """
  @type job_config() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_branch_request() :: %{
        optional("backend") => backend(),
        optional("backendEnvironmentArn") => String.t() | atom(),
        optional("basicAuthCredentials") => String.t() | atom(),
        optional("buildSpec") => String.t() | atom(),
        optional("computeRoleArn") => String.t() | atom(),
        optional("description") => String.t() | atom(),
        optional("displayName") => String.t() | atom(),
        optional("enableAutoBuild") => boolean(),
        optional("enableBasicAuth") => boolean(),
        optional("enableNotification") => boolean(),
        optional("enablePerformanceMode") => boolean(),
        optional("enablePullRequestPreview") => boolean(),
        optional("enableSkewProtection") => boolean(),
        optional("environmentVariables") => map(),
        optional("framework") => String.t() | atom(),
        optional("pullRequestEnvironmentName") => String.t() | atom(),
        optional("stage") => list(any()),
        optional("ttl") => String.t() | atom()
      }

  """
  @type update_branch_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag_resource_response() :: %{}

  """
  @type tag_resource_response() :: %{}

  @typedoc """

  ## Example:

      update_domain_association_result() :: %{
        "domainAssociation" => domain_association()
      }

  """
  @type update_domain_association_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_job_request() :: %{}

  """
  @type delete_job_request() :: %{}

  @typedoc """

  ## Example:

      get_domain_association_result() :: %{
        "domainAssociation" => domain_association()
      }

  """
  @type get_domain_association_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_request() :: %{}

  """
  @type list_tags_for_resource_request() :: %{}

  @typedoc """

  ## Example:

      job() :: %{
        "steps" => list(step()),
        "summary" => job_summary()
      }

  """
  @type job() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_artifacts_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_artifacts_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_app_request() :: %{
        optional("accessToken") => String.t() | atom(),
        optional("autoBranchCreationConfig") => auto_branch_creation_config(),
        optional("autoBranchCreationPatterns") => list(String.t() | atom()),
        optional("basicAuthCredentials") => String.t() | atom(),
        optional("buildSpec") => String.t() | atom(),
        optional("cacheConfig") => cache_config(),
        optional("computeRoleArn") => String.t() | atom(),
        optional("customHeaders") => String.t() | atom(),
        optional("customRules") => list(custom_rule()),
        optional("description") => String.t() | atom(),
        optional("enableAutoBranchCreation") => boolean(),
        optional("enableBasicAuth") => boolean(),
        optional("enableBranchAutoBuild") => boolean(),
        optional("enableBranchAutoDeletion") => boolean(),
        optional("environmentVariables") => map(),
        optional("iamServiceRoleArn") => String.t() | atom(),
        optional("jobConfig") => job_config(),
        optional("name") => String.t() | atom(),
        optional("oauthToken") => String.t() | atom(),
        optional("platform") => list(any()),
        optional("repository") => String.t() | atom()
      }

  """
  @type update_app_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_job_request() :: %{}

  """
  @type get_job_request() :: %{}

  @typedoc """

  ## Example:

      certificate_settings() :: %{
        "customCertificateArn" => String.t() | atom(),
        "type" => list(any())
      }

  """
  @type certificate_settings() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      limit_exceeded_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type limit_exceeded_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_apps_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_apps_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_app_result() :: %{
        "app" => app()
      }

  """
  @type get_app_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      bad_request_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type bad_request_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_domain_association_result() :: %{
        "domainAssociation" => domain_association()
      }

  """
  @type delete_domain_association_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      artifact() :: %{
        "artifactFileName" => String.t() | atom(),
        "artifactId" => String.t() | atom()
      }

  """
  @type artifact() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_artifacts_result() :: %{
        "artifacts" => list(artifact()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_artifacts_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_webhook_result() :: %{
        "webhook" => webhook()
      }

  """
  @type get_webhook_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      step() :: %{
        "artifactsUrl" => String.t() | atom(),
        "context" => String.t() | atom(),
        "endTime" => non_neg_integer(),
        "logUrl" => String.t() | atom(),
        "screenshots" => map(),
        "startTime" => non_neg_integer(),
        "status" => list(any()),
        "statusReason" => String.t() | atom(),
        "stepName" => String.t() | atom(),
        "testArtifactsUrl" => String.t() | atom(),
        "testConfigUrl" => String.t() | atom()
      }

  """
  @type step() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_webhooks_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_webhooks_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_branch_result() :: %{
        "branch" => branch()
      }

  """
  @type get_branch_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_branch_result() :: %{
        "branch" => branch()
      }

  """
  @type delete_branch_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_app_result() :: %{
        "app" => app()
      }

  """
  @type create_app_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_backend_environment_request() :: %{}

  """
  @type get_backend_environment_request() :: %{}

  @typedoc """

  ## Example:

      auto_branch_creation_config() :: %{
        "basicAuthCredentials" => String.t() | atom(),
        "buildSpec" => String.t() | atom(),
        "enableAutoBuild" => boolean(),
        "enableBasicAuth" => boolean(),
        "enablePerformanceMode" => boolean(),
        "enablePullRequestPreview" => boolean(),
        "environmentVariables" => map(),
        "framework" => String.t() | atom(),
        "pullRequestEnvironmentName" => String.t() | atom(),
        "stage" => list(any())
      }

  """
  @type auto_branch_creation_config() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_branches_request() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom()
      }

  """
  @type list_branches_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_artifact_url_result() :: %{
        "artifactId" => String.t() | atom(),
        "artifactUrl" => String.t() | atom()
      }

  """
  @type get_artifact_url_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_domain_associations_result() :: %{
        "domainAssociations" => list(domain_association()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_domain_associations_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      webhook() :: %{
        "appId" => String.t() | atom(),
        "branchName" => String.t() | atom(),
        "createTime" => non_neg_integer(),
        "description" => String.t() | atom(),
        "updateTime" => non_neg_integer(),
        "webhookArn" => String.t() | atom(),
        "webhookId" => String.t() | atom(),
        "webhookUrl" => String.t() | atom()
      }

  """
  @type webhook() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      stop_job_result() :: %{
        "jobSummary" => job_summary()
      }

  """
  @type stop_job_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      start_deployment_request() :: %{
        optional("jobId") => String.t() | atom(),
        optional("sourceUrl") => String.t() | atom(),
        optional("sourceUrlType") => list(any())
      }

  """
  @type start_deployment_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_domain_association_result() :: %{
        "domainAssociation" => domain_association()
      }

  """
  @type create_domain_association_result() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_webhook_result() :: %{
        "webhook" => webhook()
      }

  """
  @type update_webhook_result() :: %{(String.t() | atom()) => any()}

  @type create_app_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type create_backend_environment_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type create_branch_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type create_deployment_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type create_domain_association_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type create_webhook_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_app_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_backend_environment_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_branch_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_domain_association_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_job_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type delete_webhook_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type generate_access_logs_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_app_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_artifact_url_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_backend_environment_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_branch_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_domain_association_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_job_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type get_webhook_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type list_apps_errors() ::
          bad_request_exception() | unauthorized_exception() | internal_failure_exception()

  @type list_artifacts_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type list_backend_environments_errors() ::
          bad_request_exception() | unauthorized_exception() | internal_failure_exception()

  @type list_branches_errors() ::
          bad_request_exception() | unauthorized_exception() | internal_failure_exception()

  @type list_domain_associations_errors() ::
          bad_request_exception() | unauthorized_exception() | internal_failure_exception()

  @type list_jobs_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type list_tags_for_resource_errors() ::
          bad_request_exception() | resource_not_found_exception() | internal_failure_exception()

  @type list_webhooks_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type start_deployment_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type start_job_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type stop_job_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type tag_resource_errors() ::
          bad_request_exception() | resource_not_found_exception() | internal_failure_exception()

  @type untag_resource_errors() ::
          bad_request_exception() | resource_not_found_exception() | internal_failure_exception()

  @type update_app_errors() ::
          bad_request_exception()
          | not_found_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type update_branch_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type update_domain_association_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  @type update_webhook_errors() ::
          bad_request_exception()
          | not_found_exception()
          | dependent_service_failure_exception()
          | unauthorized_exception()
          | internal_failure_exception()

  def metadata do
    %{
      api_version: "2017-07-25",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "amplify",
      global?: false,
      hostname: nil,
      protocol: "rest-json",
      service_id: "Amplify",
      signature_version: "v4",
      signing_name: "amplify",
      target_prefix: nil
    }
  end

  @doc """
  Creates a new Amplify app.
  """
  @spec create_app(map(), create_app_request(), list()) ::
          {:ok, create_app_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_app_errors()}
  def create_app(%Client{} = client, input, options \\ []) do
    url_path = "/apps"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new backend environment for an Amplify app.

  This API is available only to Amplify Gen 1 applications where the
  backend is created using Amplify Studio or the Amplify
  command line interface (CLI). This API isn’t available to Amplify Gen 2
  applications. When you deploy an application with Amplify Gen 2, you provision
  the app's
  backend infrastructure using Typescript code.
  """
  @spec create_backend_environment(
          map(),
          String.t() | atom(),
          create_backend_environment_request(),
          list()
        ) ::
          {:ok, create_backend_environment_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_backend_environment_errors()}
  def create_backend_environment(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/backendenvironments"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new branch for an Amplify app.
  """
  @spec create_branch(map(), String.t() | atom(), create_branch_request(), list()) ::
          {:ok, create_branch_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_branch_errors()}
  def create_branch(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/branches"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a deployment for a manually deployed Amplify app.

  Manually deployed apps are
  not connected to a Git repository.

  The maximum duration between the `CreateDeployment` call and the
  `StartDeployment` call cannot exceed 8 hours. If the duration exceeds 8
  hours, the `StartDeployment` call and the associated `Job` will
  fail.
  """
  @spec create_deployment(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          create_deployment_request(),
          list()
        ) ::
          {:ok, create_deployment_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_deployment_errors()}
  def create_deployment(%Client{} = client, app_id, branch_name, input, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/deployments"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new domain association for an Amplify app.

  This action associates a custom
  domain with the Amplify app
  """
  @spec create_domain_association(
          map(),
          String.t() | atom(),
          create_domain_association_request(),
          list()
        ) ::
          {:ok, create_domain_association_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_domain_association_errors()}
  def create_domain_association(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/domains"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new webhook on an Amplify app.
  """
  @spec create_webhook(map(), String.t() | atom(), create_webhook_request(), list()) ::
          {:ok, create_webhook_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_webhook_errors()}
  def create_webhook(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/webhooks"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes an existing Amplify app specified by an app ID.
  """
  @spec delete_app(map(), String.t() | atom(), delete_app_request(), list()) ::
          {:ok, delete_app_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_app_errors()}
  def delete_app(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a backend environment for an Amplify app.

  This API is available only to Amplify Gen 1 applications where the
  backend is created using Amplify Studio or the Amplify
  command line interface (CLI). This API isn’t available to Amplify Gen 2
  applications. When you deploy an application with Amplify Gen 2, you provision
  the app's
  backend infrastructure using Typescript code.
  """
  @spec delete_backend_environment(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          delete_backend_environment_request(),
          list()
        ) ::
          {:ok, delete_backend_environment_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_backend_environment_errors()}
  def delete_backend_environment(
        %Client{} = client,
        app_id,
        environment_name,
        input,
        options \\ []
      ) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/backendenvironments/#{AWS.Util.encode_uri(environment_name)}"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a branch for an Amplify app.
  """
  @spec delete_branch(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          delete_branch_request(),
          list()
        ) ::
          {:ok, delete_branch_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_branch_errors()}
  def delete_branch(%Client{} = client, app_id, branch_name, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a domain association for an Amplify app.
  """
  @spec delete_domain_association(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          delete_domain_association_request(),
          list()
        ) ::
          {:ok, delete_domain_association_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_domain_association_errors()}
  def delete_domain_association(%Client{} = client, app_id, domain_name, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/domains/#{AWS.Util.encode_uri(domain_name)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a job for a branch of an Amplify app.
  """
  @spec delete_job(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom(),
          delete_job_request(),
          list()
        ) ::
          {:ok, delete_job_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_job_errors()}
  def delete_job(%Client{} = client, app_id, branch_name, job_id, input, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs/#{AWS.Util.encode_uri(job_id)}"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a webhook.
  """
  @spec delete_webhook(map(), String.t() | atom(), delete_webhook_request(), list()) ::
          {:ok, delete_webhook_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_webhook_errors()}
  def delete_webhook(%Client{} = client, webhook_id, input, options \\ []) do
    url_path = "/webhooks/#{AWS.Util.encode_uri(webhook_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns the website access logs for a specific time range using a presigned URL.
  """
  @spec generate_access_logs(map(), String.t() | atom(), generate_access_logs_request(), list()) ::
          {:ok, generate_access_logs_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, generate_access_logs_errors()}
  def generate_access_logs(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/accesslogs"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns an existing Amplify app specified by an app ID.
  """
  @spec get_app(map(), String.t() | atom(), list()) ::
          {:ok, get_app_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_app_errors()}
  def get_app(%Client{} = client, app_id, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns the artifact info that corresponds to an artifact id.
  """
  @spec get_artifact_url(map(), String.t() | atom(), list()) ::
          {:ok, get_artifact_url_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_artifact_url_errors()}
  def get_artifact_url(%Client{} = client, artifact_id, options \\ []) do
    url_path = "/artifacts/#{AWS.Util.encode_uri(artifact_id)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a backend environment for an Amplify app.

  This API is available only to Amplify Gen 1 applications where the
  backend is created using Amplify Studio or the Amplify
  command line interface (CLI). This API isn’t available to Amplify Gen 2
  applications. When you deploy an application with Amplify Gen 2, you provision
  the app's
  backend infrastructure using Typescript code.
  """
  @spec get_backend_environment(map(), String.t() | atom(), String.t() | atom(), list()) ::
          {:ok, get_backend_environment_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_backend_environment_errors()}
  def get_backend_environment(%Client{} = client, app_id, environment_name, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/backendenvironments/#{AWS.Util.encode_uri(environment_name)}"

    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a branch for an Amplify app.
  """
  @spec get_branch(map(), String.t() | atom(), String.t() | atom(), list()) ::
          {:ok, get_branch_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_branch_errors()}
  def get_branch(%Client{} = client, app_id, branch_name, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns the domain information for an Amplify app.
  """
  @spec get_domain_association(map(), String.t() | atom(), String.t() | atom(), list()) ::
          {:ok, get_domain_association_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_domain_association_errors()}
  def get_domain_association(%Client{} = client, app_id, domain_name, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/domains/#{AWS.Util.encode_uri(domain_name)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a job for a branch of an Amplify app.
  """
  @spec get_job(map(), String.t() | atom(), String.t() | atom(), String.t() | atom(), list()) ::
          {:ok, get_job_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_job_errors()}
  def get_job(%Client{} = client, app_id, branch_name, job_id, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs/#{AWS.Util.encode_uri(job_id)}"

    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns the webhook information that corresponds to a specified webhook ID.
  """
  @spec get_webhook(map(), String.t() | atom(), list()) ::
          {:ok, get_webhook_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_webhook_errors()}
  def get_webhook(%Client{} = client, webhook_id, options \\ []) do
    url_path = "/webhooks/#{AWS.Util.encode_uri(webhook_id)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of the existing Amplify apps.
  """
  @spec list_apps(map(), String.t() | atom() | nil, String.t() | atom() | nil, list()) ::
          {:ok, list_apps_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_apps_errors()}
  def list_apps(%Client{} = client, max_results \\ nil, next_token \\ nil, options \\ []) do
    url_path = "/apps"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of end-to-end testing artifacts for a specified app, branch, and
  job.

  To return the build artifacts, use the
  [GetJob](https://docs.aws.amazon.com/amplify/latest/APIReference/API_GetJob.html) API.

  For more information about Amplify testing support, see [Setting up
  end-to-end Cypress tests for your Amplify
  application](https://docs.aws.amazon.com/amplify/latest/userguide/running-tests.html)
  in the
  *Amplify Hosting User Guide*.
  """
  @spec list_artifacts(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_artifacts_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_artifacts_errors()}
  def list_artifacts(
        %Client{} = client,
        app_id,
        branch_name,
        job_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs/#{AWS.Util.encode_uri(job_id)}/artifacts"

    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Lists the backend environments for an Amplify app.

  This API is available only to Amplify Gen 1 applications where the
  backend is created using Amplify Studio or the Amplify
  command line interface (CLI). This API isn’t available to Amplify Gen 2
  applications. When you deploy an application with Amplify Gen 2, you provision
  the app's
  backend infrastructure using Typescript code.
  """
  @spec list_backend_environments(
          map(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_backend_environments_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_backend_environments_errors()}
  def list_backend_environments(
        %Client{} = client,
        app_id,
        environment_name \\ nil,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/backendenvironments"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(environment_name) do
        [{"environmentName", environment_name} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Lists the branches of an Amplify app.
  """
  @spec list_branches(
          map(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_branches_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_branches_errors()}
  def list_branches(
        %Client{} = client,
        app_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/branches"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns the domain associations for an Amplify app.
  """
  @spec list_domain_associations(
          map(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_domain_associations_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_domain_associations_errors()}
  def list_domain_associations(
        %Client{} = client,
        app_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/domains"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Lists the jobs for a branch of an Amplify app.
  """
  @spec list_jobs(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_jobs_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_jobs_errors()}
  def list_jobs(
        %Client{} = client,
        app_id,
        branch_name,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs"

    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of tags for a specified Amazon Resource Name (ARN).
  """
  @spec list_tags_for_resource(map(), String.t() | atom(), list()) ::
          {:ok, list_tags_for_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_tags_for_resource_errors()}
  def list_tags_for_resource(%Client{} = client, resource_arn, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of webhooks for an Amplify app.
  """
  @spec list_webhooks(
          map(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_webhooks_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_webhooks_errors()}
  def list_webhooks(
        %Client{} = client,
        app_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/webhooks"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"nextToken", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"maxResults", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Starts a deployment for a manually deployed app.

  Manually deployed apps are not
  connected to a Git repository.

  The maximum duration between the `CreateDeployment` call and the
  `StartDeployment` call cannot exceed 8 hours. If the duration exceeds 8
  hours, the `StartDeployment` call and the associated `Job` will
  fail.
  """
  @spec start_deployment(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          start_deployment_request(),
          list()
        ) ::
          {:ok, start_deployment_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_deployment_errors()}
  def start_deployment(%Client{} = client, app_id, branch_name, input, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/deployments/start"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Starts a new job for a branch of an Amplify app.
  """
  @spec start_job(map(), String.t() | atom(), String.t() | atom(), start_job_request(), list()) ::
          {:ok, start_job_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_job_errors()}
  def start_job(%Client{} = client, app_id, branch_name, input, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Stops a job that is in progress for a branch of an Amplify app.
  """
  @spec stop_job(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom(),
          stop_job_request(),
          list()
        ) ::
          {:ok, stop_job_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, stop_job_errors()}
  def stop_job(%Client{} = client, app_id, branch_name, job_id, input, options \\ []) do
    url_path =
      "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}/jobs/#{AWS.Util.encode_uri(job_id)}/stop"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Tags the resource with a tag key and value.
  """
  @spec tag_resource(map(), String.t() | atom(), tag_resource_request(), list()) ::
          {:ok, tag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, tag_resource_errors()}
  def tag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Untags a resource with a specified Amazon Resource Name (ARN).
  """
  @spec untag_resource(map(), String.t() | atom(), untag_resource_request(), list()) ::
          {:ok, untag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, untag_resource_errors()}
  def untag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    custom_headers = []

    {query_params, input} =
      [
        {"tagKeys", "tagKeys"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Updates an existing Amplify app.
  """
  @spec update_app(map(), String.t() | atom(), update_app_request(), list()) ::
          {:ok, update_app_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_app_errors()}
  def update_app(%Client{} = client, app_id, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Updates a branch for an Amplify app.
  """
  @spec update_branch(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          update_branch_request(),
          list()
        ) ::
          {:ok, update_branch_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_branch_errors()}
  def update_branch(%Client{} = client, app_id, branch_name, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/branches/#{AWS.Util.encode_uri(branch_name)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new domain association for an Amplify app.
  """
  @spec update_domain_association(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          update_domain_association_request(),
          list()
        ) ::
          {:ok, update_domain_association_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_domain_association_errors()}
  def update_domain_association(%Client{} = client, app_id, domain_name, input, options \\ []) do
    url_path = "/apps/#{AWS.Util.encode_uri(app_id)}/domains/#{AWS.Util.encode_uri(domain_name)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Updates a webhook.
  """
  @spec update_webhook(map(), String.t() | atom(), update_webhook_request(), list()) ::
          {:ok, update_webhook_result(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_webhook_errors()}
  def update_webhook(%Client{} = client, webhook_id, input, options \\ []) do
    url_path = "/webhooks/#{AWS.Util.encode_uri(webhook_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end
end
