Skip to main content

lib/aws/generated/partner_central_benefits.ex

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

defmodule AWS.PartnerCentralBenefits do
  @moduledoc """
  AWS Partner Central Benefits Service provides APIs for managing partner
  benefits, applications, and allocations within the AWS Partner Network
  ecosystem.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:
      
      benefit_summary() :: %{
        "Arn" => [String.t() | atom()],
        "Catalog" => String.t() | atom(),
        "Description" => [String.t() | atom()],
        "FulfillmentTypes" => list(list(any())()),
        "Id" => [String.t() | atom()],
        "Name" => [String.t() | atom()],
        "Programs" => list(String.t() | atom()),
        "Status" => list(any())
      }
      
  """
  @type benefit_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_benefit_application_output() :: %{
        "Arn" => String.t() | atom(),
        "AssociatedResources" => list(String.t() | atom()),
        "BenefitApplicationDetails" => [any()],
        "BenefitId" => String.t() | atom(),
        "Catalog" => String.t() | atom(),
        "CreatedAt" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "FileDetails" => list(file_detail()),
        "FulfillmentTypes" => list(list(any())()),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "PartnerContacts" => list(contact()),
        "Programs" => list(String.t() | atom()),
        "Revision" => [String.t() | atom()],
        "Stage" => String.t() | atom(),
        "Status" => list(any()),
        "StatusReason" => [String.t() | atom()],
        "StatusReasonCode" => String.t() | atom(),
        "StatusReasonCodes" => list(String.t() | atom()),
        "UpdatedAt" => non_neg_integer()
      }
      
  """
  @type get_benefit_application_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_benefit_input() :: %{
        required("Catalog") => String.t() | atom(),
        required("Identifier") => [String.t() | atom()]
      }
      
  """
  @type get_benefit_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      submit_benefit_application_input() :: %{
        required("Catalog") => String.t() | atom(),
        required("Identifier") => String.t() | atom()
      }
      
  """
  @type submit_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      throttling_exception() :: %{
        "Message" => [String.t() | atom()]
      }
      
  """
  @type throttling_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      disassociate_benefit_application_resource_input() :: %{
        required("BenefitApplicationIdentifier") => String.t() | atom(),
        required("Catalog") => String.t() | atom(),
        required("ResourceArn") => String.t() | atom()
      }
      
  """
  @type disassociate_benefit_application_resource_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      credit_code() :: %{
        "AwsAccountId" => [String.t() | atom()],
        "AwsCreditCode" => [String.t() | atom()],
        "ExpiresAt" => non_neg_integer(),
        "IssuedAt" => non_neg_integer(),
        "Status" => list(any()),
        "Value" => monetary_value()
      }
      
  """
  @type credit_code() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      access_denied_exception() :: %{
        "Message" => [String.t() | atom()]
      }
      
  """
  @type access_denied_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      credit_details() :: %{
        "AllocatedAmount" => monetary_value(),
        "Codes" => list(credit_code()),
        "IssuedAmount" => monetary_value()
      }
      
  """
  @type credit_details() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      benefit_application_summary() :: %{
        "Arn" => [String.t() | atom()],
        "AssociatedResources" => list(String.t() | atom()),
        "BenefitApplicationDetails" => map(),
        "BenefitId" => String.t() | atom(),
        "Catalog" => String.t() | atom(),
        "CreatedAt" => non_neg_integer(),
        "FulfillmentTypes" => list(list(any())()),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "Programs" => list(String.t() | atom()),
        "Stage" => String.t() | atom(),
        "Status" => list(any()),
        "UpdatedAt" => non_neg_integer()
      }
      
  """
  @type benefit_application_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_benefit_application_output() :: %{
        "Arn" => [String.t() | atom()],
        "Id" => String.t() | atom(),
        "Revision" => [String.t() | atom()]
      }
      
  """
  @type update_benefit_application_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      access_details() :: %{
        "Description" => [String.t() | atom()]
      }
      
  """
  @type access_details() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      tag() :: %{
        "Key" => String.t() | atom(),
        "Value" => String.t() | atom()
      }
      
  """
  @type tag() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      consumable_details() :: %{
        "AllocatedAmount" => monetary_value(),
        "IssuanceDetails" => issuance_detail(),
        "RemainingAmount" => monetary_value(),
        "UtilizedAmount" => monetary_value()
      }
      
  """
  @type consumable_details() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      file_input() :: %{
        "BusinessUseCase" => [String.t() | atom()],
        "FileURI" => String.t() | atom()
      }
      
  """
  @type file_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      disbursement_details() :: %{
        "DisbursedAmount" => monetary_value(),
        "IssuanceDetails" => issuance_detail()
      }
      
  """
  @type disbursement_details() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      amendment() :: %{
        "FieldPath" => [String.t() | atom()],
        "NewValue" => [String.t() | atom()]
      }
      
  """
  @type amendment() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      cancel_benefit_application_output() :: %{}
      
  """
  @type cancel_benefit_application_output() :: %{}

  @typedoc """

  ## Example:
      
      get_benefit_allocation_output() :: %{
        "ApplicableBenefitIds" => list(String.t() | atom()),
        "Arn" => String.t() | atom(),
        "BenefitApplicationId" => String.t() | atom(),
        "BenefitId" => String.t() | atom(),
        "Catalog" => String.t() | atom(),
        "CreatedAt" => non_neg_integer(),
        "Description" => [String.t() | atom()],
        "ExpiresAt" => non_neg_integer(),
        "FulfillmentDetail" => list(),
        "FulfillmentType" => list(any()),
        "Id" => String.t() | atom(),
        "Name" => [String.t() | atom()],
        "StartsAt" => non_neg_integer(),
        "Status" => list(any()),
        "StatusReason" => [String.t() | atom()],
        "UpdatedAt" => non_neg_integer()
      }
      
  """
  @type get_benefit_allocation_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      validation_exception() :: %{
        "FieldList" => list(validation_exception_field()),
        "Message" => [String.t() | atom()],
        "Reason" => list(any())
      }
      
  """
  @type validation_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_benefit_output() :: %{
        "Arn" => [String.t() | atom()],
        "BenefitRequestSchema" => [any()],
        "Catalog" => String.t() | atom(),
        "Description" => [String.t() | atom()],
        "FulfillmentTypes" => list(list(any())()),
        "Id" => [String.t() | atom()],
        "Name" => [String.t() | atom()],
        "Programs" => list(String.t() | atom()),
        "Status" => list(any())
      }
      
  """
  @type get_benefit_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      cancel_benefit_application_input() :: %{
        optional("Reason") => [String.t() | atom()],
        required("Catalog") => String.t() | atom(),
        required("ClientToken") => [String.t() | atom()],
        required("Identifier") => String.t() | atom()
      }
      
  """
  @type cancel_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      associate_benefit_application_resource_output() :: %{
        "Arn" => [String.t() | atom()],
        "Id" => String.t() | atom(),
        "Revision" => [String.t() | atom()]
      }
      
  """
  @type associate_benefit_application_resource_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefit_allocations_output() :: %{
        "BenefitAllocationSummaries" => list(benefit_allocation_summary()),
        "NextToken" => [String.t() | atom()]
      }
      
  """
  @type list_benefit_allocations_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      internal_server_exception() :: %{
        "Message" => [String.t() | atom()]
      }
      
  """
  @type internal_server_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      recall_benefit_application_output() :: %{}
      
  """
  @type recall_benefit_application_output() :: %{}

  @typedoc """

  ## Example:
      
      get_benefit_application_input() :: %{
        required("Catalog") => String.t() | atom(),
        required("Identifier") => String.t() | atom()
      }
      
  """
  @type get_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      resource_not_found_exception() :: %{
        "Message" => [String.t() | atom()]
      }
      
  """
  @type resource_not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      tag_resource_request() :: %{
        required("resourceArn") => String.t() | atom(),
        required("tags") => list(tag())
      }
      
  """
  @type tag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      amend_benefit_application_output() :: %{}
      
  """
  @type amend_benefit_application_output() :: %{}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      get_benefit_allocation_input() :: %{
        required("Catalog") => String.t() | atom(),
        required("Identifier") => String.t() | atom()
      }
      
  """
  @type get_benefit_allocation_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      file_detail() :: %{
        "BusinessUseCase" => [String.t() | atom()],
        "CreatedAt" => non_neg_integer(),
        "CreatedBy" => [String.t() | atom()],
        "FileName" => [String.t() | atom()],
        "FileStatus" => [String.t() | atom()],
        "FileStatusReason" => [String.t() | atom()],
        "FileType" => list(any()),
        "FileURI" => String.t() | atom()
      }
      
  """
  @type file_detail() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_benefit_application_input() :: %{
        optional("BenefitApplicationDetails") => [any()],
        optional("Description") => String.t() | atom(),
        optional("FileDetails") => list(file_input()),
        optional("Name") => String.t() | atom(),
        optional("PartnerContacts") => list(contact()),
        required("Catalog") => String.t() | atom(),
        required("ClientToken") => [String.t() | atom()],
        required("Identifier") => String.t() | atom(),
        required("Revision") => [String.t() | atom()]
      }
      
  """
  @type update_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      amend_benefit_application_input() :: %{
        required("AmendmentReason") => [String.t() | atom()],
        required("Amendments") => list(amendment()),
        required("Catalog") => String.t() | atom(),
        required("ClientToken") => [String.t() | atom()],
        required("Identifier") => String.t() | atom(),
        required("Revision") => [String.t() | atom()]
      }
      
  """
  @type amend_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      conflict_exception() :: %{
        "Message" => [String.t() | atom()]
      }
      
  """
  @type conflict_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      issuance_detail() :: %{
        "IssuanceAmount" => monetary_value(),
        "IssuanceId" => [String.t() | atom()],
        "IssuedAt" => non_neg_integer()
      }
      
  """
  @type issuance_detail() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      validation_exception_field() :: %{
        "Code" => list(any()),
        "Message" => [String.t() | atom()],
        "Name" => [String.t() | atom()]
      }
      
  """
  @type validation_exception_field() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      untag_resource_request() :: %{
        required("resourceArn") => String.t() | atom(),
        required("tagKeys") => list(String.t() | atom())
      }
      
  """
  @type untag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefit_applications_output() :: %{
        "BenefitApplicationSummaries" => list(benefit_application_summary()),
        "NextToken" => [String.t() | atom()]
      }
      
  """
  @type list_benefit_applications_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      associate_benefit_application_resource_input() :: %{
        required("BenefitApplicationIdentifier") => String.t() | atom(),
        required("Catalog") => String.t() | atom(),
        required("ResourceArn") => String.t() | atom()
      }
      
  """
  @type associate_benefit_application_resource_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_tags_for_resource_response() :: %{
        "tags" => list(tag())
      }
      
  """
  @type list_tags_for_resource_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      recall_benefit_application_input() :: %{
        optional("ClientToken") => [String.t() | atom()],
        required("Catalog") => String.t() | atom(),
        required("Identifier") => String.t() | atom(),
        required("Reason") => [String.t() | atom()]
      }
      
  """
  @type recall_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      contact() :: %{
        "BusinessTitle" => [String.t() | atom()],
        "Email" => String.t() | atom(),
        "FirstName" => String.t() | atom(),
        "LastName" => String.t() | atom(),
        "Phone" => String.t() | atom()
      }
      
  """
  @type contact() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      submit_benefit_application_output() :: %{}
      
  """
  @type submit_benefit_application_output() :: %{}

  @typedoc """

  ## Example:
      
      disassociate_benefit_application_resource_output() :: %{
        "Arn" => [String.t() | atom()],
        "Id" => String.t() | atom(),
        "Revision" => [String.t() | atom()]
      }
      
  """
  @type disassociate_benefit_application_resource_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      associated_resource() :: %{
        "ResourceArn" => String.t() | atom(),
        "ResourceIdentifier" => [String.t() | atom()],
        "ResourceType" => list(any())
      }
      
  """
  @type associated_resource() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefits_output() :: %{
        "BenefitSummaries" => list(benefit_summary()),
        "NextToken" => [String.t() | atom()]
      }
      
  """
  @type list_benefits_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefit_allocations_input() :: %{
        optional("BenefitApplicationIdentifiers") => list(String.t() | atom()),
        optional("BenefitIdentifiers") => list(String.t() | atom()),
        optional("FulfillmentTypes") => list(list(any())()),
        optional("MaxResults") => [integer()],
        optional("NextToken") => [String.t() | atom()],
        optional("Status") => list(list(any())()),
        required("Catalog") => String.t() | atom()
      }
      
  """
  @type list_benefit_allocations_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_benefit_application_output() :: %{
        "Arn" => [String.t() | atom()],
        "Id" => String.t() | atom(),
        "Revision" => [String.t() | atom()]
      }
      
  """
  @type create_benefit_application_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      benefit_allocation_summary() :: %{
        "ApplicableBenefitIds" => list(String.t() | atom()),
        "Arn" => [String.t() | atom()],
        "BenefitApplicationId" => String.t() | atom(),
        "BenefitId" => String.t() | atom(),
        "Catalog" => String.t() | atom(),
        "CreatedAt" => non_neg_integer(),
        "ExpiresAt" => non_neg_integer(),
        "FulfillmentTypes" => list(list(any())()),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "Status" => list(any()),
        "StatusReason" => [String.t() | atom()]
      }
      
  """
  @type benefit_allocation_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefit_applications_input() :: %{
        optional("AssociatedResourceArns") => list(String.t() | atom()),
        optional("AssociatedResources") => list(associated_resource()),
        optional("BenefitIdentifiers") => list(String.t() | atom()),
        optional("FulfillmentTypes") => list(list(any())()),
        optional("MaxResults") => [integer()],
        optional("NextToken") => [String.t() | atom()],
        optional("Programs") => list(String.t() | atom()),
        optional("Stages") => list(String.t() | atom()),
        optional("Status") => list(list(any())()),
        required("Catalog") => String.t() | atom()
      }
      
  """
  @type list_benefit_applications_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_benefits_input() :: %{
        optional("FulfillmentTypes") => list(list(any())()),
        optional("MaxResults") => [integer()],
        optional("NextToken") => [String.t() | atom()],
        optional("Programs") => list(String.t() | atom()),
        optional("Status") => list(list(any())()),
        required("Catalog") => String.t() | atom()
      }
      
  """
  @type list_benefits_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_benefit_application_input() :: %{
        optional("AssociatedResources") => list(String.t() | atom()),
        optional("BenefitApplicationDetails") => [any()],
        optional("Description") => String.t() | atom(),
        optional("FileDetails") => list(file_input()),
        optional("FulfillmentTypes") => list(list(any())()),
        optional("Name") => String.t() | atom(),
        optional("PartnerContacts") => list(contact()),
        optional("Tags") => list(tag()),
        required("BenefitIdentifier") => [String.t() | atom()],
        required("Catalog") => String.t() | atom(),
        required("ClientToken") => [String.t() | atom()]
      }
      
  """
  @type create_benefit_application_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_tags_for_resource_request() :: %{
        required("resourceArn") => String.t() | atom()
      }
      
  """
  @type list_tags_for_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      monetary_value() :: %{
        "Amount" => [String.t() | atom()],
        "CurrencyCode" => list(any())
      }
      
  """
  @type monetary_value() :: %{(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()]
      }
      
  """
  @type service_quota_exceeded_exception() :: %{(String.t() | atom()) => any()}

  @type amend_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type associate_benefit_application_resource_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type cancel_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type create_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type disassociate_benefit_application_resource_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type get_benefit_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type get_benefit_allocation_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type get_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type list_benefit_allocations_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type list_benefit_applications_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type list_benefits_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type list_tags_for_resource_errors() ::
          resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type recall_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type submit_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type tag_resource_errors() ::
          service_quota_exceeded_exception()
          | conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type untag_resource_errors() ::
          service_quota_exceeded_exception()
          | conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  @type update_benefit_application_errors() ::
          conflict_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | validation_exception()
          | access_denied_exception()
          | throttling_exception()

  def metadata do
    %{
      api_version: "2018-05-10",
      content_type: "application/x-amz-json-1.0",
      credential_scope: nil,
      endpoint_prefix: "partnercentral-benefits",
      global?: false,
      hostname: nil,
      protocol: "json",
      service_id: "PartnerCentral Benefits",
      signature_version: "v4",
      signing_name: "partnercentral-benefits",
      target_prefix: "PartnerCentralBenefitsService"
    }
  end

  @doc """
  Modifies an existing benefit application by applying amendments to specific
  fields while maintaining revision control.
  """
  @spec amend_benefit_application(map(), amend_benefit_application_input(), list()) ::
          {:ok, amend_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, amend_benefit_application_errors()}
  def amend_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "AmendBenefitApplication", input, options)
  end

  @doc """
  Links an AWS resource to an existing benefit application for tracking and
  management purposes.
  """
  @spec associate_benefit_application_resource(
          map(),
          associate_benefit_application_resource_input(),
          list()
        ) ::
          {:ok, associate_benefit_application_resource_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, associate_benefit_application_resource_errors()}
  def associate_benefit_application_resource(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "AssociateBenefitApplicationResource", input, options)
  end

  @doc """
  Cancels a benefit application that is currently in progress, preventing further
  processing.
  """
  @spec cancel_benefit_application(map(), cancel_benefit_application_input(), list()) ::
          {:ok, cancel_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, cancel_benefit_application_errors()}
  def cancel_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "CancelBenefitApplication", input, options)
  end

  @doc """
  Creates a new benefit application for a partner to request access to AWS
  benefits and programs.
  """
  @spec create_benefit_application(map(), create_benefit_application_input(), list()) ::
          {:ok, create_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_benefit_application_errors()}
  def create_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "CreateBenefitApplication", input, options)
  end

  @doc """
  Removes the association between an AWS resource and a benefit application.
  """
  @spec disassociate_benefit_application_resource(
          map(),
          disassociate_benefit_application_resource_input(),
          list()
        ) ::
          {:ok, disassociate_benefit_application_resource_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, disassociate_benefit_application_resource_errors()}
  def disassociate_benefit_application_resource(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "DisassociateBenefitApplicationResource", input, options)
  end

  @doc """
  Retrieves detailed information about a specific benefit available in the partner
  catalog.
  """
  @spec get_benefit(map(), get_benefit_input(), list()) ::
          {:ok, get_benefit_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_benefit_errors()}
  def get_benefit(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "GetBenefit", input, options)
  end

  @doc """
  Retrieves detailed information about a specific benefit allocation that has been
  granted to a partner.
  """
  @spec get_benefit_allocation(map(), get_benefit_allocation_input(), list()) ::
          {:ok, get_benefit_allocation_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_benefit_allocation_errors()}
  def get_benefit_allocation(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "GetBenefitAllocation", input, options)
  end

  @doc """
  Retrieves detailed information about a specific benefit application.
  """
  @spec get_benefit_application(map(), get_benefit_application_input(), list()) ::
          {:ok, get_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_benefit_application_errors()}
  def get_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "GetBenefitApplication", input, options)
  end

  @doc """
  Retrieves a paginated list of benefit allocations based on specified filter
  criteria.
  """
  @spec list_benefit_allocations(map(), list_benefit_allocations_input(), list()) ::
          {:ok, list_benefit_allocations_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_benefit_allocations_errors()}
  def list_benefit_allocations(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "ListBenefitAllocations", input, options)
  end

  @doc """
  Retrieves a paginated list of benefit applications based on specified filter
  criteria.
  """
  @spec list_benefit_applications(map(), list_benefit_applications_input(), list()) ::
          {:ok, list_benefit_applications_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_benefit_applications_errors()}
  def list_benefit_applications(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "ListBenefitApplications", input, options)
  end

  @doc """
  Retrieves a paginated list of available benefits based on specified filter
  criteria.
  """
  @spec list_benefits(map(), list_benefits_input(), list()) ::
          {:ok, list_benefits_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_benefits_errors()}
  def list_benefits(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "ListBenefits", input, options)
  end

  @doc """
  Retrieves all tags associated with a specific resource.
  """
  @spec list_tags_for_resource(map(), list_tags_for_resource_request(), 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, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "ListTagsForResource", input, options)
  end

  @doc """
  Recalls a submitted benefit application, returning it to draft status for
  further modifications.
  """
  @spec recall_benefit_application(map(), recall_benefit_application_input(), list()) ::
          {:ok, recall_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, recall_benefit_application_errors()}
  def recall_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "RecallBenefitApplication", input, options)
  end

  @doc """
  Submits a benefit application for review and processing by AWS.
  """
  @spec submit_benefit_application(map(), submit_benefit_application_input(), list()) ::
          {:ok, submit_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, submit_benefit_application_errors()}
  def submit_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "SubmitBenefitApplication", input, options)
  end

  @doc """
  Adds or updates tags for a specified resource.
  """
  @spec tag_resource(map(), tag_resource_request(), list()) ::
          {:ok, tag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, tag_resource_errors()}
  def tag_resource(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "TagResource", input, options)
  end

  @doc """
  Removes specified tags from a resource.
  """
  @spec untag_resource(map(), untag_resource_request(), list()) ::
          {:ok, untag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, untag_resource_errors()}
  def untag_resource(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "UntagResource", input, options)
  end

  @doc """
  Updates an existing benefit application with new information while maintaining
  revision control.
  """
  @spec update_benefit_application(map(), update_benefit_application_input(), list()) ::
          {:ok, update_benefit_application_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_benefit_application_errors()}
  def update_benefit_application(%Client{} = client, input, options \\ []) do
    meta =
      metadata()

    Request.request_post(client, meta, "UpdateBenefitApplication", input, options)
  end
end