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

defmodule AWS.WorkMail do
  @moduledoc """
  WorkMail is a secure, managed business email and calendaring service with
  support for
  existing desktop and mobile email clients.

  You can access your email, contacts, and
  calendars using Microsoft Outlook, your browser, or other native iOS and Android
  email
  applications. You can integrate WorkMail with your existing corporate directory
  and control
  both the keys that encrypt your data and the location in which your data is
  stored.

  The WorkMail API is designed for the following scenarios:

    *
  Listing and describing organizations

    *
  Managing users

    *
  Managing groups

    *
  Managing resources

  All WorkMail API operations are Amazon-authenticated and certificate-signed.
  They not
  only require the use of the AWS SDK, but also allow for the exclusive use of AWS
  Identity and Access Management
  users and roles to help facilitate access, trust, and permission policies. By
  creating a
  role and allowing an IAM user to access the WorkMail site, the IAM user gains
  full
  administrative visibility into the entire WorkMail organization (or as set in
  the IAM
  policy). This includes, but is not limited to, the ability to create, update,
  and delete
  users, groups, and resources. This allows developers to perform the scenarios
  listed above,
  as well as give users the ability to grant access on a selective basis using the
  IAM
  model.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:
      
      mobile_device_access_rule() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "DeviceModels" => list(String.t() | atom()),
        "DeviceOperatingSystems" => list(String.t() | atom()),
        "DeviceTypes" => list(String.t() | atom()),
        "DeviceUserAgents" => list(String.t() | atom()),
        "Effect" => list(any()),
        "MobileDeviceAccessRuleId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "NotDeviceModels" => list(String.t() | atom()),
        "NotDeviceOperatingSystems" => list(String.t() | atom()),
        "NotDeviceTypes" => list(String.t() | atom()),
        "NotDeviceUserAgents" => list(String.t() | atom())
      }
      
  """
  @type mobile_device_access_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_aliases_response() :: %{
        "Aliases" => list(String.t() | atom()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_aliases_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      cancel_mailbox_export_job_request() :: %{
        required("ClientToken") => String.t() | atom(),
        required("JobId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type cancel_mailbox_export_job_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_access_control_effect_response() :: %{
        "Effect" => list(any()),
        "MatchedRules" => list(String.t() | atom())
      }
      
  """
  @type get_access_control_effect_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_aliases_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_aliases_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      put_email_monitoring_configuration_request() :: %{
        optional("RoleArn") => String.t() | atom(),
        required("LogGroupArn") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type put_email_monitoring_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_mobile_device_access_overrides_response() :: %{
        "NextToken" => String.t() | atom(),
        "Overrides" => list(mobile_device_access_override())
      }
      
  """
  @type list_mobile_device_access_overrides_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mailbox_details_response() :: %{
        "MailboxQuota" => integer(),
        "MailboxSize" => float()
      }
      
  """
  @type get_mailbox_details_response() :: %{(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:
      
      list_organizations_response() :: %{
        "NextToken" => String.t() | atom(),
        "OrganizationSummaries" => list(organization_summary())
      }
      
  """
  @type list_organizations_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mobile_device_access_effect_request() :: %{
        optional("DeviceModel") => String.t() | atom(),
        optional("DeviceOperatingSystem") => String.t() | atom(),
        optional("DeviceType") => String.t() | atom(),
        optional("DeviceUserAgent") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type get_mobile_device_access_effect_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      disassociate_delegate_from_resource_request() :: %{
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type disassociate_delegate_from_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_group_members_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("GroupId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_group_members_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_resources_response() :: %{
        "NextToken" => String.t() | atom(),
        "Resources" => list(resource())
      }
      
  """
  @type list_resources_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_resource_response() :: %{
        "BookingOptions" => booking_options(),
        "Description" => String.t() | atom(),
        "DisabledDate" => non_neg_integer(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "HiddenFromGlobalAddressList" => boolean(),
        "Name" => String.t() | atom(),
        "ResourceId" => String.t() | atom(),
        "State" => list(any()),
        "Type" => list(any())
      }
      
  """
  @type describe_resource_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_groups_for_entity_request() :: %{
        optional("Filters") => list_groups_for_entity_filters(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_groups_for_entity_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      test_availability_configuration_request() :: %{
        optional("DomainName") => String.t() | atom(),
        optional("EwsProvider") => ews_availability_provider(),
        optional("LambdaProvider") => lambda_availability_provider(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type test_availability_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      associate_delegate_to_resource_request() :: %{
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type associate_delegate_to_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_mobile_device_access_rule_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        optional("Description") => String.t() | atom(),
        optional("DeviceModels") => list(String.t() | atom()),
        optional("DeviceOperatingSystems") => list(String.t() | atom()),
        optional("DeviceTypes") => list(String.t() | atom()),
        optional("DeviceUserAgents") => list(String.t() | atom()),
        optional("NotDeviceModels") => list(String.t() | atom()),
        optional("NotDeviceOperatingSystems") => list(String.t() | atom()),
        optional("NotDeviceTypes") => list(String.t() | atom()),
        optional("NotDeviceUserAgents") => list(String.t() | atom()),
        required("Effect") => list(any()),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type create_mobile_device_access_rule_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_resource_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type delete_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_availability_configurations_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_availability_configurations_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      update_resource_request() :: %{
        optional("BookingOptions") => booking_options(),
        optional("Description") => String.t() | atom(),
        optional("HiddenFromGlobalAddressList") => boolean(),
        optional("Name") => String.t() | atom(),
        optional("Type") => list(any()),
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type update_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_access_control_effect_request() :: %{
        optional("ImpersonationRoleId") => String.t() | atom(),
        optional("UserId") => String.t() | atom(),
        required("Action") => String.t() | atom(),
        required("IpAddress") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type get_access_control_effect_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_impersonation_roles_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_impersonation_roles_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_alias_request() :: %{
        required("Alias") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type create_alias_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      personal_access_token_summary() :: %{
        "DateCreated" => non_neg_integer(),
        "DateLastUsed" => non_neg_integer(),
        "ExpiresTime" => non_neg_integer(),
        "Name" => String.t() | atom(),
        "PersonalAccessTokenId" => String.t() | atom(),
        "Scopes" => list(String.t() | atom()),
        "UserId" => String.t() | atom()
      }
      
  """
  @type personal_access_token_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_primary_email_address_request() :: %{
        required("Email") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type update_primary_email_address_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_personal_access_tokens_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        optional("UserId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_personal_access_tokens_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_mobile_device_access_overrides_request() :: %{
        optional("DeviceId") => String.t() | atom(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        optional("UserId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_mobile_device_access_overrides_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_mobile_device_access_override_request() :: %{
        required("DeviceId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type delete_mobile_device_access_override_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mobile_device_access_override_request() :: %{
        required("DeviceId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type get_mobile_device_access_override_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mail_domain_response() :: %{
        "DkimVerificationStatus" => list(any()),
        "IsDefault" => boolean(),
        "IsTestDomain" => boolean(),
        "OwnershipVerificationStatus" => list(any()),
        "Records" => list(dns_record())
      }
      
  """
  @type get_mail_domain_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_mailbox_export_jobs_response() :: %{
        "Jobs" => list(mailbox_export_job()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_mailbox_export_jobs_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_users_filters() :: %{
        "DisplayNamePrefix" => String.t() | atom(),
        "IdentityProviderUserIdPrefix" => String.t() | atom(),
        "PrimaryEmailPrefix" => String.t() | atom(),
        "State" => list(any()),
        "UsernamePrefix" => String.t() | atom()
      }
      
  """
  @type list_users_filters() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      access_control_rule() :: %{
        "Actions" => list(String.t() | atom()),
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "Effect" => list(any()),
        "ImpersonationRoleIds" => list(String.t() | atom()),
        "IpRanges" => list(String.t() | atom()),
        "Name" => String.t() | atom(),
        "NotActions" => list(String.t() | atom()),
        "NotImpersonationRoleIds" => list(String.t() | atom()),
        "NotIpRanges" => list(String.t() | atom()),
        "NotUserIds" => list(String.t() | atom()),
        "UserIds" => list(String.t() | atom())
      }
      
  """
  @type access_control_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      domain() :: %{
        "DomainName" => String.t() | atom(),
        "HostedZoneId" => String.t() | atom()
      }
      
  """
  @type domain() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_identity_provider_configuration_response() :: %{
        "AuthenticationMode" => list(any()),
        "IdentityCenterConfiguration" => identity_center_configuration(),
        "PersonalAccessTokenConfiguration" => personal_access_token_configuration()
      }
      
  """
  @type describe_identity_provider_configuration_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_mobile_device_access_rule_response() :: %{
        "MobileDeviceAccessRuleId" => String.t() | atom()
      }
      
  """
  @type create_mobile_device_access_rule_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      assume_impersonation_role_response() :: %{
        "ExpiresIn" => float(),
        "Token" => String.t() | atom()
      }
      
  """
  @type assume_impersonation_role_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      put_retention_policy_request() :: %{
        optional("Description") => String.t() | atom(),
        optional("Id") => String.t() | atom(),
        required("FolderConfigurations") => list(folder_configuration()),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type put_retention_policy_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_mail_domains_response() :: %{
        "MailDomains" => list(mail_domain_summary()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_mail_domains_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_mobile_device_access_rules_response() :: %{
        "Rules" => list(mobile_device_access_rule())
      }
      
  """
  @type list_mobile_device_access_rules_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_personal_access_token_metadata_response() :: %{
        "DateCreated" => non_neg_integer(),
        "DateLastUsed" => non_neg_integer(),
        "ExpiresTime" => non_neg_integer(),
        "Name" => String.t() | atom(),
        "PersonalAccessTokenId" => String.t() | atom(),
        "Scopes" => list(String.t() | atom()),
        "UserId" => String.t() | atom()
      }
      
  """
  @type get_personal_access_token_metadata_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_resource_delegates_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type list_resource_delegates_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      ews_availability_provider() :: %{
        "EwsEndpoint" => String.t() | atom(),
        "EwsPassword" => String.t() | atom(),
        "EwsUsername" => String.t() | atom()
      }
      
  """
  @type ews_availability_provider() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_personal_access_token_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("PersonalAccessTokenId") => String.t() | atom()
      }
      
  """
  @type delete_personal_access_token_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      describe_entity_response() :: %{
        "EntityId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "Type" => list(any())
      }
      
  """
  @type describe_entity_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_groups_filters() :: %{
        "NamePrefix" => String.t() | atom(),
        "PrimaryEmailPrefix" => String.t() | atom(),
        "State" => list(any())
      }
      
  """
  @type list_groups_filters() :: %{(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_resource_delegates_response() :: %{
        "Delegates" => list(delegate()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_resource_delegates_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      deregister_from_work_mail_request() :: %{
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type deregister_from_work_mail_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      group_identifier() :: %{
        "GroupId" => String.t() | atom(),
        "GroupName" => String.t() | atom()
      }
      
  """
  @type group_identifier() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_availability_configuration_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        optional("EwsProvider") => ews_availability_provider(),
        optional("LambdaProvider") => lambda_availability_provider(),
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type create_availability_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_impersonation_role_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        optional("Description") => String.t() | atom(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("Rules") => list(impersonation_rule()),
        required("Type") => list(any())
      }
      
  """
  @type create_impersonation_role_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_group_request() :: %{
        optional("HiddenFromGlobalAddressList") => boolean(),
        required("GroupId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type update_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      booking_options() :: %{
        "AutoAcceptRequests" => boolean(),
        "AutoDeclineConflictingRequests" => boolean(),
        "AutoDeclineRecurringRequests" => boolean()
      }
      
  """
  @type booking_options() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_impersonation_role_effect_request() :: %{
        required("ImpersonationRoleId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("TargetUser") => String.t() | atom()
      }
      
  """
  @type get_impersonation_role_effect_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_identity_center_application_response() :: %{
        "ApplicationArn" => String.t() | atom()
      }
      
  """
  @type create_identity_center_application_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mailbox_details_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type get_mailbox_details_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      personal_access_token_configuration() :: %{
        "LifetimeInDays" => integer(),
        "Status" => list(any())
      }
      
  """
  @type personal_access_token_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_retention_policy_request() :: %{
        required("Id") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_retention_policy_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      put_inbound_dmarc_settings_request() :: %{
        required("Enforced") => boolean(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type put_inbound_dmarc_settings_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      lambda_availability_provider() :: %{
        "LambdaArn" => String.t() | atom()
      }
      
  """
  @type lambda_availability_provider() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      test_availability_configuration_response() :: %{
        "FailureReason" => String.t() | atom(),
        "TestPassed" => boolean()
      }
      
  """
  @type test_availability_configuration_response() :: %{(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:
      
      mail_domain_state_exception() :: %{
        "Message" => String.t() | atom()
      }
      
  """
  @type mail_domain_state_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_inbound_dmarc_settings_response() :: %{
        "Enforced" => boolean()
      }
      
  """
  @type describe_inbound_dmarc_settings_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_groups_for_entity_filters() :: %{
        "GroupNamePrefix" => String.t() | atom()
      }
      
  """
  @type list_groups_for_entity_filters() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mail_domain_request() :: %{
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type get_mail_domain_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_mailbox_permissions_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_mailbox_permissions_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      put_mailbox_permissions_request() :: %{
        required("EntityId") => String.t() | atom(),
        required("GranteeId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("PermissionValues") => list(list(any())())
      }
      
  """
  @type put_mailbox_permissions_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mobile_device_access_override_response() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "DeviceId" => String.t() | atom(),
        "Effect" => list(any()),
        "UserId" => String.t() | atom()
      }
      
  """
  @type get_mobile_device_access_override_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_impersonation_roles_response() :: %{
        "NextToken" => String.t() | atom(),
        "Roles" => list(impersonation_role())
      }
      
  """
  @type list_impersonation_roles_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      mail_domain_summary() :: %{
        "DefaultDomain" => boolean(),
        "DomainName" => String.t() | atom()
      }
      
  """
  @type mail_domain_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_users_response() :: %{
        "NextToken" => String.t() | atom(),
        "Users" => list(user())
      }
      
  """
  @type list_users_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_impersonation_role_effect_response() :: %{
        "Effect" => list(any()),
        "MatchedRules" => list(impersonation_matched_rule()),
        "Type" => list(any())
      }
      
  """
  @type get_impersonation_role_effect_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_organization_response() :: %{
        "OrganizationId" => String.t() | atom(),
        "State" => String.t() | atom()
      }
      
  """
  @type delete_organization_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_mailbox_export_job_request() :: %{
        required("JobId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type describe_mailbox_export_job_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      disassociate_member_from_group_request() :: %{
        required("GroupId") => String.t() | atom(),
        required("MemberId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type disassociate_member_from_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      availability_configuration() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "DomainName" => String.t() | atom(),
        "EwsProvider" => redacted_ews_availability_provider(),
        "LambdaProvider" => lambda_availability_provider(),
        "ProviderType" => list(any())
      }
      
  """
  @type availability_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_availability_configuration_request() :: %{
        optional("EwsProvider") => ews_availability_provider(),
        optional("LambdaProvider") => lambda_availability_provider(),
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type update_availability_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      update_default_mail_domain_request() :: %{
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type update_default_mail_domain_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_group_request() :: %{
        optional("HiddenFromGlobalAddressList") => boolean(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type create_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_impersonation_role_request() :: %{
        required("ImpersonationRoleId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_impersonation_role_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      mobile_device_access_override() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "DeviceId" => String.t() | atom(),
        "Effect" => list(any()),
        "UserId" => String.t() | atom()
      }
      
  """
  @type mobile_device_access_override() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_resource_request() :: %{
        optional("Description") => String.t() | atom(),
        optional("HiddenFromGlobalAddressList") => boolean(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("Type") => list(any())
      }
      
  """
  @type create_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_groups_for_entity_response() :: %{
        "Groups" => list(group_identifier()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_groups_for_entity_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      organization_summary() :: %{
        "Alias" => String.t() | atom(),
        "DefaultMailDomain" => String.t() | atom(),
        "ErrorMessage" => String.t() | atom(),
        "OrganizationId" => String.t() | atom(),
        "State" => String.t() | atom()
      }
      
  """
  @type organization_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_user_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type delete_user_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_mailbox_export_jobs_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_mailbox_export_jobs_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_organization_response() :: %{
        "ARN" => String.t() | atom(),
        "Alias" => String.t() | atom(),
        "CompletedDate" => non_neg_integer(),
        "DefaultMailDomain" => String.t() | atom(),
        "DirectoryId" => String.t() | atom(),
        "DirectoryType" => String.t() | atom(),
        "ErrorMessage" => String.t() | atom(),
        "InteroperabilityEnabled" => boolean(),
        "MigrationAdmin" => String.t() | atom(),
        "OrganizationId" => String.t() | atom(),
        "State" => String.t() | atom()
      }
      
  """
  @type describe_organization_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      register_to_work_mail_request() :: %{
        required("Email") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type register_to_work_mail_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      get_impersonation_role_request() :: %{
        required("ImpersonationRoleId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type get_impersonation_role_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      put_mobile_device_access_override_request() :: %{
        optional("Description") => String.t() | atom(),
        required("DeviceId") => String.t() | atom(),
        required("Effect") => list(any()),
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type put_mobile_device_access_override_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_mailbox_export_job_response() :: %{
        "Description" => String.t() | atom(),
        "EndTime" => non_neg_integer(),
        "EntityId" => String.t() | atom(),
        "ErrorInfo" => String.t() | atom(),
        "EstimatedProgress" => integer(),
        "KmsKeyArn" => String.t() | atom(),
        "RoleArn" => String.t() | atom(),
        "S3BucketName" => String.t() | atom(),
        "S3Path" => String.t() | atom(),
        "S3Prefix" => String.t() | atom(),
        "StartTime" => non_neg_integer(),
        "State" => list(any())
      }
      
  """
  @type describe_mailbox_export_job_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_user_response() :: %{
        "City" => String.t() | atom(),
        "Company" => String.t() | atom(),
        "Country" => String.t() | atom(),
        "Department" => String.t() | atom(),
        "DisabledDate" => non_neg_integer(),
        "DisplayName" => String.t() | atom(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "FirstName" => String.t() | atom(),
        "HiddenFromGlobalAddressList" => boolean(),
        "IdentityProviderIdentityStoreId" => String.t() | atom(),
        "IdentityProviderUserId" => String.t() | atom(),
        "Initials" => String.t() | atom(),
        "JobTitle" => String.t() | atom(),
        "LastName" => String.t() | atom(),
        "MailboxDeprovisionedDate" => non_neg_integer(),
        "MailboxProvisionedDate" => non_neg_integer(),
        "Name" => String.t() | atom(),
        "Office" => String.t() | atom(),
        "State" => list(any()),
        "Street" => String.t() | atom(),
        "Telephone" => String.t() | atom(),
        "UserId" => String.t() | atom(),
        "UserRole" => list(any()),
        "ZipCode" => String.t() | atom()
      }
      
  """
  @type describe_user_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      impersonation_role() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "ImpersonationRoleId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "Type" => list(any())
      }
      
  """
  @type impersonation_role() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_entity_request() :: %{
        required("Email") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type describe_entity_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      reset_password_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("Password") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type reset_password_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      put_access_control_rule_request() :: %{
        optional("Actions") => list(String.t() | atom()),
        optional("ImpersonationRoleIds") => list(String.t() | atom()),
        optional("IpRanges") => list(String.t() | atom()),
        optional("NotActions") => list(String.t() | atom()),
        optional("NotImpersonationRoleIds") => list(String.t() | atom()),
        optional("NotIpRanges") => list(String.t() | atom()),
        optional("NotUserIds") => list(String.t() | atom()),
        optional("UserIds") => list(String.t() | atom()),
        required("Description") => String.t() | atom(),
        required("Effect") => list(any()),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type put_access_control_rule_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      impersonation_matched_rule() :: %{
        "ImpersonationRuleId" => String.t() | atom(),
        "Name" => String.t() | atom()
      }
      
  """
  @type impersonation_matched_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      mobile_device_access_matched_rule() :: %{
        "MobileDeviceAccessRuleId" => String.t() | atom(),
        "Name" => String.t() | atom()
      }
      
  """
  @type mobile_device_access_matched_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      impersonation_rule() :: %{
        "Description" => String.t() | atom(),
        "Effect" => list(any()),
        "ImpersonationRuleId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "NotTargetUsers" => list(String.t() | atom()),
        "TargetUsers" => list(String.t() | atom())
      }
      
  """
  @type impersonation_rule() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      update_mailbox_quota_request() :: %{
        required("MailboxQuota") => integer(),
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type update_mailbox_quota_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_personal_access_token_metadata_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("PersonalAccessTokenId") => String.t() | atom()
      }
      
  """
  @type get_personal_access_token_metadata_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      register_mail_domain_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type register_mail_domain_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_availability_configurations_response() :: %{
        "AvailabilityConfigurations" => list(availability_configuration()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_availability_configurations_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_resource_response() :: %{
        "ResourceId" => String.t() | atom()
      }
      
  """
  @type create_resource_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      update_impersonation_role_request() :: %{
        optional("Description") => String.t() | atom(),
        required("ImpersonationRoleId") => String.t() | atom(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("Rules") => list(impersonation_rule()),
        required("Type") => list(any())
      }
      
  """
  @type update_impersonation_role_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_user_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type describe_user_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_access_control_rules_response() :: %{
        "Rules" => list(access_control_rule())
      }
      
  """
  @type list_access_control_rules_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      update_user_request() :: %{
        optional("City") => String.t() | atom(),
        optional("Company") => String.t() | atom(),
        optional("Country") => String.t() | atom(),
        optional("Department") => String.t() | atom(),
        optional("DisplayName") => String.t() | atom(),
        optional("FirstName") => String.t() | atom(),
        optional("HiddenFromGlobalAddressList") => boolean(),
        optional("IdentityProviderUserId") => String.t() | atom(),
        optional("Initials") => String.t() | atom(),
        optional("JobTitle") => String.t() | atom(),
        optional("LastName") => String.t() | atom(),
        optional("Office") => String.t() | atom(),
        optional("Role") => list(any()),
        optional("Street") => String.t() | atom(),
        optional("Telephone") => String.t() | atom(),
        optional("ZipCode") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("UserId") => String.t() | atom()
      }
      
  """
  @type update_user_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      redacted_ews_availability_provider() :: %{
        "EwsEndpoint" => String.t() | atom(),
        "EwsUsername" => String.t() | atom()
      }
      
  """
  @type redacted_ews_availability_provider() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_availability_configuration_request() :: %{
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_availability_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_email_monitoring_configuration_response() :: %{
        "LogGroupArn" => String.t() | atom(),
        "RoleArn" => String.t() | atom()
      }
      
  """
  @type describe_email_monitoring_configuration_response() :: %{(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:
      
      put_mailbox_permissions_response() :: %{}
      
  """
  @type put_mailbox_permissions_response() :: %{}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_organization_response() :: %{
        "OrganizationId" => String.t() | atom()
      }
      
  """
  @type create_organization_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      identity_center_configuration() :: %{
        "ApplicationArn" => String.t() | atom(),
        "InstanceArn" => String.t() | atom()
      }
      
  """
  @type identity_center_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_mailbox_permissions_request() :: %{
        required("EntityId") => String.t() | atom(),
        required("GranteeId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_mailbox_permissions_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_mailbox_permissions_response() :: %{
        "NextToken" => String.t() | atom(),
        "Permissions" => list(permission())
      }
      
  """
  @type list_mailbox_permissions_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      group() :: %{
        "DisabledDate" => non_neg_integer(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "State" => list(any())
      }
      
  """
  @type group() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      user() :: %{
        "DisabledDate" => non_neg_integer(),
        "DisplayName" => String.t() | atom(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "Id" => String.t() | atom(),
        "IdentityProviderIdentityStoreId" => String.t() | atom(),
        "IdentityProviderUserId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "State" => list(any()),
        "UserRole" => list(any())
      }
      
  """
  @type user() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_group_request() :: %{
        required("GroupId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type describe_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_group_request() :: %{
        required("GroupId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_organizations_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom()
      }
      
  """
  @type list_organizations_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_resource_request() :: %{
        required("OrganizationId") => String.t() | atom(),
        required("ResourceId") => String.t() | atom()
      }
      
  """
  @type describe_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      member() :: %{
        "DisabledDate" => non_neg_integer(),
        "EnabledDate" => non_neg_integer(),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "State" => list(any()),
        "Type" => list(any())
      }
      
  """
  @type member() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_users_request() :: %{
        optional("Filters") => list_users_filters(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_users_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delegate() :: %{
        "Id" => String.t() | atom(),
        "Type" => list(any())
      }
      
  """
  @type delegate() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_resources_request() :: %{
        optional("Filters") => list_resources_filters(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_resources_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      start_mailbox_export_job_request() :: %{
        optional("Description") => String.t() | atom(),
        required("ClientToken") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("KmsKeyArn") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom(),
        required("RoleArn") => String.t() | atom(),
        required("S3BucketName") => String.t() | atom(),
        required("S3Prefix") => String.t() | atom()
      }
      
  """
  @type start_mailbox_export_job_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_mobile_device_access_rule_request() :: %{
        optional("Description") => String.t() | atom(),
        optional("DeviceModels") => list(String.t() | atom()),
        optional("DeviceOperatingSystems") => list(String.t() | atom()),
        optional("DeviceTypes") => list(String.t() | atom()),
        optional("DeviceUserAgents") => list(String.t() | atom()),
        optional("NotDeviceModels") => list(String.t() | atom()),
        optional("NotDeviceOperatingSystems") => list(String.t() | atom()),
        optional("NotDeviceTypes") => list(String.t() | atom()),
        optional("NotDeviceUserAgents") => list(String.t() | atom()),
        required("Effect") => list(any()),
        required("MobileDeviceAccessRuleId") => String.t() | atom(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type update_mobile_device_access_rule_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_organization_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        optional("DeleteIdentityCenterApplication") => boolean(),
        optional("ForceDelete") => boolean(),
        required("DeleteDirectory") => boolean(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_organization_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_mobile_device_access_effect_response() :: %{
        "Effect" => list(any()),
        "MatchedRules" => list(mobile_device_access_matched_rule())
      }
      
  """
  @type get_mobile_device_access_effect_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      describe_group_response() :: %{
        "DisabledDate" => non_neg_integer(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "GroupId" => String.t() | atom(),
        "HiddenFromGlobalAddressList" => boolean(),
        "Name" => String.t() | atom(),
        "State" => list(any())
      }
      
  """
  @type describe_group_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      assume_impersonation_role_request() :: %{
        required("ImpersonationRoleId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type assume_impersonation_role_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      delete_access_control_rule_request() :: %{
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_access_control_rule_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_personal_access_tokens_response() :: %{
        "NextToken" => String.t() | atom(),
        "PersonalAccessTokenSummaries" => list(personal_access_token_summary())
      }
      
  """
  @type list_personal_access_tokens_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      associate_member_to_group_request() :: %{
        required("GroupId") => String.t() | atom(),
        required("MemberId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type associate_member_to_group_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_default_retention_policy_response() :: %{
        "Description" => String.t() | atom(),
        "FolderConfigurations" => list(folder_configuration()),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom()
      }
      
  """
  @type get_default_retention_policy_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      mailbox_export_job() :: %{
        "Description" => String.t() | atom(),
        "EndTime" => non_neg_integer(),
        "EntityId" => String.t() | atom(),
        "EstimatedProgress" => integer(),
        "JobId" => String.t() | atom(),
        "S3BucketName" => String.t() | atom(),
        "S3Path" => String.t() | atom(),
        "StartTime" => non_neg_integer(),
        "State" => list(any())
      }
      
  """
  @type mailbox_export_job() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_groups_response() :: %{
        "Groups" => list(group()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_groups_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      list_mail_domains_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_mail_domains_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      deregister_mail_domain_request() :: %{
        required("DomainName") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type deregister_mail_domain_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      put_identity_provider_configuration_request() :: %{
        required("AuthenticationMode") => list(any()),
        required("IdentityCenterConfiguration") => identity_center_configuration(),
        required("OrganizationId") => String.t() | atom(),
        required("PersonalAccessTokenConfiguration") => personal_access_token_configuration()
      }
      
  """
  @type put_identity_provider_configuration_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_groups_request() :: %{
        optional("Filters") => list_groups_filters(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type list_groups_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      start_mailbox_export_job_response() :: %{
        "JobId" => String.t() | atom()
      }
      
  """
  @type start_mailbox_export_job_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_resources_filters() :: %{
        "NamePrefix" => String.t() | atom(),
        "PrimaryEmailPrefix" => String.t() | atom(),
        "State" => list(any())
      }
      
  """
  @type list_resources_filters() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_user_response() :: %{
        "UserId" => String.t() | atom()
      }
      
  """
  @type create_user_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      folder_configuration() :: %{
        "Action" => list(any()),
        "Name" => list(any()),
        "Period" => integer()
      }
      
  """
  @type folder_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_mobile_device_access_rule_request() :: %{
        required("MobileDeviceAccessRuleId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_mobile_device_access_rule_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_impersonation_role_response() :: %{
        "ImpersonationRoleId" => String.t() | atom()
      }
      
  """
  @type create_impersonation_role_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      permission() :: %{
        "GranteeId" => String.t() | atom(),
        "GranteeType" => list(any()),
        "PermissionValues" => list(list(any())())
      }
      
  """
  @type permission() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_impersonation_role_response() :: %{
        "DateCreated" => non_neg_integer(),
        "DateModified" => non_neg_integer(),
        "Description" => String.t() | atom(),
        "ImpersonationRoleId" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "Rules" => list(impersonation_rule()),
        "Type" => list(any())
      }
      
  """
  @type get_impersonation_role_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_group_response() :: %{
        "GroupId" => String.t() | atom()
      }
      
  """
  @type create_group_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      delete_alias_request() :: %{
        required("Alias") => String.t() | atom(),
        required("EntityId") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type delete_alias_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_group_members_response() :: %{
        "Members" => list(member()),
        "NextToken" => String.t() | atom()
      }
      
  """
  @type list_group_members_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

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

  @typedoc """

  ## Example:
      
      create_user_request() :: %{
        optional("FirstName") => String.t() | atom(),
        optional("HiddenFromGlobalAddressList") => boolean(),
        optional("IdentityProviderUserId") => String.t() | atom(),
        optional("LastName") => String.t() | atom(),
        optional("Password") => String.t() | atom(),
        optional("Role") => list(any()),
        required("DisplayName") => String.t() | atom(),
        required("Name") => String.t() | atom(),
        required("OrganizationId") => String.t() | atom()
      }
      
  """
  @type create_user_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_organization_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        optional("DirectoryId") => String.t() | atom(),
        optional("Domains") => list(domain()),
        optional("EnableInteroperability") => boolean(),
        optional("KmsKeyArn") => String.t() | atom(),
        required("Alias") => String.t() | atom()
      }
      
  """
  @type create_organization_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      resource() :: %{
        "Description" => String.t() | atom(),
        "DisabledDate" => non_neg_integer(),
        "Email" => String.t() | atom(),
        "EnabledDate" => non_neg_integer(),
        "Id" => String.t() | atom(),
        "Name" => String.t() | atom(),
        "State" => list(any()),
        "Type" => list(any())
      }
      
  """
  @type resource() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      create_identity_center_application_request() :: %{
        optional("ClientToken") => String.t() | atom(),
        required("InstanceArn") => String.t() | atom(),
        required("Name") => String.t() | atom()
      }
      
  """
  @type create_identity_center_application_request() :: %{(String.t() | atom()) => any()}

  @type associate_delegate_to_resource_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type associate_member_to_group_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type assume_impersonation_role_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type cancel_mailbox_export_job_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type create_alias_errors() ::
          limit_exceeded_exception()
          | email_address_in_use_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | mail_domain_state_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type create_availability_configuration_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | name_availability_exception()
          | organization_state_exception()

  @type create_group_errors() ::
          directory_service_authentication_failed_exception()
          | reserved_name_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | name_availability_exception()
          | organization_state_exception()
          | unsupported_operation_exception()

  @type create_identity_center_application_errors() :: invalid_parameter_exception()

  @type create_impersonation_role_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type create_mobile_device_access_rule_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type create_organization_errors() ::
          limit_exceeded_exception()
          | directory_in_use_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | name_availability_exception()

  @type create_resource_errors() ::
          directory_service_authentication_failed_exception()
          | reserved_name_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | name_availability_exception()
          | organization_state_exception()
          | unsupported_operation_exception()

  @type create_user_errors() ::
          invalid_password_exception()
          | directory_service_authentication_failed_exception()
          | reserved_name_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | name_availability_exception()
          | organization_state_exception()
          | unsupported_operation_exception()

  @type delete_access_control_rule_errors() ::
          organization_not_found_exception() | organization_state_exception()

  @type delete_alias_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type delete_availability_configuration_errors() ::
          organization_not_found_exception() | organization_state_exception()

  @type delete_email_monitoring_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_group_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()

  @type delete_identity_center_application_errors() ::
          invalid_parameter_exception() | organization_state_exception()

  @type delete_identity_provider_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_impersonation_role_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_mailbox_permissions_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type delete_mobile_device_access_override_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type delete_mobile_device_access_rule_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_organization_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_personal_access_token_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_resource_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()

  @type delete_retention_policy_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type delete_user_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()

  @type deregister_from_work_mail_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type deregister_mail_domain_errors() ::
          invalid_custom_ses_configuration_exception()
          | invalid_parameter_exception()
          | mail_domain_in_use_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type describe_email_monitoring_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type describe_entity_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type describe_group_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type describe_identity_provider_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type describe_inbound_dmarc_settings_errors() ::
          organization_not_found_exception() | organization_state_exception()

  @type describe_mailbox_export_job_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type describe_organization_errors() ::
          invalid_parameter_exception() | organization_not_found_exception()

  @type describe_resource_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type describe_user_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type disassociate_delegate_from_resource_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type disassociate_member_from_group_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type get_access_control_effect_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type get_default_retention_policy_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type get_impersonation_role_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type get_impersonation_role_effect_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type get_mail_domain_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()

  @type get_mailbox_details_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type get_mobile_device_access_effect_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type get_mobile_device_access_override_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type get_personal_access_token_metadata_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type list_access_control_rules_errors() ::
          organization_not_found_exception() | organization_state_exception()

  @type list_aliases_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type list_availability_configurations_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type list_group_members_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type list_groups_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type list_groups_for_entity_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type list_impersonation_roles_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type list_mail_domains_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type list_mailbox_export_jobs_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type list_mailbox_permissions_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type list_mobile_device_access_overrides_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type list_mobile_device_access_rules_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type list_organizations_errors() :: invalid_parameter_exception()

  @type list_personal_access_tokens_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type list_resource_delegates_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type list_resources_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | unsupported_operation_exception()

  @type list_tags_for_resource_errors() :: resource_not_found_exception()

  @type list_users_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type put_access_control_rule_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type put_email_monitoring_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type put_identity_provider_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type put_inbound_dmarc_settings_errors() ::
          organization_not_found_exception() | organization_state_exception()

  @type put_mailbox_permissions_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type put_mobile_device_access_override_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type put_retention_policy_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type register_mail_domain_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | mail_domain_in_use_exception()
          | organization_not_found_exception()
          | organization_state_exception()

  @type register_to_work_mail_errors() ::
          directory_service_authentication_failed_exception()
          | email_address_in_use_exception()
          | entity_already_registered_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | mail_domain_state_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type reset_password_errors() ::
          invalid_password_exception()
          | directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type start_mailbox_export_job_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type tag_resource_errors() ::
          too_many_tags_exception()
          | invalid_parameter_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type test_availability_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type untag_resource_errors() :: resource_not_found_exception()

  @type update_availability_configuration_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()

  @type update_default_mail_domain_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | mail_domain_state_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()

  @type update_group_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type update_impersonation_role_errors() ::
          limit_exceeded_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | resource_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type update_mailbox_quota_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | entity_not_found_exception()

  @type update_mobile_device_access_rule_errors() ::
          invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_not_found_exception()

  @type update_primary_email_address_errors() ::
          directory_service_authentication_failed_exception()
          | email_address_in_use_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | mail_domain_state_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type update_resource_errors() ::
          email_address_in_use_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | invalid_configuration_exception()
          | organization_not_found_exception()
          | mail_domain_state_exception()
          | name_availability_exception()
          | mail_domain_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  @type update_user_errors() ::
          directory_service_authentication_failed_exception()
          | directory_unavailable_exception()
          | invalid_parameter_exception()
          | organization_not_found_exception()
          | organization_state_exception()
          | entity_state_exception()
          | unsupported_operation_exception()
          | entity_not_found_exception()

  def metadata do
    %{
      api_version: "2017-10-01",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "workmail",
      global?: false,
      hostname: nil,
      protocol: "json",
      service_id: "WorkMail",
      signature_version: "v4",
      signing_name: "workmail",
      target_prefix: "WorkMailService"
    }
  end

  @doc """
  Adds a member (user or group) to the resource's set of delegates.
  """
  @spec associate_delegate_to_resource(map(), associate_delegate_to_resource_request(), list()) ::
          {:ok, associate_delegate_to_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, associate_delegate_to_resource_errors()}
  def associate_delegate_to_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Adds a member (user or group) to the group's set.
  """
  @spec associate_member_to_group(map(), associate_member_to_group_request(), list()) ::
          {:ok, associate_member_to_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, associate_member_to_group_errors()}
  def associate_member_to_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Assumes an impersonation role for the given WorkMail organization.

  This method returns an
  authentication token you can use to make impersonated calls.
  """
  @spec assume_impersonation_role(map(), assume_impersonation_role_request(), list()) ::
          {:ok, assume_impersonation_role_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, assume_impersonation_role_errors()}
  def assume_impersonation_role(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Cancels a mailbox export job.

  If the mailbox export job is near completion, it might not be possible to cancel
  it.
  """
  @spec cancel_mailbox_export_job(map(), cancel_mailbox_export_job_request(), list()) ::
          {:ok, cancel_mailbox_export_job_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, cancel_mailbox_export_job_errors()}
  def cancel_mailbox_export_job(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Adds an alias to the set of a given member (user or group) of WorkMail.
  """
  @spec create_alias(map(), create_alias_request(), list()) ::
          {:ok, create_alias_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_alias_errors()}
  def create_alias(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates an `AvailabilityConfiguration` for the given WorkMail organization and
  domain.
  """
  @spec create_availability_configuration(
          map(),
          create_availability_configuration_request(),
          list()
        ) ::
          {:ok, create_availability_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_availability_configuration_errors()}
  def create_availability_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a group that can be used in WorkMail by calling the `RegisterToWorkMail`
  operation.
  """
  @spec create_group(map(), create_group_request(), list()) ::
          {:ok, create_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_group_errors()}
  def create_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Creates the WorkMail application in IAM Identity Center that can be used later
  in the WorkMail - IdC integration.

  For more information, see PutIdentityProviderConfiguration. This action does not
  affect the authentication settings for any WorkMail organizations.
  """
  @spec create_identity_center_application(
          map(),
          create_identity_center_application_request(),
          list()
        ) ::
          {:ok, create_identity_center_application_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_identity_center_application_errors()}
  def create_identity_center_application(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates an impersonation role for the given WorkMail organization.

  *Idempotency* ensures that an API request completes no more than one
  time. With an idempotent request, if the original request completes
  successfully, any
  subsequent retries also complete successfully without performing any further
  actions.
  """
  @spec create_impersonation_role(map(), create_impersonation_role_request(), list()) ::
          {:ok, create_impersonation_role_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_impersonation_role_errors()}
  def create_impersonation_role(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a new mobile device access rule for the specified WorkMail organization.
  """
  @spec create_mobile_device_access_rule(
          map(),
          create_mobile_device_access_rule_request(),
          list()
        ) ::
          {:ok, create_mobile_device_access_rule_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_mobile_device_access_rule_errors()}
  def create_mobile_device_access_rule(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a new WorkMail organization.

  Optionally, you can choose to associate an existing AWS Directory Service
  directory with your organization. If an AWS Directory Service directory ID is
  specified, the organization alias must match the directory alias. If you choose
  not to associate an existing directory with your organization, then we create a
  new WorkMail directory for you. For more information, see [Adding an organization](https://docs.aws.amazon.com/workmail/latest/adminguide/add_new_organization.html)
  in the *WorkMail Administrator Guide*.

  You can associate multiple email domains with an organization, then choose your
  default email domain from the WorkMail console. You can also associate a domain
  that is managed
  in an Amazon Route 53 public hosted zone. For more information, see [Adding a domain](https://docs.aws.amazon.com/workmail/latest/adminguide/add_domain.html)
  and [Choosing the default domain](https://docs.aws.amazon.com/workmail/latest/adminguide/default_domain.html)
  in the *WorkMail Administrator Guide*.

  Optionally, you can use a customer managed key from AWS Key Management Service
  (AWS
  KMS) to encrypt email for your organization. If you don't associate an AWS KMS
  key, WorkMail
  creates a default, AWS managed key for you.
  """
  @spec create_organization(map(), create_organization_request(), list()) ::
          {:ok, create_organization_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_organization_errors()}
  def create_organization(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a new WorkMail resource.
  """
  @spec create_resource(map(), create_resource_request(), list()) ::
          {:ok, create_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_resource_errors()}
  def create_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a user who can be used in WorkMail by calling the `RegisterToWorkMail`
  operation.
  """
  @spec create_user(map(), create_user_request(), list()) ::
          {:ok, create_user_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_user_errors()}
  def create_user(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes an access control rule for the specified WorkMail organization.

  Deleting already deleted and non-existing rules does not produce an error. In
  those cases, the service sends back an HTTP 200 response with an empty HTTP
  body.
  """
  @spec delete_access_control_rule(map(), delete_access_control_rule_request(), list()) ::
          {:ok, delete_access_control_rule_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_access_control_rule_errors()}
  def delete_access_control_rule(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Remove one or more specified aliases from a set of aliases for a given
  user.
  """
  @spec delete_alias(map(), delete_alias_request(), list()) ::
          {:ok, delete_alias_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_alias_errors()}
  def delete_alias(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes the `AvailabilityConfiguration` for the given WorkMail organization and
  domain.
  """
  @spec delete_availability_configuration(
          map(),
          delete_availability_configuration_request(),
          list()
        ) ::
          {:ok, delete_availability_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_availability_configuration_errors()}
  def delete_availability_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes the email monitoring configuration for a specified organization.
  """
  @spec delete_email_monitoring_configuration(
          map(),
          delete_email_monitoring_configuration_request(),
          list()
        ) ::
          {:ok, delete_email_monitoring_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_email_monitoring_configuration_errors()}
  def delete_email_monitoring_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes a group from WorkMail.
  """
  @spec delete_group(map(), delete_group_request(), list()) ::
          {:ok, delete_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_group_errors()}
  def delete_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Deletes the IAM Identity Center application from WorkMail.

  This action does not affect the authentication settings for any WorkMail
  organizations.
  """
  @spec delete_identity_center_application(
          map(),
          delete_identity_center_application_request(),
          list()
        ) ::
          {:ok, delete_identity_center_application_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_identity_center_application_errors()}
  def delete_identity_center_application(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Disables the integration between IdC and WorkMail.

  Authentication will continue with the directory as it was before the IdC
  integration. You might have to reset your directory passwords and reconfigure
  your desktop and mobile email clients.
  """
  @spec delete_identity_provider_configuration(
          map(),
          delete_identity_provider_configuration_request(),
          list()
        ) ::
          {:ok, delete_identity_provider_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_identity_provider_configuration_errors()}
  def delete_identity_provider_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes an impersonation role for the given WorkMail organization.
  """
  @spec delete_impersonation_role(map(), delete_impersonation_role_request(), list()) ::
          {:ok, delete_impersonation_role_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_impersonation_role_errors()}
  def delete_impersonation_role(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes permissions granted to a member (user or group).
  """
  @spec delete_mailbox_permissions(map(), delete_mailbox_permissions_request(), list()) ::
          {:ok, delete_mailbox_permissions_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_mailbox_permissions_errors()}
  def delete_mailbox_permissions(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes the mobile device access override for the given WorkMail organization,
  user, and device.

  Deleting already deleted and non-existing overrides does not produce an error.
  In those cases, the service sends back an HTTP 200 response with an empty HTTP
  body.
  """
  @spec delete_mobile_device_access_override(
          map(),
          delete_mobile_device_access_override_request(),
          list()
        ) ::
          {:ok, delete_mobile_device_access_override_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_mobile_device_access_override_errors()}
  def delete_mobile_device_access_override(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes a mobile device access rule for the specified WorkMail organization.

  Deleting already deleted and non-existing rules does not produce an error. In
  those cases, the service sends back an HTTP 200 response with an empty HTTP
  body.
  """
  @spec delete_mobile_device_access_rule(
          map(),
          delete_mobile_device_access_rule_request(),
          list()
        ) ::
          {:ok, delete_mobile_device_access_rule_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_mobile_device_access_rule_errors()}
  def delete_mobile_device_access_rule(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes an WorkMail organization and all underlying AWS resources managed by
  WorkMail as part of the organization.

  You can choose whether to delete the associated directory. For more information,
  see [Removing an organization](https://docs.aws.amazon.com/workmail/latest/adminguide/remove_organization.html)
  in the *WorkMail Administrator Guide*.
  """
  @spec delete_organization(map(), delete_organization_request(), list()) ::
          {:ok, delete_organization_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_organization_errors()}
  def delete_organization(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Deletes the Personal Access Token from the provided WorkMail Organization.
  """
  @spec delete_personal_access_token(map(), delete_personal_access_token_request(), list()) ::
          {:ok, delete_personal_access_token_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_personal_access_token_errors()}
  def delete_personal_access_token(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes the specified resource.
  """
  @spec delete_resource(map(), delete_resource_request(), list()) ::
          {:ok, delete_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_resource_errors()}
  def delete_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes the specified retention policy from the specified organization.
  """
  @spec delete_retention_policy(map(), delete_retention_policy_request(), list()) ::
          {:ok, delete_retention_policy_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_retention_policy_errors()}
  def delete_retention_policy(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Deletes a user from WorkMail and all subsequent systems.

  Before you can delete a
  user, the user state must be `DISABLED`. Use the `DescribeUser`
  action to confirm the user state.

  Deleting a user is permanent and cannot be undone. WorkMail archives user
  mailboxes for
  30 days before they are permanently removed.
  """
  @spec delete_user(map(), delete_user_request(), list()) ::
          {:ok, delete_user_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_user_errors()}
  def delete_user(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Mark a user, group, or resource as no longer used in WorkMail.

  This action
  disassociates the mailbox and schedules it for clean-up. WorkMail keeps
  mailboxes for 30 days
  before they are permanently removed. The functionality in the console is
  *Disable*.
  """
  @spec deregister_from_work_mail(map(), deregister_from_work_mail_request(), list()) ::
          {:ok, deregister_from_work_mail_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, deregister_from_work_mail_errors()}
  def deregister_from_work_mail(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Removes a domain from WorkMail, stops email routing to WorkMail, and removes the
  authorization allowing WorkMail use.

  SES keeps the domain because other applications may use it. You must first
  remove any email address used by WorkMail entities before you remove the domain.
  """
  @spec deregister_mail_domain(map(), deregister_mail_domain_request(), list()) ::
          {:ok, deregister_mail_domain_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, deregister_mail_domain_errors()}
  def deregister_mail_domain(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Describes the current email monitoring configuration for a specified
  organization.
  """
  @spec describe_email_monitoring_configuration(
          map(),
          describe_email_monitoring_configuration_request(),
          list()
        ) ::
          {:ok, describe_email_monitoring_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_email_monitoring_configuration_errors()}
  def describe_email_monitoring_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns basic details about an entity in WorkMail.
  """
  @spec describe_entity(map(), describe_entity_request(), list()) ::
          {:ok, describe_entity_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_entity_errors()}
  def describe_entity(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns the data available for the group.
  """
  @spec describe_group(map(), describe_group_request(), list()) ::
          {:ok, describe_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_group_errors()}
  def describe_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Returns detailed information on the current IdC setup for the WorkMail
  organization.
  """
  @spec describe_identity_provider_configuration(
          map(),
          describe_identity_provider_configuration_request(),
          list()
        ) ::
          {:ok, describe_identity_provider_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_identity_provider_configuration_errors()}
  def describe_identity_provider_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the settings in a DMARC policy for a specified organization.
  """
  @spec describe_inbound_dmarc_settings(map(), describe_inbound_dmarc_settings_request(), list()) ::
          {:ok, describe_inbound_dmarc_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_inbound_dmarc_settings_errors()}
  def describe_inbound_dmarc_settings(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Describes the current status of a mailbox export job.
  """
  @spec describe_mailbox_export_job(map(), describe_mailbox_export_job_request(), list()) ::
          {:ok, describe_mailbox_export_job_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_mailbox_export_job_errors()}
  def describe_mailbox_export_job(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Provides more information regarding a given organization based on its
  identifier.
  """
  @spec describe_organization(map(), describe_organization_request(), list()) ::
          {:ok, describe_organization_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_organization_errors()}
  def describe_organization(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns the data available for the resource.
  """
  @spec describe_resource(map(), describe_resource_request(), list()) ::
          {:ok, describe_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_resource_errors()}
  def describe_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Provides information regarding the user.
  """
  @spec describe_user(map(), describe_user_request(), list()) ::
          {:ok, describe_user_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_user_errors()}
  def describe_user(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Removes a member from the resource's set of delegates.
  """
  @spec disassociate_delegate_from_resource(
          map(),
          disassociate_delegate_from_resource_request(),
          list()
        ) ::
          {:ok, disassociate_delegate_from_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, disassociate_delegate_from_resource_errors()}
  def disassociate_delegate_from_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Removes a member from a group.
  """
  @spec disassociate_member_from_group(map(), disassociate_member_from_group_request(), list()) ::
          {:ok, disassociate_member_from_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, disassociate_member_from_group_errors()}
  def disassociate_member_from_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Gets the effects of an organization's access control rules as they apply to a
  specified IPv4 address, access protocol action, and user ID or impersonation
  role ID.

  You must provide either the user ID or impersonation role ID. Impersonation role
  ID can only be used with Action EWS.
  """
  @spec get_access_control_effect(map(), get_access_control_effect_request(), list()) ::
          {:ok, get_access_control_effect_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_access_control_effect_errors()}
  def get_access_control_effect(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Gets the default retention policy details for the specified organization.
  """
  @spec get_default_retention_policy(map(), get_default_retention_policy_request(), list()) ::
          {:ok, get_default_retention_policy_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_default_retention_policy_errors()}
  def get_default_retention_policy(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Gets the impersonation role details for the given WorkMail organization.
  """
  @spec get_impersonation_role(map(), get_impersonation_role_request(), list()) ::
          {:ok, get_impersonation_role_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_impersonation_role_errors()}
  def get_impersonation_role(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Tests whether the given impersonation role can impersonate a target user.
  """
  @spec get_impersonation_role_effect(map(), get_impersonation_role_effect_request(), list()) ::
          {:ok, get_impersonation_role_effect_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_impersonation_role_effect_errors()}
  def get_impersonation_role_effect(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Gets details for a mail domain, including domain records required to configure
  your domain with recommended security.
  """
  @spec get_mail_domain(map(), get_mail_domain_request(), list()) ::
          {:ok, get_mail_domain_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_mail_domain_errors()}
  def get_mail_domain(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Requests a user's mailbox details for a specified organization and user.
  """
  @spec get_mailbox_details(map(), get_mailbox_details_request(), list()) ::
          {:ok, get_mailbox_details_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_mailbox_details_errors()}
  def get_mailbox_details(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Simulates the effect of the mobile device access rules for the given attributes
  of a sample access event.

  Use this method to test the effects of the current set of mobile device access
  rules for the WorkMail organization for a particular user's attributes.
  """
  @spec get_mobile_device_access_effect(map(), get_mobile_device_access_effect_request(), list()) ::
          {:ok, get_mobile_device_access_effect_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_mobile_device_access_effect_errors()}
  def get_mobile_device_access_effect(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Gets the mobile device access override for the given WorkMail organization,
  user, and device.
  """
  @spec get_mobile_device_access_override(
          map(),
          get_mobile_device_access_override_request(),
          list()
        ) ::
          {:ok, get_mobile_device_access_override_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_mobile_device_access_override_errors()}
  def get_mobile_device_access_override(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Requests details of a specific Personal Access Token within the WorkMail
  organization.
  """
  @spec get_personal_access_token_metadata(
          map(),
          get_personal_access_token_metadata_request(),
          list()
        ) ::
          {:ok, get_personal_access_token_metadata_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_personal_access_token_metadata_errors()}
  def get_personal_access_token_metadata(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the access control rules for the specified organization.
  """
  @spec list_access_control_rules(map(), list_access_control_rules_request(), list()) ::
          {:ok, list_access_control_rules_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_access_control_rules_errors()}
  def list_access_control_rules(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates a paginated call to list the aliases associated with a given
  entity.
  """
  @spec list_aliases(map(), list_aliases_request(), list()) ::
          {:ok, list_aliases_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_aliases_errors()}
  def list_aliases(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  List all the `AvailabilityConfiguration`'s for the given WorkMail organization.
  """
  @spec list_availability_configurations(
          map(),
          list_availability_configurations_request(),
          list()
        ) ::
          {:ok, list_availability_configurations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_availability_configurations_errors()}
  def list_availability_configurations(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns an overview of the members of a group.

  Users and groups can be members of a
  group.
  """
  @spec list_group_members(map(), list_group_members_request(), list()) ::
          {:ok, list_group_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_group_members_errors()}
  def list_group_members(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns summaries of the organization's groups.
  """
  @spec list_groups(map(), list_groups_request(), list()) ::
          {:ok, list_groups_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_groups_errors()}
  def list_groups(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns all the groups to which an entity belongs.
  """
  @spec list_groups_for_entity(map(), list_groups_for_entity_request(), list()) ::
          {:ok, list_groups_for_entity_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_groups_for_entity_errors()}
  def list_groups_for_entity(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists all the impersonation roles for the given WorkMail organization.
  """
  @spec list_impersonation_roles(map(), list_impersonation_roles_request(), list()) ::
          {:ok, list_impersonation_roles_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_impersonation_roles_errors()}
  def list_impersonation_roles(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the mail domains in a given WorkMail organization.
  """
  @spec list_mail_domains(map(), list_mail_domains_request(), list()) ::
          {:ok, list_mail_domains_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_mail_domains_errors()}
  def list_mail_domains(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the mailbox export jobs started for the specified organization within the
  last
  seven days.
  """
  @spec list_mailbox_export_jobs(map(), list_mailbox_export_jobs_request(), list()) ::
          {:ok, list_mailbox_export_jobs_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_mailbox_export_jobs_errors()}
  def list_mailbox_export_jobs(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the mailbox permissions associated with a user, group, or resource
  mailbox.
  """
  @spec list_mailbox_permissions(map(), list_mailbox_permissions_request(), list()) ::
          {:ok, list_mailbox_permissions_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_mailbox_permissions_errors()}
  def list_mailbox_permissions(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists all the mobile device access overrides for any given combination of
  WorkMail organization, user, or device.
  """
  @spec list_mobile_device_access_overrides(
          map(),
          list_mobile_device_access_overrides_request(),
          list()
        ) ::
          {:ok, list_mobile_device_access_overrides_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_mobile_device_access_overrides_errors()}
  def list_mobile_device_access_overrides(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the mobile device access rules for the specified WorkMail organization.
  """
  @spec list_mobile_device_access_rules(map(), list_mobile_device_access_rules_request(), list()) ::
          {:ok, list_mobile_device_access_rules_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_mobile_device_access_rules_errors()}
  def list_mobile_device_access_rules(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns summaries of the customer's organizations.
  """
  @spec list_organizations(map(), list_organizations_request(), list()) ::
          {:ok, list_organizations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_organizations_errors()}
  def list_organizations(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Returns a summary of your Personal Access Tokens.
  """
  @spec list_personal_access_tokens(map(), list_personal_access_tokens_request(), list()) ::
          {:ok, list_personal_access_tokens_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_personal_access_tokens_errors()}
  def list_personal_access_tokens(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the delegates associated with a resource.

  Users and groups can be resource
  delegates and answer requests on behalf of the resource.
  """
  @spec list_resource_delegates(map(), list_resource_delegates_request(), list()) ::
          {:ok, list_resource_delegates_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_resource_delegates_errors()}
  def list_resource_delegates(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Returns summaries of the organization's resources.
  """
  @spec list_resources(map(), list_resources_request(), list()) ::
          {:ok, list_resources_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_resources_errors()}
  def list_resources(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Lists the tags applied to an WorkMail organization 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 """
  Returns summaries of the organization's users.
  """
  @spec list_users(map(), list_users_request(), list()) ::
          {:ok, list_users_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_users_errors()}
  def list_users(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Adds a new access control rule for the specified organization.

  The rule allows or
  denies access to the organization for the specified IPv4 addresses, access
  protocol
  actions, user IDs and impersonation IDs. Adding a new rule with the same name as
  an existing rule replaces
  the older rule.
  """
  @spec put_access_control_rule(map(), put_access_control_rule_request(), list()) ::
          {:ok, put_access_control_rule_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_access_control_rule_errors()}
  def put_access_control_rule(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates or updates the email monitoring configuration for a specified
  organization.
  """
  @spec put_email_monitoring_configuration(
          map(),
          put_email_monitoring_configuration_request(),
          list()
        ) ::
          {:ok, put_email_monitoring_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_email_monitoring_configuration_errors()}
  def put_email_monitoring_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """

  Enables integration between IAM Identity Center (IdC) and WorkMail to proxy
  authentication requests for mailbox users.

  You can connect your IdC directory or your external directory to WorkMail
  through
  IdC and manage access to WorkMail mailboxes in a single place. For enhanced
  protection, you could enable Multifactor Authentication (MFA) and Personal
  Access Tokens.
  """
  @spec put_identity_provider_configuration(
          map(),
          put_identity_provider_configuration_request(),
          list()
        ) ::
          {:ok, put_identity_provider_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_identity_provider_configuration_errors()}
  def put_identity_provider_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Enables or disables a DMARC policy for a given organization.
  """
  @spec put_inbound_dmarc_settings(map(), put_inbound_dmarc_settings_request(), list()) ::
          {:ok, put_inbound_dmarc_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_inbound_dmarc_settings_errors()}
  def put_inbound_dmarc_settings(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Sets permissions for a user, group, or resource.

  This replaces any pre-existing
  permissions.
  """
  @spec put_mailbox_permissions(map(), put_mailbox_permissions_request(), list()) ::
          {:ok, put_mailbox_permissions_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_mailbox_permissions_errors()}
  def put_mailbox_permissions(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Creates or updates a mobile device access override for the given WorkMail
  organization, user, and device.
  """
  @spec put_mobile_device_access_override(
          map(),
          put_mobile_device_access_override_request(),
          list()
        ) ::
          {:ok, put_mobile_device_access_override_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_mobile_device_access_override_errors()}
  def put_mobile_device_access_override(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Puts a retention policy to the specified organization.
  """
  @spec put_retention_policy(map(), put_retention_policy_request(), list()) ::
          {:ok, put_retention_policy_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_retention_policy_errors()}
  def put_retention_policy(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Registers a new domain in WorkMail and SES, and configures it for use by
  WorkMail.

  Emails received by SES for this domain are routed to the specified WorkMail
  organization, and WorkMail has
  permanent permission to use the specified domain for sending your users' emails.
  """
  @spec register_mail_domain(map(), register_mail_domain_request(), list()) ::
          {:ok, register_mail_domain_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, register_mail_domain_errors()}
  def register_mail_domain(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Registers an existing and disabled user, group, or resource for WorkMail use by
  associating a mailbox and calendaring capabilities.

  It performs no change if the user,
  group, or resource is enabled and fails if the user, group, or resource is
  deleted. This
  operation results in the accumulation of costs. For more information, see
  [Pricing](https://aws.amazon.com/workmail/pricing). The equivalent console
  functionality for this operation is *Enable*.

  Users can either be created by calling the `CreateUser` API operation
  or they can be synchronized from your directory. For more information, see
  `DeregisterFromWorkMail`.
  """
  @spec register_to_work_mail(map(), register_to_work_mail_request(), list()) ::
          {:ok, register_to_work_mail_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, register_to_work_mail_errors()}
  def register_to_work_mail(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Allows the administrator to reset the password for a user.
  """
  @spec reset_password(map(), reset_password_request(), list()) ::
          {:ok, reset_password_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, reset_password_errors()}
  def reset_password(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Starts a mailbox export job to export MIME-format email messages and calendar
  items
  from the specified mailbox to the specified Amazon Simple Storage Service
  (Amazon S3)
  bucket.

  For more information, see [Exporting mailbox content](https://docs.aws.amazon.com/workmail/latest/adminguide/mail-export.html)
  in
  the *WorkMail Administrator Guide*.
  """
  @spec start_mailbox_export_job(map(), start_mailbox_export_job_request(), list()) ::
          {:ok, start_mailbox_export_job_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_mailbox_export_job_errors()}
  def start_mailbox_export_job(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Applies the specified tags to the specified WorkMailorganization
  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 """
  Performs a test on an availability provider to ensure that access is allowed.

  For EWS, it verifies the provided credentials can be used to successfully log
  in. For Lambda, it verifies that the Lambda function can be invoked and that the
  resource access
  policy was configured to deny anonymous access. An anonymous invocation is one
  done without providing either a `SourceArn` or `SourceAccount` header.

  The request must contain either one provider definition (`EwsProvider` or
  `LambdaProvider`) or the `DomainName` parameter. If the
  `DomainName` parameter is provided, the configuration stored under the
  `DomainName` will be tested.
  """
  @spec test_availability_configuration(map(), test_availability_configuration_request(), list()) ::
          {:ok, test_availability_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, test_availability_configuration_errors()}
  def test_availability_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Untags the specified tags from the specified WorkMail organization
  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 `AvailabilityConfiguration` for the given WorkMail
  organization and domain.
  """
  @spec update_availability_configuration(
          map(),
          update_availability_configuration_request(),
          list()
        ) ::
          {:ok, update_availability_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_availability_configuration_errors()}
  def update_availability_configuration(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates the default mail domain for an organization.

  The default mail domain is used by the WorkMail AWS Console to suggest an email
  address when enabling a mail user. You can only have one default domain.
  """
  @spec update_default_mail_domain(map(), update_default_mail_domain_request(), list()) ::
          {:ok, update_default_mail_domain_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_default_mail_domain_errors()}
  def update_default_mail_domain(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates attributes in a group.
  """
  @spec update_group(map(), update_group_request(), list()) ::
          {:ok, update_group_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_group_errors()}
  def update_group(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates an impersonation role for the given WorkMail organization.
  """
  @spec update_impersonation_role(map(), update_impersonation_role_request(), list()) ::
          {:ok, update_impersonation_role_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_impersonation_role_errors()}
  def update_impersonation_role(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates a user's current mailbox quota for a specified organization and
  user.
  """
  @spec update_mailbox_quota(map(), update_mailbox_quota_request(), list()) ::
          {:ok, update_mailbox_quota_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_mailbox_quota_errors()}
  def update_mailbox_quota(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates a mobile device access rule for the specified WorkMail organization.
  """
  @spec update_mobile_device_access_rule(
          map(),
          update_mobile_device_access_rule_request(),
          list()
        ) ::
          {:ok, update_mobile_device_access_rule_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_mobile_device_access_rule_errors()}
  def update_mobile_device_access_rule(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates the primary email for a user, group, or resource.

  The current email is moved
  into the list of aliases (or swapped between an existing alias and the current
  primary
  email), and the email provided in the input is promoted as the primary.
  """
  @spec update_primary_email_address(map(), update_primary_email_address_request(), list()) ::
          {:ok, update_primary_email_address_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_primary_email_address_errors()}
  def update_primary_email_address(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates data for the resource.

  To have the latest information, it must be preceded by
  a `DescribeResource` call. The dataset in the request should be the one
  expected when performing another `DescribeResource` call.
  """
  @spec update_resource(map(), update_resource_request(), list()) ::
          {:ok, update_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_resource_errors()}
  def update_resource(%Client{} = client, input, options \\ []) do
    meta = metadata()

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

  @doc """
  Updates data for the user.

  To have the latest information, it must be preceded by a
  `DescribeUser` call. The dataset in the request should be the one
  expected when performing another `DescribeUser` call.
  """
  @spec update_user(map(), update_user_request(), list()) ::
          {:ok, update_user_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_user_errors()}
  def update_user(%Client{} = client, input, options \\ []) do
    meta = metadata()

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