lib/aws/generated/guard_duty.ex

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

defmodule AWS.GuardDuty do
  @moduledoc """
  Amazon GuardDuty is a continuous security monitoring service that analyzes and
  processes
  the following foundational data sources - VPC flow logs, Amazon Web Services
  CloudTrail management event logs, CloudTrail S3 data event
  logs, EKS audit logs, DNS logs, Amazon EBS volume data, runtime activity
  belonging to container workloads, such
  as Amazon EKS, Amazon ECS (including Amazon Web Services Fargate), and Amazon
  EC2 instances.

  It uses threat intelligence
  feeds, such as lists of malicious IPs and domains, and machine learning to
  identify
  unexpected, potentially unauthorized, and malicious activity within your Amazon
  Web Services environment.
  This can include issues like escalations of privileges, uses of exposed
  credentials, or
  communication with malicious IPs, domains, or presence of malware on your Amazon
  EC2 instances
  and container workloads. For example, GuardDuty can detect compromised EC2
  instances and
  container workloads serving malware, or mining bitcoin.

  GuardDuty also monitors Amazon Web Services account access behavior for signs of
  compromise, such as
  unauthorized infrastructure deployments like EC2 instances deployed in a Region
  that has never
  been used, or unusual API calls like a password policy change to reduce password
  strength.

  GuardDuty informs you about the status of your Amazon Web Services environment
  by producing security
  findings that you can view in the GuardDuty console or through Amazon
  EventBridge. For more
  information, see the *
  [Amazon GuardDuty User
  Guide](https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html)
  *.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      organization_kubernetes_configuration() :: %{
        "AuditLogs" => organization_kubernetes_audit_logs_configuration()
      }

  """
  @type organization_kubernetes_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      resource_data() :: %{
        "AccessKey" => access_key(),
        "Ec2Instance" => ec2_instance(),
        "Ec2NetworkInterface" => ec2_network_interface(),
        "S3Bucket" => s3_bucket(),
        "S3Object" => s3_object()
      }

  """
  @type resource_data() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disassociate_from_master_account_request() :: %{}

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

  @typedoc """

  ## Example:

      cloud_trail_configuration_result() :: %{
        "Status" => list(any())
      }

  """
  @type cloud_trail_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization() :: %{
        "Asn" => String.t(),
        "AsnOrg" => String.t(),
        "Isp" => String.t(),
        "Org" => String.t()
      }

  """
  @type organization() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      instance_details() :: %{
        "AvailabilityZone" => String.t(),
        "IamInstanceProfile" => iam_instance_profile(),
        "ImageDescription" => String.t(),
        "ImageId" => String.t(),
        "InstanceId" => String.t(),
        "InstanceState" => String.t(),
        "InstanceType" => String.t(),
        "LaunchTime" => String.t(),
        "NetworkInterfaces" => list(network_interface()()),
        "OutpostArn" => String.t(),
        "Platform" => String.t(),
        "ProductCodes" => list(product_code()()),
        "Tags" => list(tag()())
      }

  """
  @type instance_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member_data_source_configuration() :: %{
        "AccountId" => String.t(),
        "DataSources" => data_source_configurations_result(),
        "Features" => list(member_features_configuration_result()())
      }

  """
  @type member_data_source_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      data_sources_free_trial() :: %{
        "CloudTrail" => data_source_free_trial(),
        "DnsLogs" => data_source_free_trial(),
        "FlowLogs" => data_source_free_trial(),
        "Kubernetes" => kubernetes_data_source_free_trial(),
        "MalwareProtection" => malware_protection_data_source_free_trial(),
        "S3Logs" => data_source_free_trial()
      }

  """
  @type data_sources_free_trial() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_usage_statistics_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t(),
        optional("Unit") => String.t(),
        required("UsageCriteria") => usage_criteria(),
        required("UsageStatisticType") => list(any())
      }

  """
  @type get_usage_statistics_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_data_source_result() :: %{
        "DataSource" => list(any()),
        "Total" => total()
      }

  """
  @type usage_data_source_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      scan_resource_criteria() :: %{
        "Exclude" => map(),
        "Include" => map()
      }

  """
  @type scan_resource_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      decline_invitations_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type decline_invitations_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_plan_tagging_action() :: %{
        "Status" => list(any())
      }

  """
  @type malware_protection_plan_tagging_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      container() :: %{
        "ContainerRuntime" => String.t(),
        "Id" => String.t(),
        "Image" => String.t(),
        "ImagePrefix" => String.t(),
        "Name" => String.t(),
        "SecurityContext" => security_context(),
        "VolumeMounts" => list(volume_mount()())
      }

  """
  @type container() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      remote_ip_details() :: %{
        "City" => city(),
        "Country" => country(),
        "GeoLocation" => geo_location(),
        "IpAddressV4" => String.t(),
        "IpAddressV6" => String.t(),
        "Organization" => organization()
      }

  """
  @type remote_ip_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disable_organization_admin_account_response() :: %{}

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

  @typedoc """

  ## Example:

      kubernetes_data_source_free_trial() :: %{
        "AuditLogs" => data_source_free_trial()
      }

  """
  @type kubernetes_data_source_free_trial() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_ebs_volumes_result() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_ebs_volumes_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      administrator() :: %{
        "AccountId" => String.t(),
        "InvitationId" => String.t(),
        "InvitedAt" => String.t(),
        "RelationshipStatus" => String.t()
      }

  """
  @type administrator() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_statistics() :: %{
        "SumByAccount" => list(usage_account_result()()),
        "SumByDataSource" => list(usage_data_source_result()()),
        "SumByFeature" => list(usage_feature_result()()),
        "SumByResource" => list(usage_resource_result()()),
        "TopAccountsByFeature" => list(usage_top_accounts_result()()),
        "TopResources" => list(usage_resource_result()())
      }

  """
  @type usage_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      filter_condition() :: %{
        "EqualsValue" => String.t(),
        "GreaterThan" => float(),
        "LessThan" => float()
      }

  """
  @type filter_condition() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_malware_protection_plan_response() :: %{
        "Actions" => malware_protection_plan_actions(),
        "Arn" => String.t(),
        "CreatedAt" => non_neg_integer(),
        "ProtectedResource" => create_protected_resource(),
        "Role" => String.t(),
        "Status" => list(any()),
        "StatusReasons" => list(malware_protection_plan_status_reason()()),
        "Tags" => map()
      }

  """
  @type get_malware_protection_plan_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      describe_organization_configuration_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type describe_organization_configuration_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_bucket_detail() :: %{
        "Arn" => String.t(),
        "CreatedAt" => non_neg_integer(),
        "DefaultServerSideEncryption" => default_server_side_encryption(),
        "Name" => String.t(),
        "Owner" => owner(),
        "PublicAccess" => public_access(),
        "S3ObjectDetails" => list(s3_object_detail()()),
        "Tags" => list(tag()()),
        "Type" => String.t()
      }

  """
  @type s3_bucket_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      data_source_configurations_result() :: %{
        "CloudTrail" => cloud_trail_configuration_result(),
        "DNSLogs" => dns_logs_configuration_result(),
        "FlowLogs" => flow_logs_configuration_result(),
        "Kubernetes" => kubernetes_configuration_result(),
        "MalwareProtection" => malware_protection_configuration_result(),
        "S3Logs" => s3_logs_configuration_result()
      }

  """
  @type data_source_configurations_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_ip_sets_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_ip_sets_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_findings_statistics_request() :: %{
        optional("FindingCriteria") => finding_criteria(),
        optional("FindingStatisticTypes") => list(list(any())()),
        optional("GroupBy") => list(any()),
        optional("MaxResults") => integer(),
        optional("OrderBy") => list(any())
      }

  """
  @type get_findings_statistics_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_members_response() :: %{
        "Members" => list(member()()),
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type get_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_member_detectors_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type get_member_detectors_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      admin_account() :: %{
        "AdminAccountId" => String.t(),
        "AdminStatus" => list(any())
      }

  """
  @type admin_account() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      sequence() :: %{
        "Actors" => list(actor()()),
        "Description" => String.t(),
        "Endpoints" => list(network_endpoint()()),
        "Resources" => list(resource_v2()()),
        "SequenceIndicators" => list(indicator()()),
        "Signals" => list(signal()()),
        "Uid" => String.t()
      }

  """
  @type sequence() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      archive_findings_response() :: %{}

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

  @typedoc """

  ## Example:

      accept_administrator_invitation_request() :: %{
        required("AdministratorId") => String.t(),
        required("InvitationId") => String.t()
      }

  """
  @type accept_administrator_invitation_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_condition_pair() :: %{
        "Key" => String.t(),
        "Value" => String.t()
      }

  """
  @type scan_condition_pair() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      destination_properties() :: %{
        "DestinationArn" => String.t(),
        "KmsKeyArn" => String.t()
      }

  """
  @type destination_properties() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ebs_volume_details() :: %{
        "ScannedVolumeDetails" => list(volume_detail()()),
        "SkippedVolumeDetails" => list(volume_detail()())
      }

  """
  @type ebs_volume_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_threat_intel_set_response() :: %{}

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

  @typedoc """

  ## Example:

      kubernetes_audit_logs_configuration() :: %{
        "Enable" => boolean()
      }

  """
  @type kubernetes_audit_logs_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_workload_details() :: %{
        "Containers" => list(container()()),
        "HostIPC" => boolean(),
        "HostNetwork" => boolean(),
        "HostPID" => boolean(),
        "Name" => String.t(),
        "Namespace" => String.t(),
        "ServiceAccountName" => String.t(),
        "Type" => String.t(),
        "Uid" => String.t(),
        "Volumes" => list(volume()())
      }

  """
  @type kubernetes_workload_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_administrator_account_request() :: %{}

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

  @typedoc """

  ## Example:

      process_details() :: %{
        "Euid" => integer(),
        "ExecutablePath" => String.t(),
        "ExecutableSha256" => String.t(),
        "Lineage" => list(lineage_object()()),
        "Name" => String.t(),
        "NamespacePid" => integer(),
        "ParentUuid" => String.t(),
        "Pid" => integer(),
        "Pwd" => String.t(),
        "StartTime" => non_neg_integer(),
        "User" => String.t(),
        "UserId" => integer(),
        "Uuid" => String.t()
      }

  """
  @type process_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      untag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      list_publishing_destinations_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_publishing_destinations_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      filter_criteria() :: %{
        "FilterCriterion" => list(filter_criterion()())
      }

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

  @typedoc """

  ## Example:

      filter_criterion() :: %{
        "CriterionKey" => list(any()),
        "FilterCondition" => filter_condition()
      }

  """
  @type filter_criterion() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      network_connection_action() :: %{
        "Blocked" => boolean(),
        "ConnectionDirection" => String.t(),
        "LocalIpDetails" => local_ip_details(),
        "LocalNetworkInterface" => String.t(),
        "LocalPortDetails" => local_port_details(),
        "Protocol" => String.t(),
        "RemoteIpDetails" => remote_ip_details(),
        "RemotePortDetails" => remote_port_details()
      }

  """
  @type network_connection_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_malware_protection_plan_response() :: %{
        "MalwareProtectionPlanId" => String.t()
      }

  """
  @type create_malware_protection_plan_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      account_level_permissions() :: %{
        "BlockPublicAccess" => block_public_access()
      }

  """
  @type account_level_permissions() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_filter_condition() :: %{
        "Equals" => list(String.t()()),
        "NotEquals" => list(String.t()())
      }

  """
  @type coverage_filter_condition() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_configuration() :: %{
        "ScanEc2InstanceWithFindings" => scan_ec2_instance_with_findings()
      }

  """
  @type malware_protection_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      local_port_details() :: %{
        "Port" => integer(),
        "PortName" => String.t()
      }

  """
  @type local_port_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      start_monitoring_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type start_monitoring_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_configuration_result() :: %{
        "ScanEc2InstanceWithFindings" => scan_ec2_instance_with_findings_result(),
        "ServiceRole" => String.t()
      }

  """
  @type malware_protection_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_api_call_action() :: %{
        "Namespace" => String.t(),
        "Parameters" => String.t(),
        "RemoteIpDetails" => remote_ip_details(),
        "RequestUri" => String.t(),
        "Resource" => String.t(),
        "ResourceName" => String.t(),
        "SourceIps" => list(String.t()()),
        "StatusCode" => integer(),
        "Subresource" => String.t(),
        "UserAgent" => String.t(),
        "Verb" => String.t()
      }

  """
  @type kubernetes_api_call_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      detector_feature_configuration_result() :: %{
        "AdditionalConfiguration" => list(detector_additional_configuration_result()()),
        "Name" => list(any()),
        "Status" => list(any()),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type detector_feature_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      highest_severity_threat_details() :: %{
        "Count" => integer(),
        "Severity" => String.t(),
        "ThreatName" => String.t()
      }

  """
  @type highest_severity_threat_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_filter_criterion() :: %{
        "CriterionKey" => list(any()),
        "FilterCondition" => coverage_filter_condition()
      }

  """
  @type coverage_filter_criterion() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_malware_protection_configuration() :: %{
        "ScanEc2InstanceWithFindings" => organization_scan_ec2_instance_with_findings()
      }

  """
  @type organization_malware_protection_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      public_access_configuration() :: %{
        "PublicAclAccess" => list(any()),
        "PublicAclIgnoreBehavior" => list(any()),
        "PublicBucketRestrictBehavior" => list(any()),
        "PublicPolicyAccess" => list(any())
      }

  """
  @type public_access_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      rds_db_user_details() :: %{
        "Application" => String.t(),
        "AuthMethod" => String.t(),
        "Database" => String.t(),
        "Ssl" => String.t(),
        "User" => String.t()
      }

  """
  @type rds_db_user_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_ec2_instance_with_findings() :: %{
        "EbsVolumes" => boolean()
      }

  """
  @type scan_ec2_instance_with_findings() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_protected_resource() :: %{
        "S3Bucket" => update_s3_bucket_resource()
      }

  """
  @type update_protected_resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      invitation() :: %{
        "AccountId" => String.t(),
        "InvitationId" => String.t(),
        "InvitedAt" => String.t(),
        "RelationshipStatus" => String.t()
      }

  """
  @type invitation() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disassociate_from_master_account_response() :: %{}

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

  @typedoc """

  ## Example:

      lambda_details() :: %{
        "Description" => String.t(),
        "FunctionArn" => String.t(),
        "FunctionName" => String.t(),
        "FunctionVersion" => String.t(),
        "LastModifiedAt" => non_neg_integer(),
        "RevisionId" => String.t(),
        "Role" => String.t(),
        "Tags" => list(tag()()),
        "VpcConfig" => vpc_config()
      }

  """
  @type lambda_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      rds_limitless_db_details() :: %{
        "DbClusterIdentifier" => String.t(),
        "DbShardGroupArn" => String.t(),
        "DbShardGroupIdentifier" => String.t(),
        "DbShardGroupResourceId" => String.t(),
        "Engine" => String.t(),
        "EngineVersion" => String.t(),
        "Tags" => list(tag()())
      }

  """
  @type rds_limitless_db_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      describe_publishing_destination_response() :: %{
        "DestinationId" => String.t(),
        "DestinationProperties" => destination_properties(),
        "DestinationType" => list(any()),
        "PublishingFailureStartTimestamp" => float(),
        "Status" => list(any())
      }

  """
  @type describe_publishing_destination_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      describe_malware_scans_request() :: %{
        optional("FilterCriteria") => filter_criteria(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t(),
        optional("SortCriteria") => sort_criteria()
      }

  """
  @type describe_malware_scans_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_publishing_destination_response() :: %{}

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

  @typedoc """

  ## Example:

      get_coverage_statistics_response() :: %{
        "CoverageStatistics" => coverage_statistics()
      }

  """
  @type get_coverage_statistics_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      network_interface() :: %{
        "Ipv6Addresses" => list(String.t()()),
        "NetworkInterfaceId" => String.t(),
        "PrivateDnsName" => String.t(),
        "PrivateIpAddress" => String.t(),
        "PrivateIpAddresses" => list(private_ip_address_details()()),
        "PublicDnsName" => String.t(),
        "PublicIp" => String.t(),
        "SecurityGroups" => list(security_group()()),
        "SubnetId" => String.t(),
        "VpcId" => String.t()
      }

  """
  @type network_interface() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_additional_configuration() :: %{
        "AutoEnable" => list(any()),
        "Name" => list(any())
      }

  """
  @type organization_additional_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_filter_response() :: %{
        "Action" => list(any()),
        "Description" => String.t(),
        "FindingCriteria" => finding_criteria(),
        "Name" => String.t(),
        "Rank" => integer(),
        "Tags" => map()
      }

  """
  @type get_filter_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_s3_logs_configuration() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_s3_logs_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_findings_statistics_response() :: %{
        "FindingStatistics" => finding_statistics(),
        "NextToken" => String.t()
      }

  """
  @type get_findings_statistics_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      remote_port_details() :: %{
        "Port" => integer(),
        "PortName" => String.t()
      }

  """
  @type remote_port_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_ip_set_response() :: %{}

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

  @typedoc """

  ## Example:

      network_geo_location() :: %{
        "City" => String.t(),
        "Country" => String.t(),
        "Latitude" => float(),
        "Longitude" => float()
      }

  """
  @type network_geo_location() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_object() :: %{
        "ETag" => String.t(),
        "Key" => String.t(),
        "VersionId" => String.t()
      }

  """
  @type s3_object() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_findings_response() :: %{
        "FindingIds" => list(String.t()()),
        "NextToken" => String.t()
      }

  """
  @type list_findings_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_sort_criteria() :: %{
        "AttributeName" => list(any()),
        "OrderBy" => list(any())
      }

  """
  @type coverage_sort_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_filter_response() :: %{
        "Name" => String.t()
      }

  """
  @type create_filter_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_threat_intel_set_request() :: %{}

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

  @typedoc """

  ## Example:

      update_malware_scan_settings_request() :: %{
        optional("EbsSnapshotPreservation") => list(any()),
        optional("ScanResourceCriteria") => scan_resource_criteria()
      }

  """
  @type update_malware_scan_settings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_ip_set_request() :: %{}

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

  @typedoc """

  ## Example:

      list_detectors_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_detectors_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_logs_configuration_result() :: %{
        "Status" => list(any())
      }

  """
  @type s3_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      service() :: %{
        "Action" => action(),
        "AdditionalInfo" => service_additional_info(),
        "Archived" => boolean(),
        "Count" => integer(),
        "Detection" => detection(),
        "DetectorId" => String.t(),
        "EbsVolumeScanDetails" => ebs_volume_scan_details(),
        "EventFirstSeen" => String.t(),
        "EventLastSeen" => String.t(),
        "Evidence" => evidence(),
        "FeatureName" => String.t(),
        "MalwareScanDetails" => malware_scan_details(),
        "ResourceRole" => String.t(),
        "RuntimeDetails" => runtime_details(),
        "ServiceName" => String.t(),
        "UserFeedback" => String.t()
      }

  """
  @type service() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_findings_request() :: %{
        optional("SortCriteria") => sort_criteria(),
        required("FindingIds") => list(String.t()())
      }

  """
  @type get_findings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      agent_details() :: %{
        "Version" => String.t()
      }

  """
  @type agent_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_publishing_destination_request() :: %{
        optional("ClientToken") => String.t(),
        required("DestinationProperties") => destination_properties(),
        required("DestinationType") => list(any())
      }

  """
  @type create_publishing_destination_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      account_detail() :: %{
        "AccountId" => String.t(),
        "Email" => String.t()
      }

  """
  @type account_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      host_path() :: %{
        "Path" => String.t()
      }

  """
  @type host_path() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      volume_detail() :: %{
        "DeviceName" => String.t(),
        "EncryptionType" => String.t(),
        "KmsKeyArn" => String.t(),
        "SnapshotArn" => String.t(),
        "VolumeArn" => String.t(),
        "VolumeSizeInGB" => integer(),
        "VolumeType" => String.t()
      }

  """
  @type volume_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      public_access() :: %{
        "EffectivePermission" => String.t(),
        "PermissionConfiguration" => permission_configuration()
      }

  """
  @type public_access() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      country() :: %{
        "CountryCode" => String.t(),
        "CountryName" => String.t()
      }

  """
  @type country() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      total() :: %{
        "Amount" => String.t(),
        "Unit" => String.t()
      }

  """
  @type total() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      untag_resource_request() :: %{
        required("TagKeys") => list(String.t()())
      }

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

  @typedoc """

  ## Example:

      detector_feature_configuration() :: %{
        "AdditionalConfiguration" => list(detector_additional_configuration()()),
        "Name" => list(any()),
        "Status" => list(any())
      }

  """
  @type detector_feature_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      account_statistics() :: %{
        "AccountId" => String.t(),
        "LastGeneratedAt" => non_neg_integer(),
        "TotalFindings" => integer()
      }

  """
  @type account_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disable_organization_admin_account_request() :: %{
        required("AdminAccountId") => String.t()
      }

  """
  @type disable_organization_admin_account_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_ip_set_request() :: %{
        optional("Activate") => boolean(),
        optional("Location") => String.t(),
        optional("Name") => String.t()
      }

  """
  @type update_ip_set_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      impersonated_user() :: %{
        "Groups" => list(String.t()()),
        "Username" => String.t()
      }

  """
  @type impersonated_user() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_publishing_destination_request() :: %{}

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

  @typedoc """

  ## Example:

      delete_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type delete_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      invite_members_request() :: %{
        optional("DisableEmailNotification") => boolean(),
        optional("Message") => String.t(),
        required("AccountIds") => list(String.t()())
      }

  """
  @type invite_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      permission_configuration() :: %{
        "AccountLevelPermissions" => account_level_permissions(),
        "BucketLevelPermissions" => bucket_level_permissions()
      }

  """
  @type permission_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_threat_intel_set_response() :: %{}

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

  @typedoc """

  ## Example:

      network_connection() :: %{
        "Direction" => list(any())
      }

  """
  @type network_connection() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_kubernetes_audit_logs_configuration_result() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_kubernetes_audit_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member_features_configuration_result() :: %{
        "AdditionalConfiguration" => list(member_additional_configuration_result()()),
        "Name" => list(any()),
        "Status" => list(any()),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type member_features_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      autonomous_system() :: %{
        "Name" => String.t(),
        "Number" => integer()
      }

  """
  @type autonomous_system() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_audit_logs_configuration_result() :: %{
        "Status" => list(any())
      }

  """
  @type kubernetes_audit_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_threat_intel_sets_response() :: %{
        "NextToken" => String.t(),
        "ThreatIntelSetIds" => list(String.t()())
      }

  """
  @type list_threat_intel_sets_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      observations() :: %{
        "Text" => list(String.t()())
      }

  """
  @type observations() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_data_source_configurations_result() :: %{
        "Kubernetes" => organization_kubernetes_configuration_result(),
        "MalwareProtection" => organization_malware_protection_configuration_result(),
        "S3Logs" => organization_s3_logs_configuration_result()
      }

  """
  @type organization_data_source_configurations_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      archive_findings_request() :: %{
        required("FindingIds") => list(String.t()())
      }

  """
  @type archive_findings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_ec2_instance_with_findings_result() :: %{
        "EbsVolumes" => ebs_volumes_result()
      }

  """
  @type scan_ec2_instance_with_findings_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disassociate_from_administrator_account_response() :: %{}

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

  @typedoc """

  ## Example:

      coverage_resource() :: %{
        "AccountId" => String.t(),
        "CoverageStatus" => list(any()),
        "DetectorId" => String.t(),
        "Issue" => String.t(),
        "ResourceDetails" => coverage_resource_details(),
        "ResourceId" => String.t(),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type coverage_resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_filter_response() :: %{
        "Name" => String.t()
      }

  """
  @type update_filter_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_user_details() :: %{
        "Groups" => list(String.t()()),
        "ImpersonatedUser" => impersonated_user(),
        "SessionName" => list(String.t()()),
        "Uid" => String.t(),
        "Username" => String.t()
      }

  """
  @type kubernetes_user_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      threats_detected_item_count() :: %{
        "Files" => integer()
      }

  """
  @type threats_detected_item_count() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_result_details() :: %{
        "ScanResult" => list(any())
      }

  """
  @type scan_result_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      resource_v2() :: %{
        "AccountId" => String.t(),
        "CloudPartition" => String.t(),
        "Data" => resource_data(),
        "Name" => String.t(),
        "Region" => String.t(),
        "ResourceType" => list(any()),
        "Service" => String.t(),
        "Tags" => list(tag()()),
        "Uid" => String.t()
      }

  """
  @type resource_v2() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      describe_organization_configuration_response() :: %{
        "AutoEnable" => boolean(),
        "AutoEnableOrganizationMembers" => list(any()),
        "DataSources" => organization_data_source_configurations_result(),
        "Features" => list(organization_feature_configuration_result()()),
        "MemberAccountLimitReached" => boolean(),
        "NextToken" => String.t()
      }

  """
  @type describe_organization_configuration_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      start_malware_scan_request() :: %{
        required("ResourceArn") => String.t()
      }

  """
  @type start_malware_scan_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_feature_configuration() :: %{
        "AdditionalConfiguration" => list(organization_additional_configuration()()),
        "AutoEnable" => list(any()),
        "Name" => list(any())
      }

  """
  @type organization_feature_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_malware_protection_plan_request() :: %{}

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

  @typedoc """

  ## Example:

      create_detector_response() :: %{
        "DetectorId" => String.t(),
        "UnprocessedDataSources" => unprocessed_data_sources_result()
      }

  """
  @type create_detector_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      detector_additional_configuration_result() :: %{
        "Name" => list(any()),
        "Status" => list(any()),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type detector_additional_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      unarchive_findings_request() :: %{
        required("FindingIds") => list(String.t()())
      }

  """
  @type unarchive_findings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      conflict_exception() :: %{
        "Message" => String.t(),
        "Type" => String.t()
      }

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

  @typedoc """

  ## Example:

      resource_not_found_exception() :: %{
        "Message" => String.t(),
        "Type" => String.t()
      }

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

  @typedoc """

  ## Example:

      dns_request_action() :: %{
        "Blocked" => boolean(),
        "Domain" => String.t(),
        "DomainWithSuffix" => String.t(),
        "Protocol" => String.t()
      }

  """
  @type dns_request_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_filter_request() :: %{
        optional("Action") => list(any()),
        optional("ClientToken") => String.t(),
        optional("Description") => String.t(),
        optional("Rank") => integer(),
        optional("Tags") => map(),
        required("FindingCriteria") => finding_criteria(),
        required("Name") => String.t()
      }

  """
  @type create_filter_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_members_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type get_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      service_additional_info() :: %{
        "Type" => String.t(),
        "Value" => String.t()
      }

  """
  @type service_additional_info() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_publishing_destination_response() :: %{}

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

  @typedoc """

  ## Example:

      create_members_request() :: %{
        required("AccountDetails") => list(account_detail()())
      }

  """
  @type create_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_detector_response() :: %{}

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

  @typedoc """

  ## Example:

      list_ip_sets_response() :: %{
        "IpSetIds" => list(String.t()()),
        "NextToken" => String.t()
      }

  """
  @type list_ip_sets_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_account_result() :: %{
        "AccountId" => String.t(),
        "Total" => total()
      }

  """
  @type usage_account_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_organization_statistics_response() :: %{
        "OrganizationDetails" => organization_details()
      }

  """
  @type get_organization_statistics_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      container_instance_details() :: %{
        "CompatibleContainerInstances" => float(),
        "CoveredContainerInstances" => float()
      }

  """
  @type container_instance_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      organization_scan_ec2_instance_with_findings() :: %{
        "EbsVolumes" => organization_ebs_volumes()
      }

  """
  @type organization_scan_ec2_instance_with_findings() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_bucket() :: %{
        "AccountPublicAccess" => public_access_configuration(),
        "BucketPublicAccess" => public_access_configuration(),
        "CreatedAt" => non_neg_integer(),
        "EffectivePermission" => String.t(),
        "EncryptionKeyArn" => String.t(),
        "EncryptionType" => String.t(),
        "OwnerId" => String.t(),
        "PublicReadAccess" => list(any()),
        "PublicWriteAccess" => list(any()),
        "S3ObjectUids" => list(String.t()())
      }

  """
  @type s3_bucket() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      master() :: %{
        "AccountId" => String.t(),
        "InvitationId" => String.t(),
        "InvitedAt" => String.t(),
        "RelationshipStatus" => String.t()
      }

  """
  @type master() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_detector_request() :: %{
        optional("ClientToken") => String.t(),
        optional("DataSources") => data_source_configurations(),
        optional("Features") => list(detector_feature_configuration()()),
        optional("FindingPublishingFrequency") => list(any()),
        optional("Tags") => map(),
        required("Enable") => boolean()
      }

  """
  @type create_detector_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      remote_account_details() :: %{
        "AccountId" => String.t(),
        "Affiliated" => boolean()
      }

  """
  @type remote_account_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disassociate_members_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type disassociate_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_findings_response() :: %{
        "Findings" => list(finding()())
      }

  """
  @type get_findings_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_threat_intel_set_response() :: %{
        "Format" => list(any()),
        "Location" => String.t(),
        "Name" => String.t(),
        "Status" => list(any()),
        "Tags" => map()
      }

  """
  @type get_threat_intel_set_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_kubernetes_audit_logs_configuration() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_kubernetes_audit_logs_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_ec2_instance_details() :: %{
        "AgentDetails" => agent_details(),
        "ClusterArn" => String.t(),
        "InstanceId" => String.t(),
        "InstanceType" => String.t(),
        "ManagementType" => list(any())
      }

  """
  @type coverage_ec2_instance_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_threat_intel_set_request() :: %{
        optional("Activate") => boolean(),
        optional("Location") => String.t(),
        optional("Name") => String.t()
      }

  """
  @type update_threat_intel_set_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      bucket_policy() :: %{
        "AllowsPublicReadAccess" => boolean(),
        "AllowsPublicWriteAccess" => boolean()
      }

  """
  @type bucket_policy() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      access_key() :: %{
        "PrincipalId" => String.t(),
        "UserName" => String.t(),
        "UserType" => String.t()
      }

  """
  @type access_key() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_malware_protection_plan_request() :: %{}

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

  @typedoc """

  ## Example:

      flow_logs_configuration_result() :: %{
        "Status" => list(any())
      }

  """
  @type flow_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_members_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type delete_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      invite_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type invite_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_malware_scan_settings_response() :: %{
        "EbsSnapshotPreservation" => list(any()),
        "ScanResourceCriteria" => scan_resource_criteria()
      }

  """
  @type get_malware_scan_settings_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member_features_configuration() :: %{
        "AdditionalConfiguration" => list(member_additional_configuration()()),
        "Name" => list(any()),
        "Status" => list(any())
      }

  """
  @type member_features_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      describe_malware_scans_response() :: %{
        "NextToken" => String.t(),
        "Scans" => list(scan()())
      }

  """
  @type describe_malware_scans_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ec2_network_interface() :: %{
        "Ipv6Addresses" => list(String.t()()),
        "PrivateIpAddresses" => list(private_ip_address_details()()),
        "PublicIp" => String.t(),
        "SecurityGroups" => list(security_group()()),
        "SubNetId" => String.t(),
        "VpcId" => String.t()
      }

  """
  @type ec2_network_interface() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ecs_task_details() :: %{
        "Arn" => String.t(),
        "Containers" => list(container()()),
        "DefinitionArn" => String.t(),
        "Group" => String.t(),
        "LaunchType" => String.t(),
        "StartedAt" => non_neg_integer(),
        "StartedBy" => String.t(),
        "Tags" => list(tag()()),
        "TaskCreatedAt" => non_neg_integer(),
        "Version" => String.t(),
        "Volumes" => list(volume()())
      }

  """
  @type ecs_task_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      signal() :: %{
        "ActorIds" => list(String.t()()),
        "Count" => integer(),
        "CreatedAt" => non_neg_integer(),
        "Description" => String.t(),
        "EndpointIds" => list(String.t()()),
        "FirstSeenAt" => non_neg_integer(),
        "LastSeenAt" => non_neg_integer(),
        "Name" => String.t(),
        "ResourceUids" => list(String.t()()),
        "Severity" => float(),
        "SignalIndicators" => list(indicator()()),
        "Type" => list(any()),
        "Uid" => String.t(),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type signal() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_malware_protection_plan_request() :: %{
        optional("Actions") => malware_protection_plan_actions(),
        optional("ClientToken") => String.t(),
        optional("Tags") => map(),
        required("ProtectedResource") => create_protected_resource(),
        required("Role") => String.t()
      }

  """
  @type create_malware_protection_plan_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      account() :: %{
        "Name" => String.t(),
        "Uid" => String.t()
      }

  """
  @type account() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_logs_configuration() :: %{
        "Enable" => boolean()
      }

  """
  @type s3_logs_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_publishing_destination_response() :: %{
        "DestinationId" => String.t()
      }

  """
  @type create_publishing_destination_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_detector_response() :: %{}

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

  @typedoc """

  ## Example:

      describe_publishing_destination_request() :: %{}

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

  @typedoc """

  ## Example:

      vpc_config() :: %{
        "SecurityGroups" => list(security_group()()),
        "SubnetIds" => list(String.t()()),
        "VpcId" => String.t()
      }

  """
  @type vpc_config() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_statistics() :: %{
        "CountByCoverageStatus" => map(),
        "CountByResourceType" => map()
      }

  """
  @type coverage_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      finding() :: %{
        "AccountId" => String.t(),
        "Arn" => String.t(),
        "AssociatedAttackSequenceArn" => String.t(),
        "Confidence" => float(),
        "CreatedAt" => String.t(),
        "Description" => String.t(),
        "Id" => String.t(),
        "Partition" => String.t(),
        "Region" => String.t(),
        "Resource" => resource(),
        "SchemaVersion" => String.t(),
        "Service" => service(),
        "Severity" => float(),
        "Title" => String.t(),
        "Type" => String.t(),
        "UpdatedAt" => String.t()
      }

  """
  @type finding() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_eks_cluster_details() :: %{
        "AddonDetails" => addon_details(),
        "ClusterName" => String.t(),
        "CompatibleNodes" => float(),
        "CoveredNodes" => float(),
        "ManagementType" => list(any())
      }

  """
  @type coverage_eks_cluster_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_resource_details() :: %{
        "Ec2InstanceDetails" => coverage_ec2_instance_details(),
        "EcsClusterDetails" => coverage_ecs_cluster_details(),
        "EksClusterDetails" => coverage_eks_cluster_details(),
        "ResourceType" => list(any())
      }

  """
  @type coverage_resource_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      volume_mount() :: %{
        "MountPath" => String.t(),
        "Name" => String.t()
      }

  """
  @type volume_mount() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_malware_protection_plans_request() :: %{
        optional("NextToken") => String.t()
      }

  """
  @type list_malware_protection_plans_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      list_findings_request() :: %{
        optional("FindingCriteria") => finding_criteria(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t(),
        optional("SortCriteria") => sort_criteria()
      }

  """
  @type list_findings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_configuration() :: %{
        "AuditLogs" => kubernetes_audit_logs_configuration()
      }

  """
  @type kubernetes_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_publishing_destinations_response() :: %{
        "Destinations" => list(destination()()),
        "NextToken" => String.t()
      }

  """
  @type list_publishing_destinations_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      network_endpoint() :: %{
        "AutonomousSystem" => autonomous_system(),
        "Connection" => network_connection(),
        "Domain" => String.t(),
        "Id" => String.t(),
        "Ip" => String.t(),
        "Location" => network_geo_location(),
        "Port" => integer()
      }

  """
  @type network_endpoint() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member_additional_configuration() :: %{
        "Name" => list(any()),
        "Status" => list(any())
      }

  """
  @type member_additional_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_filter_request() :: %{}

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

  @typedoc """

  ## Example:

      get_threat_intel_set_request() :: %{}

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

  @typedoc """

  ## Example:

      trigger_details() :: %{
        "Description" => String.t(),
        "GuardDutyFindingId" => String.t()
      }

  """
  @type trigger_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_malware_protection_plan_request() :: %{
        optional("Actions") => malware_protection_plan_actions(),
        optional("ProtectedResource") => update_protected_resource(),
        optional("Role") => String.t()
      }

  """
  @type update_malware_protection_plan_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_filter_response() :: %{}

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

  @typedoc """

  ## Example:

      disassociate_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type disassociate_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      security_group() :: %{
        "GroupId" => String.t(),
        "GroupName" => String.t()
      }

  """
  @type security_group() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_coverage_response() :: %{
        "NextToken" => String.t(),
        "Resources" => list(coverage_resource()())
      }

  """
  @type list_coverage_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      condition() :: %{
        "Eq" => list(String.t()()),
        "Equals" => list(String.t()()),
        "GreaterThan" => float(),
        "GreaterThanOrEqual" => float(),
        "Gt" => integer(),
        "Gte" => integer(),
        "LessThan" => float(),
        "LessThanOrEqual" => float(),
        "Lt" => integer(),
        "Lte" => integer(),
        "Neq" => list(String.t()()),
        "NotEquals" => list(String.t()())
      }

  """
  @type condition() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_threat_intel_sets_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_threat_intel_sets_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_malware_scan_settings_response() :: %{}

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

  @typedoc """

  ## Example:

      update_organization_configuration_response() :: %{}

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

  @typedoc """

  ## Example:

      lineage_object() :: %{
        "Euid" => integer(),
        "ExecutablePath" => String.t(),
        "Name" => String.t(),
        "NamespacePid" => integer(),
        "ParentUuid" => String.t(),
        "Pid" => integer(),
        "StartTime" => non_neg_integer(),
        "UserId" => integer(),
        "Uuid" => String.t()
      }

  """
  @type lineage_object() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ec2_instance() :: %{
        "AvailabilityZone" => String.t(),
        "Ec2NetworkInterfaceUids" => list(String.t()()),
        "IamInstanceProfile" => iam_instance_profile(),
        "ImageDescription" => String.t(),
        "InstanceState" => String.t(),
        "InstanceType" => String.t(),
        "OutpostArn" => String.t(),
        "Platform" => String.t(),
        "ProductCodes" => list(product_code()())
      }

  """
  @type ec2_instance() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      detection() :: %{
        "Anomaly" => anomaly(),
        "Sequence" => sequence()
      }

  """
  @type detection() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_findings_feedback_response() :: %{}

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

  @typedoc """

  ## Example:

      session() :: %{
        "CreatedTime" => non_neg_integer(),
        "Issuer" => String.t(),
        "MfaStatus" => list(any()),
        "Uid" => String.t()
      }

  """
  @type session() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ebs_volumes_result() :: %{
        "Reason" => String.t(),
        "Status" => list(any())
      }

  """
  @type ebs_volumes_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      product_code() :: %{
        "Code" => String.t(),
        "ProductType" => String.t()
      }

  """
  @type product_code() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_scan_details() :: %{
        "Threats" => list(threat()())
      }

  """
  @type malware_scan_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      accept_invitation_response() :: %{}

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

  @typedoc """

  ## Example:

      resource_statistics() :: %{
        "AccountId" => String.t(),
        "LastGeneratedAt" => non_neg_integer(),
        "ResourceId" => String.t(),
        "ResourceType" => String.t(),
        "TotalFindings" => integer()
      }

  """
  @type resource_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_sample_findings_request() :: %{
        optional("FindingTypes") => list(String.t()())
      }

  """
  @type create_sample_findings_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      decline_invitations_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type decline_invitations_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_s3_logs_configuration_result() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_s3_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      account_free_trial_info() :: %{
        "AccountId" => String.t(),
        "DataSources" => data_sources_free_trial(),
        "Features" => list(free_trial_feature_configuration_result()())
      }

  """
  @type account_free_trial_info() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_master_account_response() :: %{
        "Master" => master()
      }

  """
  @type get_master_account_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      unprocessed_data_sources_result() :: %{
        "MalwareProtection" => malware_protection_configuration_result()
      }

  """
  @type unprocessed_data_sources_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_member_detectors_response() :: %{
        "MemberDataSourceConfigurations" => list(member_data_source_configuration()()),
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type get_member_detectors_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      finding_type_statistics() :: %{
        "FindingType" => String.t(),
        "LastGeneratedAt" => non_neg_integer(),
        "TotalFindings" => integer()
      }

  """
  @type finding_type_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      aws_api_call_action() :: %{
        "AffectedResources" => map(),
        "Api" => String.t(),
        "CallerType" => String.t(),
        "DomainDetails" => domain_details(),
        "ErrorCode" => String.t(),
        "RemoteAccountDetails" => remote_account_details(),
        "RemoteIpDetails" => remote_ip_details(),
        "ServiceName" => String.t(),
        "UserAgent" => String.t()
      }

  """
  @type aws_api_call_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_role_details() :: %{
        "Kind" => String.t(),
        "Name" => String.t(),
        "Uid" => String.t()
      }

  """
  @type kubernetes_role_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      eks_cluster_details() :: %{
        "Arn" => String.t(),
        "CreatedAt" => non_neg_integer(),
        "Name" => String.t(),
        "Status" => String.t(),
        "Tags" => list(tag()()),
        "VpcId" => String.t()
      }

  """
  @type eks_cluster_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_malware_protection_configuration_result() :: %{
        "ScanEc2InstanceWithFindings" => organization_scan_ec2_instance_with_findings_result()
      }

  """
  @type organization_malware_protection_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_invitations_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type delete_invitations_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_ebs_volumes() :: %{
        "AutoEnable" => boolean()
      }

  """
  @type organization_ebs_volumes() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_detector_response() :: %{
        "CreatedAt" => String.t(),
        "DataSources" => data_source_configurations_result(),
        "Features" => list(detector_feature_configuration_result()()),
        "FindingPublishingFrequency" => list(any()),
        "ServiceRole" => String.t(),
        "Status" => list(any()),
        "Tags" => map(),
        "UpdatedAt" => String.t()
      }

  """
  @type get_detector_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_filter_request() :: %{
        optional("Action") => list(any()),
        optional("Description") => String.t(),
        optional("FindingCriteria") => finding_criteria(),
        optional("Rank") => integer()
      }

  """
  @type update_filter_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_details() :: %{
        "KubernetesUserDetails" => kubernetes_user_details(),
        "KubernetesWorkloadDetails" => kubernetes_workload_details()
      }

  """
  @type kubernetes_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      anomaly_object() :: %{
        "Observations" => observations(),
        "ProfileSubtype" => list(any()),
        "ProfileType" => list(any())
      }

  """
  @type anomaly_object() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_file_path() :: %{
        "FileName" => String.t(),
        "FilePath" => String.t(),
        "Hash" => String.t(),
        "VolumeArn" => String.t()
      }

  """
  @type scan_file_path() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_kubernetes_configuration_result() :: %{
        "AuditLogs" => organization_kubernetes_audit_logs_configuration_result()
      }

  """
  @type organization_kubernetes_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_detector_request() :: %{}

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

  @typedoc """

  ## Example:

      malware_protection_plan_actions() :: %{
        "Tagging" => malware_protection_plan_tagging_action()
      }

  """
  @type malware_protection_plan_actions() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      anomaly() :: %{
        "Profiles" => map(),
        "Unusual" => anomaly_unusual()
      }

  """
  @type anomaly() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_additional_configuration_result() :: %{
        "AutoEnable" => list(any()),
        "Name" => list(any())
      }

  """
  @type organization_additional_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_organization_configuration_request() :: %{
        optional("AutoEnable") => boolean(),
        optional("AutoEnableOrganizationMembers") => list(any()),
        optional("DataSources") => organization_data_source_configurations(),
        optional("Features") => list(organization_feature_configuration()())
      }

  """
  @type update_organization_configuration_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      enable_organization_admin_account_request() :: %{
        required("AdminAccountId") => String.t()
      }

  """
  @type enable_organization_admin_account_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      addon_details() :: %{
        "AddonStatus" => String.t(),
        "AddonVersion" => String.t()
      }

  """
  @type addon_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_configuration_result() :: %{
        "AuditLogs" => kubernetes_audit_logs_configuration_result()
      }

  """
  @type kubernetes_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      geo_location() :: %{
        "Lat" => float(),
        "Lon" => float()
      }

  """
  @type geo_location() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      action() :: %{
        "ActionType" => String.t(),
        "AwsApiCallAction" => aws_api_call_action(),
        "DnsRequestAction" => dns_request_action(),
        "KubernetesApiCallAction" => kubernetes_api_call_action(),
        "KubernetesPermissionCheckedDetails" => kubernetes_permission_checked_details(),
        "KubernetesRoleBindingDetails" => kubernetes_role_binding_details(),
        "KubernetesRoleDetails" => kubernetes_role_details(),
        "NetworkConnectionAction" => network_connection_action(),
        "PortProbeAction" => port_probe_action(),
        "RdsLoginAttemptAction" => rds_login_attempt_action()
      }

  """
  @type action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      threat_intelligence_detail() :: %{
        "ThreatFileSha256" => String.t(),
        "ThreatListName" => String.t(),
        "ThreatNames" => list(String.t()())
      }

  """
  @type threat_intelligence_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_threat_intel_set_request() :: %{
        optional("ClientToken") => String.t(),
        optional("Tags") => map(),
        required("Activate") => boolean(),
        required("Format") => list(any()),
        required("Location") => String.t(),
        required("Name") => String.t()
      }

  """
  @type create_threat_intel_set_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      login_attribute() :: %{
        "Application" => String.t(),
        "FailedLoginAttempts" => integer(),
        "SuccessfulLoginAttempts" => integer(),
        "User" => String.t()
      }

  """
  @type login_attribute() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_plan_summary() :: %{
        "MalwareProtectionPlanId" => String.t()
      }

  """
  @type malware_protection_plan_summary() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_member_detectors_request() :: %{
        optional("DataSources") => data_source_configurations(),
        optional("Features") => list(member_features_configuration()()),
        required("AccountIds") => list(String.t()())
      }

  """
  @type update_member_detectors_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member_additional_configuration_result() :: %{
        "Name" => list(any()),
        "Status" => list(any()),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type member_additional_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_invitations_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type delete_invitations_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      port_probe_action() :: %{
        "Blocked" => boolean(),
        "PortProbeDetails" => list(port_probe_detail()())
      }

  """
  @type port_probe_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_organization_admin_accounts_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_organization_admin_accounts_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      sort_criteria() :: %{
        "AttributeName" => String.t(),
        "OrderBy" => list(any())
      }

  """
  @type sort_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      threat() :: %{
        "ItemPaths" => list(item_path()()),
        "Name" => String.t(),
        "Source" => String.t()
      }

  """
  @type threat() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_ip_set_request() :: %{
        optional("ClientToken") => String.t(),
        optional("Tags") => map(),
        required("Activate") => boolean(),
        required("Format") => list(any()),
        required("Location") => String.t(),
        required("Name") => String.t()
      }

  """
  @type create_ip_set_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      volume() :: %{
        "HostPath" => host_path(),
        "Name" => String.t()
      }

  """
  @type volume() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_protected_resource() :: %{
        "S3Bucket" => create_s3_bucket_resource()
      }

  """
  @type create_protected_resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      access_denied_exception() :: %{
        "Message" => String.t(),
        "Type" => String.t()
      }

  """
  @type access_denied_exception() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_top_account_result() :: %{
        "AccountId" => String.t(),
        "Total" => total()
      }

  """
  @type usage_top_account_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_invitations_count_request() :: %{}

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

  @typedoc """

  ## Example:

      list_malware_protection_plans_response() :: %{
        "MalwareProtectionPlans" => list(malware_protection_plan_summary()()),
        "NextToken" => String.t()
      }

  """
  @type list_malware_protection_plans_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_ip_set_response() :: %{
        "Format" => list(any()),
        "Location" => String.t(),
        "Name" => String.t(),
        "Status" => list(any()),
        "Tags" => map()
      }

  """
  @type get_ip_set_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      city() :: %{
        "CityName" => String.t()
      }

  """
  @type city() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      item_path() :: %{
        "Hash" => String.t(),
        "NestedItemPath" => String.t()
      }

  """
  @type item_path() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      accept_invitation_request() :: %{
        required("InvitationId") => String.t(),
        required("MasterId") => String.t()
      }

  """
  @type accept_invitation_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      tag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      severity_statistics() :: %{
        "LastGeneratedAt" => non_neg_integer(),
        "Severity" => float(),
        "TotalFindings" => integer()
      }

  """
  @type severity_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      anomaly_unusual() :: %{
        "Behavior" => map()
      }

  """
  @type anomaly_unusual() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_members_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t(),
        optional("OnlyAssociated") => String.t()
      }

  """
  @type list_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      fargate_details() :: %{
        "Issues" => list(String.t()()),
        "ManagementType" => list(any())
      }

  """
  @type fargate_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_plan_status_reason() :: %{
        "Code" => String.t(),
        "Message" => String.t()
      }

  """
  @type malware_protection_plan_status_reason() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_members_response() :: %{
        "Members" => list(member()()),
        "NextToken" => String.t()
      }

  """
  @type list_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      block_public_access() :: %{
        "BlockPublicAcls" => boolean(),
        "BlockPublicPolicy" => boolean(),
        "IgnorePublicAcls" => boolean(),
        "RestrictPublicBuckets" => boolean()
      }

  """
  @type block_public_access() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_detectors_response() :: %{
        "DetectorIds" => list(String.t()()),
        "NextToken" => String.t()
      }

  """
  @type list_detectors_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      free_trial_feature_configuration_result() :: %{
        "FreeTrialDaysRemaining" => integer(),
        "Name" => list(any())
      }

  """
  @type free_trial_feature_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_feature_statistics() :: %{
        "AdditionalConfiguration" => list(organization_feature_statistics_additional_configuration()()),
        "EnabledAccountsCount" => integer(),
        "Name" => list(any())
      }

  """
  @type organization_feature_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      local_ip_details() :: %{
        "IpAddressV4" => String.t(),
        "IpAddressV6" => String.t()
      }

  """
  @type local_ip_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_remaining_free_trial_days_request() :: %{
        optional("AccountIds") => list(String.t()())
      }

  """
  @type get_remaining_free_trial_days_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scanned_item_count() :: %{
        "Files" => integer(),
        "TotalGb" => integer(),
        "Volumes" => integer()
      }

  """
  @type scanned_item_count() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_request() :: %{}

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

  @typedoc """

  ## Example:

      get_master_account_request() :: %{}

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

  @typedoc """

  ## Example:

      organization_feature_configuration_result() :: %{
        "AdditionalConfiguration" => list(organization_additional_configuration_result()()),
        "AutoEnable" => list(any()),
        "Name" => list(any())
      }

  """
  @type organization_feature_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_coverage_request() :: %{
        optional("FilterCriteria") => coverage_filter_criteria(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t(),
        optional("SortCriteria") => coverage_sort_criteria()
      }

  """
  @type list_coverage_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_remaining_free_trial_days_response() :: %{
        "Accounts" => list(account_free_trial_info()()),
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type get_remaining_free_trial_days_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      destination() :: %{
        "DestinationId" => String.t(),
        "DestinationType" => list(any()),
        "Status" => list(any())
      }

  """
  @type destination() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      internal_server_error_exception() :: %{
        "Message" => String.t(),
        "Type" => String.t()
      }

  """
  @type internal_server_error_exception() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      private_ip_address_details() :: %{
        "PrivateDnsName" => String.t(),
        "PrivateIpAddress" => String.t()
      }

  """
  @type private_ip_address_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_invitations_count_response() :: %{
        "InvitationsCount" => integer()
      }

  """
  @type get_invitations_count_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      runtime_context() :: %{
        "AddressFamily" => String.t(),
        "CommandLineExample" => String.t(),
        "FileSystemType" => String.t(),
        "Flags" => list(String.t()()),
        "IanaProtocolNumber" => integer(),
        "LdPreloadValue" => String.t(),
        "LibraryPath" => String.t(),
        "MemoryRegions" => list(String.t()()),
        "ModifiedAt" => non_neg_integer(),
        "ModifyingProcess" => process_details(),
        "ModuleFilePath" => String.t(),
        "ModuleName" => String.t(),
        "ModuleSha256" => String.t(),
        "MountSource" => String.t(),
        "MountTarget" => String.t(),
        "ReleaseAgentPath" => String.t(),
        "RuncBinaryPath" => String.t(),
        "ScriptPath" => String.t(),
        "ServiceName" => String.t(),
        "ShellHistoryFilePath" => String.t(),
        "SocketPath" => String.t(),
        "TargetProcess" => process_details(),
        "ThreatFilePath" => String.t(),
        "ToolCategory" => String.t(),
        "ToolName" => String.t()
      }

  """
  @type runtime_context() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      evidence() :: %{
        "ThreatIntelligenceDetails" => list(threat_intelligence_detail()())
      }

  """
  @type evidence() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_threat_name() :: %{
        "FilePaths" => list(scan_file_path()()),
        "ItemCount" => integer(),
        "Name" => String.t(),
        "Severity" => String.t()
      }

  """
  @type scan_threat_name() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_resource_result() :: %{
        "Resource" => String.t(),
        "Total" => total()
      }

  """
  @type usage_resource_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_filter_criteria() :: %{
        "FilterCriterion" => list(coverage_filter_criterion()())
      }

  """
  @type coverage_filter_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_threat_intel_set_response() :: %{
        "ThreatIntelSetId" => String.t()
      }

  """
  @type create_threat_intel_set_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      user() :: %{
        "Account" => account(),
        "CredentialUid" => String.t(),
        "Name" => String.t(),
        "Type" => String.t(),
        "Uid" => String.t()
      }

  """
  @type user() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      coverage_ecs_cluster_details() :: %{
        "ClusterName" => String.t(),
        "ContainerInstanceDetails" => container_instance_details(),
        "FargateDetails" => fargate_details()
      }

  """
  @type coverage_ecs_cluster_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_invitations_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_invitations_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      finding_criteria() :: %{
        "Criterion" => map()
      }

  """
  @type finding_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_detections() :: %{
        "HighestSeverityThreatDetails" => highest_severity_threat_details(),
        "ScannedItemCount" => scanned_item_count(),
        "ThreatDetectedByName" => threat_detected_by_name(),
        "ThreatsDetectedItemCount" => threats_detected_item_count()
      }

  """
  @type scan_detections() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_permission_checked_details() :: %{
        "Allowed" => boolean(),
        "Namespace" => String.t(),
        "Resource" => String.t(),
        "Verb" => String.t()
      }

  """
  @type kubernetes_permission_checked_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      start_monitoring_members_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type start_monitoring_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_sample_findings_response() :: %{}

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

  @typedoc """

  ## Example:

      update_findings_feedback_request() :: %{
        optional("Comments") => String.t(),
        required("Feedback") => list(any()),
        required("FindingIds") => list(String.t()())
      }

  """
  @type update_findings_feedback_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      create_s3_bucket_resource() :: %{
        "BucketName" => String.t(),
        "ObjectPrefixes" => list(String.t()())
      }

  """
  @type create_s3_bucket_resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      rds_login_attempt_action() :: %{
        "LoginAttributes" => list(login_attribute()()),
        "RemoteIpDetails" => remote_ip_details()
      }

  """
  @type rds_login_attempt_action() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      actor() :: %{
        "Id" => String.t(),
        "Session" => session(),
        "User" => user()
      }

  """
  @type actor() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      member() :: %{
        "AccountId" => String.t(),
        "AdministratorId" => String.t(),
        "DetectorId" => String.t(),
        "Email" => String.t(),
        "InvitedAt" => String.t(),
        "MasterId" => String.t(),
        "RelationshipStatus" => String.t(),
        "UpdatedAt" => String.t()
      }

  """
  @type member() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_ip_set_request() :: %{}

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

  @typedoc """

  ## Example:

      usage_feature_result() :: %{
        "Feature" => list(any()),
        "Total" => total()
      }

  """
  @type usage_feature_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      enable_organization_admin_account_response() :: %{}

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

  @typedoc """

  ## Example:

      finding_statistics() :: %{
        "CountBySeverity" => map(),
        "GroupedByAccount" => list(account_statistics()()),
        "GroupedByDate" => list(date_statistics()()),
        "GroupedByFindingType" => list(finding_type_statistics()()),
        "GroupedByResource" => list(resource_statistics()()),
        "GroupedBySeverity" => list(severity_statistics()())
      }

  """
  @type finding_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_scan_ec2_instance_with_findings_result() :: %{
        "EbsVolumes" => organization_ebs_volumes_result()
      }

  """
  @type organization_scan_ec2_instance_with_findings_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ecs_cluster_details() :: %{
        "ActiveServicesCount" => integer(),
        "Arn" => String.t(),
        "Name" => String.t(),
        "RegisteredContainerInstancesCount" => integer(),
        "RunningTasksCount" => integer(),
        "Status" => String.t(),
        "Tags" => list(tag()()),
        "TaskDetails" => ecs_task_details()
      }

  """
  @type ecs_cluster_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan() :: %{
        "AccountId" => String.t(),
        "AdminDetectorId" => String.t(),
        "AttachedVolumes" => list(volume_detail()()),
        "DetectorId" => String.t(),
        "FailureReason" => String.t(),
        "FileCount" => float(),
        "ResourceDetails" => resource_details(),
        "ScanEndTime" => non_neg_integer(),
        "ScanId" => String.t(),
        "ScanResultDetails" => scan_result_details(),
        "ScanStartTime" => non_neg_integer(),
        "ScanStatus" => list(any()),
        "ScanType" => list(any()),
        "TotalBytes" => float(),
        "TriggerDetails" => trigger_details()
      }

  """
  @type scan() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      bad_request_exception() :: %{
        "Message" => String.t(),
        "Type" => String.t()
      }

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

  @typedoc """

  ## Example:

      get_malware_scan_settings_request() :: %{}

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

  @typedoc """

  ## Example:

      organization_statistics() :: %{
        "ActiveAccountsCount" => integer(),
        "CountByFeature" => list(organization_feature_statistics()()),
        "EnabledAccountsCount" => integer(),
        "MemberAccountsCount" => integer(),
        "TotalAccountsCount" => integer()
      }

  """
  @type organization_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      domain_details() :: %{
        "Domain" => String.t()
      }

  """
  @type domain_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      kubernetes_role_binding_details() :: %{
        "Kind" => String.t(),
        "Name" => String.t(),
        "RoleRefKind" => String.t(),
        "RoleRefName" => String.t(),
        "Uid" => String.t()
      }

  """
  @type kubernetes_role_binding_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      malware_protection_data_source_free_trial() :: %{
        "ScanEc2InstanceWithFindings" => data_source_free_trial()
      }

  """
  @type malware_protection_data_source_free_trial() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      ebs_volume_scan_details() :: %{
        "ScanCompletedAt" => non_neg_integer(),
        "ScanDetections" => scan_detections(),
        "ScanId" => String.t(),
        "ScanStartedAt" => non_neg_integer(),
        "ScanType" => list(any()),
        "Sources" => list(String.t()()),
        "TriggerFindingId" => String.t()
      }

  """
  @type ebs_volume_scan_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_data_source_configurations() :: %{
        "Kubernetes" => organization_kubernetes_configuration(),
        "MalwareProtection" => organization_malware_protection_configuration(),
        "S3Logs" => organization_s3_logs_configuration()
      }

  """
  @type organization_data_source_configurations() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      unprocessed_account() :: %{
        "AccountId" => String.t(),
        "Result" => String.t()
      }

  """
  @type unprocessed_account() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_member_detectors_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type update_member_detectors_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      resource_details() :: %{
        "InstanceArn" => String.t()
      }

  """
  @type resource_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      dns_logs_configuration_result() :: %{
        "Status" => list(any())
      }

  """
  @type dns_logs_configuration_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_publishing_destination_request() :: %{
        optional("DestinationProperties") => destination_properties()
      }

  """
  @type update_publishing_destination_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      accept_administrator_invitation_response() :: %{}

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

  @typedoc """

  ## Example:

      create_ip_set_response() :: %{
        "IpSetId" => String.t()
      }

  """
  @type create_ip_set_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      stop_monitoring_members_request() :: %{
        required("AccountIds") => list(String.t()())
      }

  """
  @type stop_monitoring_members_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_feature_statistics_additional_configuration() :: %{
        "EnabledAccountsCount" => integer(),
        "Name" => list(any())
      }

  """
  @type organization_feature_statistics_additional_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      rds_db_instance_details() :: %{
        "DbClusterIdentifier" => String.t(),
        "DbInstanceArn" => String.t(),
        "DbInstanceIdentifier" => String.t(),
        "Engine" => String.t(),
        "EngineVersion" => String.t(),
        "Tags" => list(tag()())
      }

  """
  @type rds_db_instance_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      scan_condition() :: %{
        "MapEquals" => list(scan_condition_pair()())
      }

  """
  @type scan_condition() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      threat_detected_by_name() :: %{
        "ItemCount" => integer(),
        "Shortened" => boolean(),
        "ThreatNames" => list(scan_threat_name()()),
        "UniqueThreatNameCount" => integer()
      }

  """
  @type threat_detected_by_name() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      bucket_level_permissions() :: %{
        "AccessControlList" => access_control_list(),
        "BlockPublicAccess" => block_public_access(),
        "BucketPolicy" => bucket_policy()
      }

  """
  @type bucket_level_permissions() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_organization_admin_accounts_response() :: %{
        "AdminAccounts" => list(admin_account()()),
        "NextToken" => String.t()
      }

  """
  @type list_organization_admin_accounts_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_top_accounts_result() :: %{
        "Accounts" => list(usage_top_account_result()()),
        "Feature" => list(any())
      }

  """
  @type usage_top_accounts_result() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      port_probe_detail() :: %{
        "LocalIpDetails" => local_ip_details(),
        "LocalPortDetails" => local_port_details(),
        "RemoteIpDetails" => remote_ip_details()
      }

  """
  @type port_probe_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      iam_instance_profile() :: %{
        "Arn" => String.t(),
        "Id" => String.t()
      }

  """
  @type iam_instance_profile() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      stop_monitoring_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type stop_monitoring_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      disassociate_from_administrator_account_request() :: %{}

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

  @typedoc """

  ## Example:

      update_detector_request() :: %{
        optional("DataSources") => data_source_configurations(),
        optional("Enable") => boolean(),
        optional("Features") => list(detector_feature_configuration()()),
        optional("FindingPublishingFrequency") => list(any())
      }

  """
  @type update_detector_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      security_context() :: %{
        "AllowPrivilegeEscalation" => boolean(),
        "Privileged" => boolean()
      }

  """
  @type security_context() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      default_server_side_encryption() :: %{
        "EncryptionType" => String.t(),
        "KmsMasterKeyArn" => String.t()
      }

  """
  @type default_server_side_encryption() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      date_statistics() :: %{
        "Date" => non_neg_integer(),
        "LastGeneratedAt" => non_neg_integer(),
        "Severity" => float(),
        "TotalFindings" => integer()
      }

  """
  @type date_statistics() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      access_control_list() :: %{
        "AllowsPublicReadAccess" => boolean(),
        "AllowsPublicWriteAccess" => boolean()
      }

  """
  @type access_control_list() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      data_source_configurations() :: %{
        "Kubernetes" => kubernetes_configuration(),
        "MalwareProtection" => malware_protection_configuration(),
        "S3Logs" => s3_logs_configuration()
      }

  """
  @type data_source_configurations() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_administrator_account_response() :: %{
        "Administrator" => administrator()
      }

  """
  @type get_administrator_account_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      data_source_free_trial() :: %{
        "FreeTrialDaysRemaining" => integer()
      }

  """
  @type data_source_free_trial() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      detector_additional_configuration() :: %{
        "Name" => list(any()),
        "Status" => list(any())
      }

  """
  @type detector_additional_configuration() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_filters_response() :: %{
        "FilterNames" => list(String.t()()),
        "NextToken" => String.t()
      }

  """
  @type list_filters_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      start_malware_scan_response() :: %{
        "ScanId" => String.t()
      }

  """
  @type start_malware_scan_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      unarchive_findings_response() :: %{}

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

  @typedoc """

  ## Example:

      create_members_response() :: %{
        "UnprocessedAccounts" => list(unprocessed_account()())
      }

  """
  @type create_members_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      s3_object_detail() :: %{
        "ETag" => String.t(),
        "Hash" => String.t(),
        "Key" => String.t(),
        "ObjectArn" => String.t(),
        "VersionId" => String.t()
      }

  """
  @type s3_object_detail() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      access_key_details() :: %{
        "AccessKeyId" => String.t(),
        "PrincipalId" => String.t(),
        "UserName" => String.t(),
        "UserType" => String.t()
      }

  """
  @type access_key_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_filter_request() :: %{}

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

  @typedoc """

  ## Example:

      owner() :: %{
        "Id" => String.t()
      }

  """
  @type owner() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_coverage_statistics_request() :: %{
        optional("FilterCriteria") => coverage_filter_criteria(),
        required("StatisticsType") => list(list(any())())
      }

  """
  @type get_coverage_statistics_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_ip_set_response() :: %{}

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

  @typedoc """

  ## Example:

      runtime_details() :: %{
        "Context" => runtime_context(),
        "Process" => process_details()
      }

  """
  @type runtime_details() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      usage_criteria() :: %{
        "AccountIds" => list(String.t()()),
        "DataSources" => list(list(any())()),
        "Features" => list(list(any())()),
        "Resources" => list(String.t()())
      }

  """
  @type usage_criteria() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      get_usage_statistics_response() :: %{
        "NextToken" => String.t(),
        "UsageStatistics" => usage_statistics()
      }

  """
  @type get_usage_statistics_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      list_filters_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t()
      }

  """
  @type list_filters_request() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      update_s3_bucket_resource() :: %{
        "ObjectPrefixes" => list(String.t()())
      }

  """
  @type update_s3_bucket_resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      delete_detector_request() :: %{}

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

  @typedoc """

  ## Example:

      list_invitations_response() :: %{
        "Invitations" => list(invitation()()),
        "NextToken" => String.t()
      }

  """
  @type list_invitations_response() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      resource() :: %{
        "AccessKeyDetails" => access_key_details(),
        "ContainerDetails" => container(),
        "EbsVolumeDetails" => ebs_volume_details(),
        "EcsClusterDetails" => ecs_cluster_details(),
        "EksClusterDetails" => eks_cluster_details(),
        "InstanceDetails" => instance_details(),
        "KubernetesDetails" => kubernetes_details(),
        "LambdaDetails" => lambda_details(),
        "RdsDbInstanceDetails" => rds_db_instance_details(),
        "RdsDbUserDetails" => rds_db_user_details(),
        "RdsLimitlessDbDetails" => rds_limitless_db_details(),
        "ResourceType" => String.t(),
        "S3BucketDetails" => list(s3_bucket_detail()())
      }

  """
  @type resource() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      indicator() :: %{
        "Key" => list(any()),
        "Title" => String.t(),
        "Values" => list(String.t()())
      }

  """
  @type indicator() :: %{String.t() => any()}

  @typedoc """

  ## Example:

      organization_details() :: %{
        "OrganizationStatistics" => organization_statistics(),
        "UpdatedAt" => non_neg_integer()
      }

  """
  @type organization_details() :: %{String.t() => any()}

  @type accept_administrator_invitation_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type accept_invitation_errors() :: bad_request_exception() | internal_server_error_exception()

  @type archive_findings_errors() :: bad_request_exception() | internal_server_error_exception()

  @type create_detector_errors() :: bad_request_exception() | internal_server_error_exception()

  @type create_filter_errors() :: bad_request_exception() | internal_server_error_exception()

  @type create_ip_set_errors() :: bad_request_exception() | internal_server_error_exception()

  @type create_malware_protection_plan_errors() ::
          bad_request_exception()
          | internal_server_error_exception()
          | access_denied_exception()
          | conflict_exception()

  @type create_members_errors() :: bad_request_exception() | internal_server_error_exception()

  @type create_publishing_destination_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type create_sample_findings_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type create_threat_intel_set_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type decline_invitations_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type delete_detector_errors() :: bad_request_exception() | internal_server_error_exception()

  @type delete_filter_errors() :: bad_request_exception() | internal_server_error_exception()

  @type delete_invitations_errors() :: bad_request_exception() | internal_server_error_exception()

  @type delete_ip_set_errors() :: bad_request_exception() | internal_server_error_exception()

  @type delete_malware_protection_plan_errors() ::
          bad_request_exception()
          | internal_server_error_exception()
          | access_denied_exception()
          | resource_not_found_exception()

  @type delete_members_errors() :: bad_request_exception() | internal_server_error_exception()

  @type delete_publishing_destination_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type delete_threat_intel_set_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type describe_malware_scans_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type describe_organization_configuration_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type describe_publishing_destination_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type disable_organization_admin_account_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type disassociate_from_administrator_account_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type disassociate_from_master_account_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type disassociate_members_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type enable_organization_admin_account_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_administrator_account_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_coverage_statistics_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_detector_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_filter_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_findings_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_findings_statistics_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_invitations_count_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_ip_set_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_malware_protection_plan_errors() ::
          bad_request_exception()
          | internal_server_error_exception()
          | access_denied_exception()
          | resource_not_found_exception()

  @type get_malware_scan_settings_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_master_account_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_member_detectors_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_members_errors() :: bad_request_exception() | internal_server_error_exception()

  @type get_organization_statistics_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_remaining_free_trial_days_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_threat_intel_set_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type get_usage_statistics_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type invite_members_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_coverage_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_detectors_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_filters_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_findings_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_invitations_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_ip_sets_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_malware_protection_plans_errors() ::
          bad_request_exception() | internal_server_error_exception() | access_denied_exception()

  @type list_members_errors() :: bad_request_exception() | internal_server_error_exception()

  @type list_organization_admin_accounts_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type list_publishing_destinations_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type list_tags_for_resource_errors() ::
          bad_request_exception() | internal_server_error_exception() | access_denied_exception()

  @type list_threat_intel_sets_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type start_malware_scan_errors() ::
          bad_request_exception() | internal_server_error_exception() | conflict_exception()

  @type start_monitoring_members_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type stop_monitoring_members_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type tag_resource_errors() ::
          bad_request_exception() | internal_server_error_exception() | access_denied_exception()

  @type unarchive_findings_errors() :: bad_request_exception() | internal_server_error_exception()

  @type untag_resource_errors() ::
          bad_request_exception() | internal_server_error_exception() | access_denied_exception()

  @type update_detector_errors() :: bad_request_exception() | internal_server_error_exception()

  @type update_filter_errors() :: bad_request_exception() | internal_server_error_exception()

  @type update_findings_feedback_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type update_ip_set_errors() :: bad_request_exception() | internal_server_error_exception()

  @type update_malware_protection_plan_errors() ::
          bad_request_exception()
          | internal_server_error_exception()
          | access_denied_exception()
          | resource_not_found_exception()

  @type update_malware_scan_settings_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type update_member_detectors_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type update_organization_configuration_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type update_publishing_destination_errors() ::
          bad_request_exception() | internal_server_error_exception()

  @type update_threat_intel_set_errors() ::
          bad_request_exception() | internal_server_error_exception()

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

  @doc """
  Accepts the invitation to be a member account and get monitored by a GuardDuty
  administrator account that sent the invitation.
  """
  @spec accept_administrator_invitation(
          map(),
          String.t(),
          accept_administrator_invitation_request(),
          list()
        ) ::
          {:ok, accept_administrator_invitation_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, accept_administrator_invitation_errors()}
  def accept_administrator_invitation(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/administrator"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Accepts the invitation to be monitored by a GuardDuty administrator account.
  """
  @spec accept_invitation(map(), String.t(), accept_invitation_request(), list()) ::
          {:ok, accept_invitation_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, accept_invitation_errors()}
  def accept_invitation(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/master"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Archives GuardDuty findings that are specified by the list of finding IDs.

  Only the administrator account can archive findings. Member accounts don't have
  permission to archive findings from their accounts.
  """
  @spec archive_findings(map(), String.t(), archive_findings_request(), list()) ::
          {:ok, archive_findings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, archive_findings_errors()}
  def archive_findings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/archive"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a single GuardDuty detector.

  A detector is a resource that represents the
  GuardDuty service. To start using GuardDuty, you must create a detector in each
  Region where
  you enable the service. You can have only one detector per account per Region.
  All data
  sources are enabled in a new detector by default.

    *
  When you don't specify any `features`, with an
  exception to `RUNTIME_MONITORING`, all the optional features are
  enabled by default.

    *
  When you specify some of the `features`, any feature that is not specified in
  the
  API call gets enabled by default, with an exception to `RUNTIME_MONITORING`.

  Specifying both EKS Runtime Monitoring (`EKS_RUNTIME_MONITORING`)
  and Runtime Monitoring (`RUNTIME_MONITORING`) will cause an error.
  You can add only one of these two features because Runtime Monitoring already
  includes the
  threat detection for Amazon EKS resources. For more information, see
  [Runtime Monitoring](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html).

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec create_detector(map(), create_detector_request(), list()) ::
          {:ok, create_detector_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_detector_errors()}
  def create_detector(%Client{} = client, input, options \\ []) do
    url_path = "/detector"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a filter using the specified finding criteria.

  The maximum number of saved filters
  per Amazon Web Services account per Region is 100. For more information, see
  [Quotas for GuardDuty](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_limits.html).
  """
  @spec create_filter(map(), String.t(), create_filter_request(), list()) ::
          {:ok, create_filter_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_filter_errors()}
  def create_filter(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/filter"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a new IPSet, which is called a trusted IP list in the console user
  interface.

  An
  IPSet is a list of IP addresses that are trusted for secure communication with
  Amazon Web Services
  infrastructure and applications. GuardDuty doesn't generate findings for IP
  addresses that are
  included in IPSets. Only users from the administrator account can use this
  operation.
  """
  @spec create_ip_set(map(), String.t(), create_ip_set_request(), list()) ::
          {:ok, create_ip_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_ip_set_errors()}
  def create_ip_set(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/ipset"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a new Malware Protection plan for the protected resource.

  When you create a Malware Protection plan, the Amazon Web Services service terms
  for GuardDuty Malware
  Protection apply. For more information, see [Amazon Web Services service terms for GuardDuty Malware
  Protection](http://aws.amazon.com/service-terms/#87._Amazon_GuardDuty).
  """
  @spec create_malware_protection_plan(map(), create_malware_protection_plan_request(), list()) ::
          {:ok, create_malware_protection_plan_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_malware_protection_plan_errors()}
  def create_malware_protection_plan(%Client{} = client, input, options \\ []) do
    url_path = "/malware-protection-plan"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates member accounts of the current Amazon Web Services account by specifying
  a list of Amazon Web Services account
  IDs.

  This step is a prerequisite for managing the associated member accounts either
  by
  invitation or through an organization.

  As a delegated administrator, using `CreateMembers` will enable GuardDuty in
  the added member accounts, with the exception of the
  organization delegated administrator account. A delegated administrator must
  enable GuardDuty
  prior to being added as a member.

  When you use CreateMembers as an Organizations delegated
  administrator, GuardDuty applies your organization's auto-enable settings to the
  member
  accounts in this request, irrespective of the accounts being new or existing
  members. For
  more information about the existing auto-enable settings for your organization,
  see
  [DescribeOrganizationConfiguration](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DescribeOrganizationConfiguration.html). 
  If you disassociate a member account that was added by invitation, the member
  account details
  obtained from this API, including the associated email addresses, will be
  retained.
  This is done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html)
  API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html)
  API.

  When the member accounts added through Organizations are later disassociated,
  you (administrator)
  can't invite them by calling the InviteMembers API. You can create an
  association with these
  member accounts again only by calling the CreateMembers API.
  """
  @spec create_members(map(), String.t(), create_members_request(), list()) ::
          {:ok, create_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_members_errors()}
  def create_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a publishing destination where you can export your GuardDuty findings.

  Before you start exporting the
  findings, the destination resource must exist.
  """
  @spec create_publishing_destination(
          map(),
          String.t(),
          create_publishing_destination_request(),
          list()
        ) ::
          {:ok, create_publishing_destination_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_publishing_destination_errors()}
  def create_publishing_destination(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/publishingDestination"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Generates sample findings of types specified by the list of finding types.

  If 'NULL' is
  specified for `findingTypes`, the API generates sample findings of all supported
  finding types.
  """
  @spec create_sample_findings(map(), String.t(), create_sample_findings_request(), list()) ::
          {:ok, create_sample_findings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_sample_findings_errors()}
  def create_sample_findings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/create"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Creates a new ThreatIntelSet.

  ThreatIntelSets consist of known malicious IP addresses.
  GuardDuty generates findings based on ThreatIntelSets. Only users of the
  administrator
  account can use this operation.
  """
  @spec create_threat_intel_set(map(), String.t(), create_threat_intel_set_request(), list()) ::
          {:ok, create_threat_intel_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, create_threat_intel_set_errors()}
  def create_threat_intel_set(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/threatintelset"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Declines invitations sent to the current member account by Amazon Web Services
  accounts specified by
  their account IDs.
  """
  @spec decline_invitations(map(), decline_invitations_request(), list()) ::
          {:ok, decline_invitations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, decline_invitations_errors()}
  def decline_invitations(%Client{} = client, input, options \\ []) do
    url_path = "/invitation/decline"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Deletes an Amazon GuardDuty detector that is specified by the detector ID.
  """
  @spec delete_detector(map(), String.t(), delete_detector_request(), list()) ::
          {:ok, delete_detector_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_detector_errors()}
  def delete_detector(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Deletes the filter specified by the filter name.
  """
  @spec delete_filter(map(), String.t(), String.t(), delete_filter_request(), list()) ::
          {:ok, delete_filter_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_filter_errors()}
  def delete_filter(%Client{} = client, detector_id, filter_name, input, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/filter/#{AWS.Util.encode_uri(filter_name)}"

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

    meta = metadata()

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

  @doc """
  Deletes invitations sent to the current member account by Amazon Web Services
  accounts specified by
  their account IDs.
  """
  @spec delete_invitations(map(), delete_invitations_request(), list()) ::
          {:ok, delete_invitations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_invitations_errors()}
  def delete_invitations(%Client{} = client, input, options \\ []) do
    url_path = "/invitation/delete"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Deletes the IPSet specified by the `ipSetId`.

  IPSets are called trusted IP
  lists in the console user interface.
  """
  @spec delete_ip_set(map(), String.t(), String.t(), delete_ip_set_request(), list()) ::
          {:ok, delete_ip_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_ip_set_errors()}
  def delete_ip_set(%Client{} = client, detector_id, ip_set_id, input, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/ipset/#{AWS.Util.encode_uri(ip_set_id)}"

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

    meta = metadata()

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

  @doc """
  Deletes the Malware Protection plan ID associated with the Malware Protection
  plan resource.

  Use this API only when you no longer want to protect the resource associated
  with this
  Malware Protection plan ID.
  """
  @spec delete_malware_protection_plan(
          map(),
          String.t(),
          delete_malware_protection_plan_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_malware_protection_plan_errors()}
  def delete_malware_protection_plan(
        %Client{} = client,
        malware_protection_plan_id,
        input,
        options \\ []
      ) do
    url_path = "/malware-protection-plan/#{AWS.Util.encode_uri(malware_protection_plan_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Deletes GuardDuty member accounts (to the current GuardDuty administrator
  account)
  specified by the account IDs.

  With `autoEnableOrganizationMembers` configuration for your organization set to
  `ALL`, you'll receive an error if you attempt to disable GuardDuty for a member
  account in your organization.
  """
  @spec delete_members(map(), String.t(), delete_members_request(), list()) ::
          {:ok, delete_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_members_errors()}
  def delete_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/delete"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Deletes the publishing definition with the specified `destinationId`.
  """
  @spec delete_publishing_destination(
          map(),
          String.t(),
          String.t(),
          delete_publishing_destination_request(),
          list()
        ) ::
          {:ok, delete_publishing_destination_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_publishing_destination_errors()}
  def delete_publishing_destination(
        %Client{} = client,
        destination_id,
        detector_id,
        input,
        options \\ []
      ) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/publishingDestination/#{AWS.Util.encode_uri(destination_id)}"

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

    meta = metadata()

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

  @doc """
  Deletes the ThreatIntelSet specified by the ThreatIntelSet ID.
  """
  @spec delete_threat_intel_set(
          map(),
          String.t(),
          String.t(),
          delete_threat_intel_set_request(),
          list()
        ) ::
          {:ok, delete_threat_intel_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, delete_threat_intel_set_errors()}
  def delete_threat_intel_set(
        %Client{} = client,
        detector_id,
        threat_intel_set_id,
        input,
        options \\ []
      ) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/threatintelset/#{AWS.Util.encode_uri(threat_intel_set_id)}"

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

    meta = metadata()

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

  @doc """
  Returns a list of malware scans.

  Each member account can view the malware scans for their
  own accounts. An administrator can view the malware scans for all the member
  accounts.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec describe_malware_scans(map(), String.t(), describe_malware_scans_request(), list()) ::
          {:ok, describe_malware_scans_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, describe_malware_scans_errors()}
  def describe_malware_scans(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/malware-scans"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Returns information about the account selected as the delegated administrator
  for
  GuardDuty.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec describe_organization_configuration(
          map(),
          String.t(),
          String.t() | nil,
          String.t() | nil,
          list()
        ) ::
          {:ok, describe_organization_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, describe_organization_configuration_errors()}
  def describe_organization_configuration(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/admin"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Returns information about the publishing destination specified by the provided
  `destinationId`.
  """
  @spec describe_publishing_destination(map(), String.t(), String.t(), list()) ::
          {:ok, describe_publishing_destination_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, describe_publishing_destination_errors()}
  def describe_publishing_destination(
        %Client{} = client,
        destination_id,
        detector_id,
        options \\ []
      ) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/publishingDestination/#{AWS.Util.encode_uri(destination_id)}"

    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Removes the existing GuardDuty delegated
  administrator of the organization.

  Only the organization's management account can run this
  API operation.
  """
  @spec disable_organization_admin_account(
          map(),
          disable_organization_admin_account_request(),
          list()
        ) ::
          {:ok, disable_organization_admin_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, disable_organization_admin_account_errors()}
  def disable_organization_admin_account(%Client{} = client, input, options \\ []) do
    url_path = "/admin/disable"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Disassociates the current GuardDuty member account from its administrator
  account.

  When you
  disassociate an invited member from a GuardDuty delegated administrator, the
  member account details
  obtained from the
  [CreateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_CreateMembers.html) API, including the associated email addresses, are retained. This is
  done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html)
  API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html)
  API.

  With `autoEnableOrganizationMembers` configuration for your organization set to
  `ALL`, you'll receive an error if you attempt to disable GuardDuty in a member
  account.
  """
  @spec disassociate_from_administrator_account(
          map(),
          String.t(),
          disassociate_from_administrator_account_request(),
          list()
        ) ::
          {:ok, disassociate_from_administrator_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, disassociate_from_administrator_account_errors()}
  def disassociate_from_administrator_account(
        %Client{} = client,
        detector_id,
        input,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/administrator/disassociate"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Disassociates the current GuardDuty member account from its administrator
  account.

  When you
  disassociate an invited member from a GuardDuty delegated administrator, the
  member account details
  obtained from the
  [CreateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_CreateMembers.html) API, including the associated email addresses, are retained. This is
  done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html)
  API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html)
  API.
  """
  @spec disassociate_from_master_account(
          map(),
          String.t(),
          disassociate_from_master_account_request(),
          list()
        ) ::
          {:ok, disassociate_from_master_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, disassociate_from_master_account_errors()}
  def disassociate_from_master_account(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/master/disassociate"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Disassociates GuardDuty member accounts (from the current administrator account)
  specified
  by the account IDs.

  When you
  disassociate an invited member from a GuardDuty delegated administrator, the
  member account details
  obtained from the
  [CreateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_CreateMembers.html) API, including the associated email addresses, are retained. This is
  done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html)
  API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html) API.

  With `autoEnableOrganizationMembers` configuration for your organization set to
  `ALL`, you'll receive an error if you attempt to disassociate a member account
  before removing them from your organization.

  If you disassociate a member account that was added by invitation, the member
  account details
  obtained from this API, including the associated email addresses, will be
  retained.
  This is done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html)
  API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html)
  API.

  When the member accounts added through Organizations are later disassociated,
  you (administrator)
  can't invite them by calling the InviteMembers API. You can create an
  association with these
  member accounts again only by calling the CreateMembers API.
  """
  @spec disassociate_members(map(), String.t(), disassociate_members_request(), list()) ::
          {:ok, disassociate_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, disassociate_members_errors()}
  def disassociate_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/disassociate"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Designates an Amazon Web Services account within the organization as your
  GuardDuty delegated
  administrator.

  Only the organization's management account can run this
  API operation.
  """
  @spec enable_organization_admin_account(
          map(),
          enable_organization_admin_account_request(),
          list()
        ) ::
          {:ok, enable_organization_admin_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, enable_organization_admin_account_errors()}
  def enable_organization_admin_account(%Client{} = client, input, options \\ []) do
    url_path = "/admin/enable"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Provides the details of the GuardDuty administrator account associated with the
  current
  GuardDuty member account.

  If the organization's management account or a delegated administrator runs this
  API,
  it will return success (`HTTP 200`) but no content.
  """
  @spec get_administrator_account(map(), String.t(), list()) ::
          {:ok, get_administrator_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_administrator_account_errors()}
  def get_administrator_account(%Client{} = client, detector_id, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/administrator"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves aggregated statistics for your account.

  If you are a GuardDuty administrator, you
  can retrieve the statistics for all the resources associated with the active
  member accounts
  in your organization who have enabled Runtime Monitoring and have the GuardDuty
  security agent running
  on their resources.
  """
  @spec get_coverage_statistics(map(), String.t(), get_coverage_statistics_request(), list()) ::
          {:ok, get_coverage_statistics_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_coverage_statistics_errors()}
  def get_coverage_statistics(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/coverage/statistics"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves a GuardDuty detector specified by the detectorId.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec get_detector(map(), String.t(), list()) ::
          {:ok, get_detector_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_detector_errors()}
  def get_detector(%Client{} = client, detector_id, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Returns the details of the filter specified by the filter name.
  """
  @spec get_filter(map(), String.t(), String.t(), list()) ::
          {:ok, get_filter_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_filter_errors()}
  def get_filter(%Client{} = client, detector_id, filter_name, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/filter/#{AWS.Util.encode_uri(filter_name)}"

    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Describes Amazon GuardDuty findings specified by finding IDs.
  """
  @spec get_findings(map(), String.t(), get_findings_request(), list()) ::
          {:ok, get_findings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_findings_errors()}
  def get_findings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/get"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists GuardDuty findings statistics for the specified detector ID.

  You must provide either `findingStatisticTypes` or
  `groupBy` parameter, and not both. You can use the `maxResults` and `orderBy`
  parameters only when using `groupBy`.

  There might be regional differences because some flags might not be available in
  all the Regions where GuardDuty
  is currently supported. For more information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec get_findings_statistics(map(), String.t(), get_findings_statistics_request(), list()) ::
          {:ok, get_findings_statistics_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_findings_statistics_errors()}
  def get_findings_statistics(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/statistics"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Returns the count of all GuardDuty membership invitations that were sent to the
  current
  member account except the currently accepted invitation.
  """
  @spec get_invitations_count(map(), list()) ::
          {:ok, get_invitations_count_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_invitations_count_errors()}
  def get_invitations_count(%Client{} = client, options \\ []) do
    url_path = "/invitation/count"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves the IPSet specified by the `ipSetId`.
  """
  @spec get_ip_set(map(), String.t(), String.t(), list()) ::
          {:ok, get_ip_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_ip_set_errors()}
  def get_ip_set(%Client{} = client, detector_id, ip_set_id, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/ipset/#{AWS.Util.encode_uri(ip_set_id)}"

    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves the Malware Protection plan details associated with a Malware
  Protection
  plan ID.
  """
  @spec get_malware_protection_plan(map(), String.t(), list()) ::
          {:ok, get_malware_protection_plan_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_malware_protection_plan_errors()}
  def get_malware_protection_plan(%Client{} = client, malware_protection_plan_id, options \\ []) do
    url_path = "/malware-protection-plan/#{AWS.Util.encode_uri(malware_protection_plan_id)}"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Returns the details of the malware scan settings.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec get_malware_scan_settings(map(), String.t(), list()) ::
          {:ok, get_malware_scan_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_malware_scan_settings_errors()}
  def get_malware_scan_settings(%Client{} = client, detector_id, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/malware-scan-settings"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Provides the details for the GuardDuty administrator account associated with the
  current
  GuardDuty member account.
  """
  @spec get_master_account(map(), String.t(), list()) ::
          {:ok, get_master_account_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_master_account_errors()}
  def get_master_account(%Client{} = client, detector_id, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/master"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Describes which data sources are enabled for the member account's detector.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec get_member_detectors(map(), String.t(), get_member_detectors_request(), list()) ::
          {:ok, get_member_detectors_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_member_detectors_errors()}
  def get_member_detectors(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/detector/get"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves GuardDuty member accounts (of the current GuardDuty administrator
  account)
  specified by the account IDs.
  """
  @spec get_members(map(), String.t(), get_members_request(), list()) ::
          {:ok, get_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_members_errors()}
  def get_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/get"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves how many active member accounts have
  each feature enabled within GuardDuty.

  Only a delegated GuardDuty administrator of an organization can run this API.

  When you create a new organization, it might take up to 24
  hours to generate the statistics for the entire organization.
  """
  @spec get_organization_statistics(map(), list()) ::
          {:ok, get_organization_statistics_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_organization_statistics_errors()}
  def get_organization_statistics(%Client{} = client, options \\ []) do
    url_path = "/organization/statistics"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Provides the number of days left for each data source used in the free trial
  period.
  """
  @spec get_remaining_free_trial_days(
          map(),
          String.t(),
          get_remaining_free_trial_days_request(),
          list()
        ) ::
          {:ok, get_remaining_free_trial_days_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_remaining_free_trial_days_errors()}
  def get_remaining_free_trial_days(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/freeTrial/daysRemaining"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Retrieves the ThreatIntelSet that is specified by the ThreatIntelSet ID.
  """
  @spec get_threat_intel_set(map(), String.t(), String.t(), list()) ::
          {:ok, get_threat_intel_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_threat_intel_set_errors()}
  def get_threat_intel_set(%Client{} = client, detector_id, threat_intel_set_id, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/threatintelset/#{AWS.Util.encode_uri(threat_intel_set_id)}"

    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists Amazon GuardDuty usage statistics over the last 30 days for the specified
  detector
  ID.

  For newly enabled detectors or data sources, the cost returned will include only
  the usage
  so far under 30 days. This may differ from the cost metrics in the console,
  which project
  usage over 30 days to provide a monthly cost estimate. For more information, see
  [Understanding How Usage Costs are Calculated](https://docs.aws.amazon.com/guardduty/latest/ug/monitoring_costs.html#usage-calculations).
  """
  @spec get_usage_statistics(map(), String.t(), get_usage_statistics_request(), list()) ::
          {:ok, get_usage_statistics_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, get_usage_statistics_errors()}
  def get_usage_statistics(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/usage/statistics"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Invites Amazon Web Services accounts to become members of an organization
  administered by the Amazon Web Services account
  that invokes this API.

  If you are using Amazon Web Services Organizations to manage your GuardDuty
  environment, this step is not
  needed. For more information, see [Managing accounts with organizations](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_organizations.html).

  To invite Amazon Web Services accounts, the first step is
  to ensure that GuardDuty has been enabled in the potential member accounts. You
  can now invoke this API
  to add accounts by invitation. The
  invited accounts can either accept or decline the invitation from their
  GuardDuty accounts. Each invited Amazon Web Services account can
  choose to accept the invitation from only one Amazon Web Services account. For
  more information, see
  [Managing GuardDuty accounts by
  invitation](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_invitations.html).

  After the invite has been accepted and you choose to disassociate a member
  account
  (by using
  [DisassociateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DisassociateMembers.html)) from your account,
  the details of the member account obtained by invoking
  [CreateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_CreateMembers.html),
  including the
  associated email addresses, will be retained.
  This is done so that you can invoke InviteMembers without the need to invoke
  [CreateMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_CreateMembers.html) again. To
  remove the details associated with a member account, you must also invoke
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html).

  If you disassociate a member account that was added by invitation, the member
  account details
  obtained from this API, including the associated email addresses, will be
  retained.
  This is done so that the delegated administrator can invoke the
  [InviteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_InviteMembers.html) API without the need to invoke the CreateMembers API again. To
  remove the details associated with a member account, the delegated administrator
  must invoke the
  [DeleteMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DeleteMembers.html)
  API.

  When the member accounts added through Organizations are later disassociated,
  you (administrator)
  can't invite them by calling the InviteMembers API. You can create an
  association with these
  member accounts again only by calling the CreateMembers API.
  """
  @spec invite_members(map(), String.t(), invite_members_request(), list()) ::
          {:ok, invite_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, invite_members_errors()}
  def invite_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/invite"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists coverage details for your GuardDuty account.

  If you're a GuardDuty administrator, you can
  retrieve all resources associated with the active member accounts in your
  organization.

  Make sure the accounts have Runtime Monitoring enabled and GuardDuty agent
  running on
  their resources.
  """
  @spec list_coverage(map(), String.t(), list_coverage_request(), list()) ::
          {:ok, list_coverage_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_coverage_errors()}
  def list_coverage(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/coverage"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists detectorIds of all the existing Amazon GuardDuty detector resources.
  """
  @spec list_detectors(map(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_detectors_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_detectors_errors()}
  def list_detectors(%Client{} = client, max_results \\ nil, next_token \\ nil, options \\ []) do
    url_path = "/detector"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Returns a paginated list of the current filters.
  """
  @spec list_filters(map(), String.t(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_filters_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_filters_errors()}
  def list_filters(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/filter"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Lists GuardDuty findings for the specified detector ID.

  There might be regional differences because some flags might not be available in
  all the Regions where GuardDuty
  is currently supported. For more information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec list_findings(map(), String.t(), list_findings_request(), list()) ::
          {:ok, list_findings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_findings_errors()}
  def list_findings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists all GuardDuty membership invitations that were sent to the current Amazon
  Web Services
  account.
  """
  @spec list_invitations(map(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_invitations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_invitations_errors()}
  def list_invitations(%Client{} = client, max_results \\ nil, next_token \\ nil, options \\ []) do
    url_path = "/invitation"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Lists the IPSets of the GuardDuty service specified by the detector ID.

  If you use this
  operation from a member account, the IPSets returned are the IPSets from the
  associated
  administrator account.
  """
  @spec list_ip_sets(map(), String.t(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_ip_sets_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_ip_sets_errors()}
  def list_ip_sets(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/ipset"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Lists the Malware Protection plan IDs associated with the protected
  resources in your Amazon Web Services account.
  """
  @spec list_malware_protection_plans(map(), String.t() | nil, list()) ::
          {:ok, list_malware_protection_plans_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_malware_protection_plans_errors()}
  def list_malware_protection_plans(%Client{} = client, next_token \\ nil, options \\ []) do
    url_path = "/malware-protection-plan"
    headers = []
    query_params = []

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

    meta = metadata()

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

  @doc """
  Lists details about all member accounts for the current GuardDuty administrator
  account.
  """
  @spec list_members(
          map(),
          String.t(),
          String.t() | nil,
          String.t() | nil,
          String.t() | nil,
          list()
        ) ::
          {:ok, list_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_members_errors()}
  def list_members(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        only_associated \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member"
    headers = []
    query_params = []

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

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

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

    meta = metadata()

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

  @doc """
  Lists the accounts designated as GuardDuty delegated administrators.

  Only the organization's management account can run this
  API operation.
  """
  @spec list_organization_admin_accounts(map(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_organization_admin_accounts_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_organization_admin_accounts_errors()}
  def list_organization_admin_accounts(
        %Client{} = client,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/admin"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Returns a list of publishing destinations associated with the specified
  `detectorId`.
  """
  @spec list_publishing_destinations(
          map(),
          String.t(),
          String.t() | nil,
          String.t() | nil,
          list()
        ) ::
          {:ok, list_publishing_destinations_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_publishing_destinations_errors()}
  def list_publishing_destinations(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/publishingDestination"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Lists tags for a resource.

  Tagging is currently supported for detectors, finding filters,
  IP sets, threat intel sets, and publishing destination, with a limit of 50 tags
  per resource.
  When invoked, this
  operation returns all assigned tags for a given resource.
  """
  @spec list_tags_for_resource(map(), String.t(), list()) ::
          {:ok, list_tags_for_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_tags_for_resource_errors()}
  def list_tags_for_resource(%Client{} = client, resource_arn, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Lists the ThreatIntelSets of the GuardDuty service specified by the detector ID.

  If you
  use this operation from a member account, the ThreatIntelSets associated with
  the
  administrator account are returned.
  """
  @spec list_threat_intel_sets(map(), String.t(), String.t() | nil, String.t() | nil, list()) ::
          {:ok, list_threat_intel_sets_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, list_threat_intel_sets_errors()}
  def list_threat_intel_sets(
        %Client{} = client,
        detector_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/threatintelset"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Initiates the malware scan.

  Invoking this API will automatically create the [Service-linked role](https://docs.aws.amazon.com/guardduty/latest/ug/slr-permissions-malware-protection.html)
  in
  the corresponding account.

  When the malware scan starts, you can use the associated scan ID to track the
  status of the scan. For more information,
  see
  [DescribeMalwareScans](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DescribeMalwareScans.html).
  """
  @spec start_malware_scan(map(), start_malware_scan_request(), list()) ::
          {:ok, start_malware_scan_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, start_malware_scan_errors()}
  def start_malware_scan(%Client{} = client, input, options \\ []) do
    url_path = "/malware-scan/start"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Turns on GuardDuty monitoring of the specified member accounts.

  Use this operation to
  restart monitoring of accounts that you stopped monitoring with the
  [StopMonitoringMembers](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_StopMonitoringMembers.html)
  operation.
  """
  @spec start_monitoring_members(map(), String.t(), start_monitoring_members_request(), list()) ::
          {:ok, start_monitoring_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, start_monitoring_members_errors()}
  def start_monitoring_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/start"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Stops GuardDuty monitoring for the specified member accounts.

  Use the
  `StartMonitoringMembers` operation to restart monitoring for those
  accounts.

  With `autoEnableOrganizationMembers` configuration for your organization set to
  `ALL`, you'll receive an error if you attempt to stop monitoring the member
  accounts in your organization.
  """
  @spec stop_monitoring_members(map(), String.t(), stop_monitoring_members_request(), list()) ::
          {:ok, stop_monitoring_members_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, stop_monitoring_members_errors()}
  def stop_monitoring_members(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/stop"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

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

    meta = metadata()

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

  @doc """
  Unarchives GuardDuty findings specified by the `findingIds`.
  """
  @spec unarchive_findings(map(), String.t(), unarchive_findings_request(), list()) ::
          {:ok, unarchive_findings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, unarchive_findings_errors()}
  def unarchive_findings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/unarchive"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

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

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

    meta = metadata()

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

  @doc """
  Updates the GuardDuty detector specified by the detector ID.

  Specifying both EKS Runtime Monitoring (`EKS_RUNTIME_MONITORING`)
  and Runtime Monitoring (`RUNTIME_MONITORING`) will cause an error.
  You can add only one of these two features because Runtime Monitoring already
  includes the
  threat detection for Amazon EKS resources. For more information, see
  [Runtime Monitoring](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html).

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec update_detector(map(), String.t(), update_detector_request(), list()) ::
          {:ok, update_detector_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_detector_errors()}
  def update_detector(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Updates the filter specified by the filter name.
  """
  @spec update_filter(map(), String.t(), String.t(), update_filter_request(), list()) ::
          {:ok, update_filter_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_filter_errors()}
  def update_filter(%Client{} = client, detector_id, filter_name, input, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/filter/#{AWS.Util.encode_uri(filter_name)}"

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

    meta = metadata()

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

  @doc """
  Marks the specified GuardDuty findings as useful or not useful.
  """
  @spec update_findings_feedback(map(), String.t(), update_findings_feedback_request(), list()) ::
          {:ok, update_findings_feedback_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_findings_feedback_errors()}
  def update_findings_feedback(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/findings/feedback"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Updates the IPSet specified by the IPSet ID.
  """
  @spec update_ip_set(map(), String.t(), String.t(), update_ip_set_request(), list()) ::
          {:ok, update_ip_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_ip_set_errors()}
  def update_ip_set(%Client{} = client, detector_id, ip_set_id, input, options \\ []) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/ipset/#{AWS.Util.encode_uri(ip_set_id)}"

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

    meta = metadata()

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

  @doc """
  Updates an existing Malware Protection plan resource.
  """
  @spec update_malware_protection_plan(
          map(),
          String.t(),
          update_malware_protection_plan_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_malware_protection_plan_errors()}
  def update_malware_protection_plan(
        %Client{} = client,
        malware_protection_plan_id,
        input,
        options \\ []
      ) do
    url_path = "/malware-protection-plan/#{AWS.Util.encode_uri(malware_protection_plan_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Updates the malware scan settings.

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec update_malware_scan_settings(
          map(),
          String.t(),
          update_malware_scan_settings_request(),
          list()
        ) ::
          {:ok, update_malware_scan_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_malware_scan_settings_errors()}
  def update_malware_scan_settings(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/malware-scan-settings"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Contains information on member accounts to be updated.

  Specifying both EKS Runtime Monitoring (`EKS_RUNTIME_MONITORING`)
  and Runtime Monitoring (`RUNTIME_MONITORING`) will cause an error.
  You can add only one of these two features because Runtime Monitoring already
  includes the
  threat detection for Amazon EKS resources. For more information, see
  [Runtime Monitoring](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html).

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec update_member_detectors(map(), String.t(), update_member_detectors_request(), list()) ::
          {:ok, update_member_detectors_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_member_detectors_errors()}
  def update_member_detectors(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/member/detector/update"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Configures the delegated administrator account with the provided values.

  You must provide
  a value for either `autoEnableOrganizationMembers` or `autoEnable`, but not
  both.

  Specifying both EKS Runtime Monitoring (`EKS_RUNTIME_MONITORING`)
  and Runtime Monitoring (`RUNTIME_MONITORING`) will cause an error.
  You can add only one of these two features because Runtime Monitoring already
  includes the
  threat detection for Amazon EKS resources. For more information, see
  [Runtime Monitoring](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html).

  There might be regional differences because some data sources might not be
  available in all the Amazon Web Services Regions where GuardDuty is presently
  supported. For more
  information, see [Regions and endpoints](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_regions.html).
  """
  @spec update_organization_configuration(
          map(),
          String.t(),
          update_organization_configuration_request(),
          list()
        ) ::
          {:ok, update_organization_configuration_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_organization_configuration_errors()}
  def update_organization_configuration(%Client{} = client, detector_id, input, options \\ []) do
    url_path = "/detector/#{AWS.Util.encode_uri(detector_id)}/admin"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Updates information about the publishing destination specified by the
  `destinationId`.
  """
  @spec update_publishing_destination(
          map(),
          String.t(),
          String.t(),
          update_publishing_destination_request(),
          list()
        ) ::
          {:ok, update_publishing_destination_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_publishing_destination_errors()}
  def update_publishing_destination(
        %Client{} = client,
        destination_id,
        detector_id,
        input,
        options \\ []
      ) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/publishingDestination/#{AWS.Util.encode_uri(destination_id)}"

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

    meta = metadata()

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

  @doc """
  Updates the ThreatIntelSet specified by the ThreatIntelSet ID.
  """
  @spec update_threat_intel_set(
          map(),
          String.t(),
          String.t(),
          update_threat_intel_set_request(),
          list()
        ) ::
          {:ok, update_threat_intel_set_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, update_threat_intel_set_errors()}
  def update_threat_intel_set(
        %Client{} = client,
        detector_id,
        threat_intel_set_id,
        input,
        options \\ []
      ) do
    url_path =
      "/detector/#{AWS.Util.encode_uri(detector_id)}/threatintelset/#{AWS.Util.encode_uri(threat_intel_set_id)}"

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

    meta = metadata()

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