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

defmodule AWS.Pipes do
  @moduledoc """
  Amazon EventBridge Pipes connects event sources to targets.

  Pipes reduces the need
  for specialized knowledge and integration code when developing event driven
  architectures.
  This helps ensures consistency across your company’s applications. With Pipes,
  the target
  can be any available EventBridge target. To set up a pipe, you select the event
  source, add optional event filtering, define optional enrichment, and select the
  target for
  the event data.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      pipe_source_rabbit_mq_broker_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "QueueName" => String.t() | atom(),
        "VirtualHost" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_active_mq_broker_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer()
      }

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

  @typedoc """

  ## Example:

      delete_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      pipe_target_sage_maker_pipeline_parameters() :: %{
        "PipelineParameterList" => list(sage_maker_pipeline_parameter())
      }

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

  @typedoc """

  ## Example:

      pipe_log_configuration() :: %{
        "CloudwatchLogsLogDestination" => cloudwatch_logs_log_destination(),
        "FirehoseLogDestination" => firehose_log_destination(),
        "IncludeExecutionData" => list(String.t() | atom()),
        "Level" => String.t() | atom(),
        "S3LogDestination" => s3_log_destination()
      }

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

  @typedoc """

  ## Example:

      cloudwatch_logs_log_destination_parameters() :: %{
        "LogGroupArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      batch_retry_strategy() :: %{
        "Attempts" => integer()
      }

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

  @typedoc """

  ## Example:

      update_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      ecs_environment_variable() :: %{
        "name" => String.t() | atom(),
        "value" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_self_managed_kafka_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "ServerRootCaCertificate" => String.t() | atom(),
        "Vpc" => self_managed_kafka_access_configuration_vpc()
      }

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

  @typedoc """

  ## Example:

      update_pipe_request() :: %{
        optional("Description") => String.t() | atom(),
        optional("DesiredState") => String.t() | atom(),
        optional("Enrichment") => String.t() | atom(),
        optional("EnrichmentParameters") => pipe_enrichment_parameters(),
        optional("KmsKeyIdentifier") => String.t() | atom(),
        optional("LogConfiguration") => pipe_log_configuration_parameters(),
        optional("SourceParameters") => update_pipe_source_parameters(),
        optional("Target") => String.t() | atom(),
        optional("TargetParameters") => pipe_target_parameters(),
        required("RoleArn") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      untag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      filter_criteria() :: %{
        "Filters" => list(filter())
      }

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

  @typedoc """

  ## Example:

      list_pipes_request() :: %{
        optional("CurrentState") => String.t() | atom(),
        optional("DesiredState") => String.t() | atom(),
        optional("Limit") => integer(),
        optional("NamePrefix") => String.t() | atom(),
        optional("NextToken") => String.t() | atom(),
        optional("SourcePrefix") => String.t() | atom(),
        optional("TargetPrefix") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      ecs_inference_accelerator_override() :: %{
        "deviceName" => String.t() | atom(),
        "deviceType" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      start_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      batch_array_properties() :: %{
        "Size" => integer()
      }

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

  @typedoc """

  ## Example:

      multi_measure_attribute_mapping() :: %{
        "MeasureValue" => String.t() | atom(),
        "MeasureValueType" => String.t() | atom(),
        "MultiMeasureAttributeName" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_state_machine_parameters() :: %{
        "InvocationType" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_event_bridge_event_bus_parameters() :: %{
        "DetailType" => String.t() | atom(),
        "EndpointId" => String.t() | atom(),
        "Resources" => list(String.t() | atom()),
        "Source" => String.t() | atom(),
        "Time" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      sage_maker_pipeline_parameter() :: %{
        "Name" => String.t() | atom(),
        "Value" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      batch_resource_requirement() :: %{
        "Type" => String.t() | atom(),
        "Value" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      describe_pipe_request() :: %{}

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

  @typedoc """

  ## Example:

      s3_log_destination() :: %{
        "BucketName" => String.t() | atom(),
        "BucketOwner" => String.t() | atom(),
        "OutputFormat" => String.t() | atom(),
        "Prefix" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_rabbit_mq_broker_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer()
      }

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

  @typedoc """

  ## Example:

      pipe_source_managed_streaming_kafka_parameters() :: %{
        "BatchSize" => integer(),
        "ConsumerGroupID" => String.t() | atom(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "StartingPosition" => String.t() | atom(),
        "TopicName" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      firehose_log_destination_parameters() :: %{
        "DeliveryStreamArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      start_pipe_request() :: %{}

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

  @typedoc """

  ## Example:

      cloudwatch_logs_log_destination() :: %{
        "LogGroupArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "Enrichment" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom(),
        "Source" => String.t() | atom(),
        "StateReason" => String.t() | atom(),
        "Target" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_parameters() :: %{
        "BatchJobParameters" => pipe_target_batch_job_parameters(),
        "CloudWatchLogsParameters" => pipe_target_cloud_watch_logs_parameters(),
        "EcsTaskParameters" => pipe_target_ecs_task_parameters(),
        "EventBridgeEventBusParameters" => pipe_target_event_bridge_event_bus_parameters(),
        "HttpParameters" => pipe_target_http_parameters(),
        "InputTemplate" => String.t() | atom(),
        "KinesisStreamParameters" => pipe_target_kinesis_stream_parameters(),
        "LambdaFunctionParameters" => pipe_target_lambda_function_parameters(),
        "RedshiftDataParameters" => pipe_target_redshift_data_parameters(),
        "SageMakerPipelineParameters" => pipe_target_sage_maker_pipeline_parameters(),
        "SqsQueueParameters" => pipe_target_sqs_queue_parameters(),
        "StepFunctionStateMachineParameters" => pipe_target_state_machine_parameters(),
        "TimestreamParameters" => pipe_target_timestream_parameters()
      }

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

  @typedoc """

  ## Example:

      pipe_source_parameters() :: %{
        "ActiveMQBrokerParameters" => pipe_source_active_mq_broker_parameters(),
        "DynamoDBStreamParameters" => pipe_source_dynamo_db_stream_parameters(),
        "FilterCriteria" => filter_criteria(),
        "KinesisStreamParameters" => pipe_source_kinesis_stream_parameters(),
        "ManagedStreamingKafkaParameters" => pipe_source_managed_streaming_kafka_parameters(),
        "RabbitMQBrokerParameters" => pipe_source_rabbit_mq_broker_parameters(),
        "SelfManagedKafkaParameters" => pipe_source_self_managed_kafka_parameters(),
        "SqsQueueParameters" => pipe_source_sqs_queue_parameters()
      }

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

  @typedoc """

  ## Example:

      conflict_exception() :: %{
        "message" => [String.t() | atom()],
        "resourceId" => [String.t() | atom()],
        "resourceType" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      single_measure_mapping() :: %{
        "MeasureName" => String.t() | atom(),
        "MeasureValue" => String.t() | atom(),
        "MeasureValueType" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      tag() :: %{
        "Key" => String.t() | atom(),
        "Value" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_batch_job_parameters() :: %{
        "ArrayProperties" => batch_array_properties(),
        "ContainerOverrides" => batch_container_overrides(),
        "DependsOn" => list(batch_job_dependency()),
        "JobDefinition" => [String.t() | atom()],
        "JobName" => [String.t() | atom()],
        "Parameters" => map(),
        "RetryStrategy" => batch_retry_strategy()
      }

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

  @typedoc """

  ## Example:

      pipe_source_sqs_queue_parameters() :: %{
        "BatchSize" => integer(),
        "MaximumBatchingWindowInSeconds" => integer()
      }

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

  @typedoc """

  ## Example:

      service_quota_exceeded_exception() :: %{
        "message" => [String.t() | atom()],
        "quotaCode" => [String.t() | atom()],
        "resourceId" => [String.t() | atom()],
        "resourceType" => [String.t() | atom()],
        "serviceCode" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      pipe_target_http_parameters() :: %{
        "HeaderParameters" => map(),
        "PathParameterValues" => list(String.t() | atom()),
        "QueryStringParameters" => map()
      }

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

  @typedoc """

  ## Example:

      pipe_target_sqs_queue_parameters() :: %{
        "MessageDeduplicationId" => String.t() | atom(),
        "MessageGroupId" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_kinesis_stream_parameters() :: %{
        "PartitionKey" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      list_pipes_response() :: %{
        "NextToken" => String.t() | atom(),
        "Pipes" => list(pipe())
      }

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

  @typedoc """

  ## Example:

      pipe_target_cloud_watch_logs_parameters() :: %{
        "LogStreamName" => String.t() | atom(),
        "Timestamp" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      s3_log_destination_parameters() :: %{
        "BucketName" => String.t() | atom(),
        "BucketOwner" => String.t() | atom(),
        "OutputFormat" => String.t() | atom(),
        "Prefix" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      create_pipe_request() :: %{
        optional("Description") => String.t() | atom(),
        optional("DesiredState") => String.t() | atom(),
        optional("Enrichment") => String.t() | atom(),
        optional("EnrichmentParameters") => pipe_enrichment_parameters(),
        optional("KmsKeyIdentifier") => String.t() | atom(),
        optional("LogConfiguration") => pipe_log_configuration_parameters(),
        optional("SourceParameters") => pipe_source_parameters(),
        optional("Tags") => map(),
        optional("TargetParameters") => pipe_target_parameters(),
        required("RoleArn") => String.t() | atom(),
        required("Source") => String.t() | atom(),
        required("Target") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      multi_measure_mapping() :: %{
        "MultiMeasureAttributeMappings" => list(multi_measure_attribute_mapping()),
        "MultiMeasureName" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      validation_exception_field() :: %{
        "message" => String.t() | atom(),
        "name" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      filter() :: %{
        "Pattern" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      ecs_container_override() :: %{
        "Command" => list(String.t() | atom()),
        "Cpu" => [integer()],
        "Environment" => list(ecs_environment_variable()),
        "EnvironmentFiles" => list(ecs_environment_file()),
        "Memory" => [integer()],
        "MemoryReservation" => [integer()],
        "Name" => String.t() | atom(),
        "ResourceRequirements" => list(ecs_resource_requirement())
      }

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

  @typedoc """

  ## Example:

      ecs_environment_file() :: %{
        "type" => String.t() | atom(),
        "value" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      stop_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      ecs_task_override() :: %{
        "ContainerOverrides" => list(ecs_container_override()),
        "Cpu" => String.t() | atom(),
        "EphemeralStorage" => ecs_ephemeral_storage(),
        "ExecutionRoleArn" => String.t() | atom(),
        "InferenceAcceleratorOverrides" => list(ecs_inference_accelerator_override()),
        "Memory" => String.t() | atom(),
        "TaskRoleArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      capacity_provider_strategy_item() :: %{
        "base" => integer(),
        "capacityProvider" => String.t() | atom(),
        "weight" => integer()
      }

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

  @typedoc """

  ## Example:

      placement_constraint() :: %{
        "expression" => String.t() | atom(),
        "type" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      network_configuration() :: %{
        "awsvpcConfiguration" => aws_vpc_configuration()
      }

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

  @typedoc """

  ## Example:

      pipe_source_kinesis_stream_parameters() :: %{
        "BatchSize" => integer(),
        "DeadLetterConfig" => dead_letter_config(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "MaximumRecordAgeInSeconds" => integer(),
        "MaximumRetryAttempts" => integer(),
        "OnPartialBatchItemFailure" => String.t() | atom(),
        "ParallelizationFactor" => integer(),
        "StartingPosition" => String.t() | atom(),
        "StartingPositionTimestamp" => non_neg_integer()
      }

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

  @typedoc """

  ## Example:

      internal_exception() :: %{
        "message" => [String.t() | atom()],
        "retryAfterSeconds" => [integer()]
      }

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

  @typedoc """

  ## Example:

      pipe_target_ecs_task_parameters() :: %{
        "CapacityProviderStrategy" => list(capacity_provider_strategy_item()),
        "EnableECSManagedTags" => boolean(),
        "EnableExecuteCommand" => boolean(),
        "Group" => String.t() | atom(),
        "LaunchType" => String.t() | atom(),
        "NetworkConfiguration" => network_configuration(),
        "Overrides" => ecs_task_override(),
        "PlacementConstraints" => list(placement_constraint()),
        "PlacementStrategy" => list(placement_strategy()),
        "PlatformVersion" => String.t() | atom(),
        "PropagateTags" => String.t() | atom(),
        "ReferenceId" => String.t() | atom(),
        "Tags" => list(tag()),
        "TaskCount" => integer(),
        "TaskDefinitionArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      delete_pipe_request() :: %{}

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

  @typedoc """

  ## Example:

      tag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      create_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "Name" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_target_timestream_parameters() :: %{
        "DimensionMappings" => list(dimension_mapping()),
        "EpochTimeUnit" => String.t() | atom(),
        "MultiMeasureMappings" => list(multi_measure_mapping()),
        "SingleMeasureMappings" => list(single_measure_mapping()),
        "TimeFieldType" => String.t() | atom(),
        "TimeValue" => String.t() | atom(),
        "TimestampFormat" => String.t() | atom(),
        "VersionValue" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      dead_letter_config() :: %{
        "Arn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      validation_exception() :: %{
        "fieldList" => list(validation_exception_field()),
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      list_tags_for_resource_request() :: %{}

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

  @typedoc """

  ## Example:

      pipe_target_lambda_function_parameters() :: %{
        "InvocationType" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      throttling_exception() :: %{
        "message" => [String.t() | atom()],
        "quotaCode" => [String.t() | atom()],
        "retryAfterSeconds" => [integer()],
        "serviceCode" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      pipe_target_redshift_data_parameters() :: %{
        "Database" => String.t() | atom(),
        "DbUser" => String.t() | atom(),
        "SecretManagerArn" => String.t() | atom(),
        "Sqls" => list(String.t() | atom()),
        "StatementName" => String.t() | atom(),
        "WithEvent" => boolean()
      }

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

  @typedoc """

  ## Example:

      pipe_source_dynamo_db_stream_parameters() :: %{
        "BatchSize" => integer(),
        "DeadLetterConfig" => dead_letter_config(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "MaximumRecordAgeInSeconds" => integer(),
        "MaximumRetryAttempts" => integer(),
        "OnPartialBatchItemFailure" => String.t() | atom(),
        "ParallelizationFactor" => integer(),
        "StartingPosition" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_managed_streaming_kafka_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer()
      }

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

  @typedoc """

  ## Example:

      batch_job_dependency() :: %{
        "JobId" => [String.t() | atom()],
        "Type" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      stop_pipe_request() :: %{}

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

  @typedoc """

  ## Example:

      aws_vpc_configuration() :: %{
        "AssignPublicIp" => String.t() | atom(),
        "SecurityGroups" => list(String.t() | atom()),
        "Subnets" => list(String.t() | atom())
      }

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

  @typedoc """

  ## Example:

      pipe_log_configuration_parameters() :: %{
        "CloudwatchLogsLogDestination" => cloudwatch_logs_log_destination_parameters(),
        "FirehoseLogDestination" => firehose_log_destination_parameters(),
        "IncludeExecutionData" => list(String.t() | atom()),
        "Level" => String.t() | atom(),
        "S3LogDestination" => s3_log_destination_parameters()
      }

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

  @typedoc """

  ## Example:

      ecs_ephemeral_storage() :: %{
        "sizeInGiB" => integer()
      }

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

  @typedoc """

  ## Example:

      ecs_resource_requirement() :: %{
        "type" => String.t() | atom(),
        "value" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_kinesis_stream_parameters() :: %{
        "BatchSize" => integer(),
        "DeadLetterConfig" => dead_letter_config(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "MaximumRecordAgeInSeconds" => integer(),
        "MaximumRetryAttempts" => integer(),
        "OnPartialBatchItemFailure" => String.t() | atom(),
        "ParallelizationFactor" => integer()
      }

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

  @typedoc """

  ## Example:

      pipe_source_self_managed_kafka_parameters() :: %{
        "AdditionalBootstrapServers" => list(String.t() | atom()),
        "BatchSize" => integer(),
        "ConsumerGroupID" => String.t() | atom(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "ServerRootCaCertificate" => String.t() | atom(),
        "StartingPosition" => String.t() | atom(),
        "TopicName" => String.t() | atom(),
        "Vpc" => self_managed_kafka_access_configuration_vpc()
      }

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

  @typedoc """

  ## Example:

      batch_container_overrides() :: %{
        "Command" => list(String.t() | atom()),
        "Environment" => list(batch_environment_variable()),
        "InstanceType" => [String.t() | atom()],
        "ResourceRequirements" => list(batch_resource_requirement())
      }

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

  @typedoc """

  ## Example:

      batch_environment_variable() :: %{
        "Name" => [String.t() | atom()],
        "Value" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      pipe_enrichment_http_parameters() :: %{
        "HeaderParameters" => map(),
        "PathParameterValues" => list(String.t() | atom()),
        "QueryStringParameters" => map()
      }

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

  @typedoc """

  ## Example:

      dimension_mapping() :: %{
        "DimensionName" => String.t() | atom(),
        "DimensionValue" => String.t() | atom(),
        "DimensionValueType" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_sqs_queue_parameters() :: %{
        "BatchSize" => integer(),
        "MaximumBatchingWindowInSeconds" => integer()
      }

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

  @typedoc """

  ## Example:

      firehose_log_destination() :: %{
        "DeliveryStreamArn" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      pipe_enrichment_parameters() :: %{
        "HttpParameters" => pipe_enrichment_http_parameters(),
        "InputTemplate" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_parameters() :: %{
        "ActiveMQBrokerParameters" => update_pipe_source_active_mq_broker_parameters(),
        "DynamoDBStreamParameters" => update_pipe_source_dynamo_db_stream_parameters(),
        "FilterCriteria" => filter_criteria(),
        "KinesisStreamParameters" => update_pipe_source_kinesis_stream_parameters(),
        "ManagedStreamingKafkaParameters" => update_pipe_source_managed_streaming_kafka_parameters(),
        "RabbitMQBrokerParameters" => update_pipe_source_rabbit_mq_broker_parameters(),
        "SelfManagedKafkaParameters" => update_pipe_source_self_managed_kafka_parameters(),
        "SqsQueueParameters" => update_pipe_source_sqs_queue_parameters()
      }

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

  @typedoc """

  ## Example:

      self_managed_kafka_access_configuration_vpc() :: %{
        "SecurityGroup" => list(String.t() | atom()),
        "Subnets" => list(String.t() | atom())
      }

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

  @typedoc """

  ## Example:

      describe_pipe_response() :: %{
        "Arn" => String.t() | atom(),
        "CreationTime" => non_neg_integer(),
        "CurrentState" => String.t() | atom(),
        "Description" => String.t() | atom(),
        "DesiredState" => String.t() | atom(),
        "Enrichment" => String.t() | atom(),
        "EnrichmentParameters" => pipe_enrichment_parameters(),
        "KmsKeyIdentifier" => String.t() | atom(),
        "LastModifiedTime" => non_neg_integer(),
        "LogConfiguration" => pipe_log_configuration(),
        "Name" => String.t() | atom(),
        "RoleArn" => String.t() | atom(),
        "Source" => String.t() | atom(),
        "SourceParameters" => pipe_source_parameters(),
        "StateReason" => String.t() | atom(),
        "Tags" => map(),
        "Target" => String.t() | atom(),
        "TargetParameters" => pipe_target_parameters()
      }

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

  @typedoc """

  ## Example:

      placement_strategy() :: %{
        "field" => String.t() | atom(),
        "type" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      update_pipe_source_dynamo_db_stream_parameters() :: %{
        "BatchSize" => integer(),
        "DeadLetterConfig" => dead_letter_config(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "MaximumRecordAgeInSeconds" => integer(),
        "MaximumRetryAttempts" => integer(),
        "OnPartialBatchItemFailure" => String.t() | atom(),
        "ParallelizationFactor" => integer()
      }

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

  @typedoc """

  ## Example:

      pipe_source_active_mq_broker_parameters() :: %{
        "BatchSize" => integer(),
        "Credentials" => list(),
        "MaximumBatchingWindowInSeconds" => integer(),
        "QueueName" => String.t() | atom()
      }

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

  @type create_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()
          | service_quota_exceeded_exception()
          | conflict_exception()

  @type delete_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()
          | conflict_exception()

  @type describe_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()

  @type list_pipes_errors() ::
          throttling_exception() | validation_exception() | internal_exception()

  @type list_tags_for_resource_errors() ::
          validation_exception() | internal_exception() | not_found_exception()

  @type start_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()
          | conflict_exception()

  @type stop_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()
          | conflict_exception()

  @type tag_resource_errors() ::
          validation_exception() | internal_exception() | not_found_exception()

  @type untag_resource_errors() ::
          validation_exception() | internal_exception() | not_found_exception()

  @type update_pipe_errors() ::
          throttling_exception()
          | validation_exception()
          | internal_exception()
          | not_found_exception()
          | conflict_exception()

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

  @doc """
  Create a pipe.

  Amazon EventBridge Pipes connect event sources to targets and reduces
  the need for specialized knowledge and integration code.
  """
  @spec create_pipe(map(), String.t() | atom(), create_pipe_request(), list()) ::
          {:ok, create_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_pipe_errors()}
  def create_pipe(%Client{} = client, name, input, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(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 """
  Delete an existing pipe.

  For more information about pipes, see [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)
  in the Amazon EventBridge User Guide.
  """
  @spec delete_pipe(map(), String.t() | atom(), delete_pipe_request(), list()) ::
          {:ok, delete_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_pipe_errors()}
  def delete_pipe(%Client{} = client, name, input, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(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 """
  Get the information about an existing pipe.

  For more information about pipes, see [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)
  in the Amazon EventBridge User Guide.
  """
  @spec describe_pipe(map(), String.t() | atom(), list()) ::
          {:ok, describe_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_pipe_errors()}
  def describe_pipe(%Client{} = client, name, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(name)}"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Get the pipes associated with this account.

  For more information about pipes, see [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)
  in the Amazon EventBridge User Guide.
  """
  @spec list_pipes(
          map(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_pipes_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_pipes_errors()}
  def list_pipes(
        %Client{} = client,
        current_state \\ nil,
        desired_state \\ nil,
        limit \\ nil,
        name_prefix \\ nil,
        next_token \\ nil,
        source_prefix \\ nil,
        target_prefix \\ nil,
        options \\ []
      ) do
    url_path = "/v1/pipes"
    headers = []
    query_params = []

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

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

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

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

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

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

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

    meta = metadata()

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

  @doc """
  Displays the tags associated with a pipe.
  """
  @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 """
  Start an existing pipe.
  """
  @spec start_pipe(map(), String.t() | atom(), start_pipe_request(), list()) ::
          {:ok, start_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_pipe_errors()}
  def start_pipe(%Client{} = client, name, input, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(name)}/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 """
  Stop an existing pipe.
  """
  @spec stop_pipe(map(), String.t() | atom(), stop_pipe_request(), list()) ::
          {:ok, stop_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, stop_pipe_errors()}
  def stop_pipe(%Client{} = client, name, input, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(name)}/stop"
    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 """
  Assigns one or more tags (key-value pairs) to the specified pipe.

  Tags can help you
  organize and categorize your resources. You can also use them to scope user
  permissions by
  granting a user permission to access or change only resources with certain tag
  values.

  Tags don't have any semantic meaning to Amazon Web Services and are interpreted
  strictly
  as strings of characters.

  You can use the `TagResource` action with a pipe that already has tags. If
  you specify a new tag key, this tag is appended to the list of tags associated
  with the
  pipe. If you specify a tag key that is already associated with the pipe, the new
  tag value
  that you specify replaces the previous value for that tag.

  You can associate as many as 50 tags with a pipe.
  """
  @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 """
  Removes one or more tags from the specified pipes.
  """
  @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 """
  Update an existing pipe.

  When you call `UpdatePipe`, EventBridge only the
  updates fields you have specified in the request; the rest remain unchanged. The
  exception
  to this is if you modify any Amazon Web Services-service specific fields in the
  `SourceParameters`, `EnrichmentParameters`, or
  `TargetParameters` objects. For example,
  `DynamoDBStreamParameters` or `EventBridgeEventBusParameters`.
  EventBridge updates the fields in these objects atomically as one and overrides
  existing
  values. This is by design, and means that if you don't specify an optional field
  in one of
  these `Parameters` objects, EventBridge sets that field to its system-default
  value during the update.

  For more information about pipes, see [
  Amazon EventBridge
  Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)
  in the Amazon EventBridge User Guide.
  """
  @spec update_pipe(map(), String.t() | atom(), update_pipe_request(), list()) ::
          {:ok, update_pipe_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_pipe_errors()}
  def update_pipe(%Client{} = client, name, input, options \\ []) do
    url_path = "/v1/pipes/#{AWS.Util.encode_uri(name)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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