/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#pragma once
#include <aws/ec2/EC2_EXPORTS.h>
#include <aws/ec2/EC2Request.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/ec2/model/Filter.h>
#include <utility>

namespace Aws
{
namespace EC2
{
namespace Model
{

  /**
   */
  class DescribeInstancesRequest : public EC2Request
  {
  public:
    AWS_EC2_API DescribeInstancesRequest() = default;

    // Service request name is the Operation name which will send this request out,
    // each operation should has unique request name, so that we can get operation's name from this request.
    // Note: this is not true for response, multiple operations may have the same response name,
    // so we can not get operation's name from response.
    inline virtual const char* GetServiceRequestName() const override { return "DescribeInstances"; }

    AWS_EC2_API Aws::String SerializePayload() const override;

  protected:
    AWS_EC2_API void DumpBodyToUrl(Aws::Http::URI& uri ) const override;

  public:

    ///@{
    /**
     * <p>The instance IDs.</p> <p>Default: Describes all your instances.</p>
     */
    inline const Aws::Vector<Aws::String>& GetInstanceIds() const { return m_instanceIds; }
    inline bool InstanceIdsHasBeenSet() const { return m_instanceIdsHasBeenSet; }
    template<typename InstanceIdsT = Aws::Vector<Aws::String>>
    void SetInstanceIds(InstanceIdsT&& value) { m_instanceIdsHasBeenSet = true; m_instanceIds = std::forward<InstanceIdsT>(value); }
    template<typename InstanceIdsT = Aws::Vector<Aws::String>>
    DescribeInstancesRequest& WithInstanceIds(InstanceIdsT&& value) { SetInstanceIds(std::forward<InstanceIdsT>(value)); return *this;}
    template<typename InstanceIdsT = Aws::String>
    DescribeInstancesRequest& AddInstanceIds(InstanceIdsT&& value) { m_instanceIdsHasBeenSet = true; m_instanceIds.emplace_back(std::forward<InstanceIdsT>(value)); return *this; }
    ///@}

    ///@{
    /**
     * <p>Checks whether you have the required permissions for the operation, without
     * actually making the request, and provides an error response. If you have the
     * required permissions, the error response is <code>DryRunOperation</code>.
     * Otherwise, it is <code>UnauthorizedOperation</code>.</p>
     */
    inline bool GetDryRun() const { return m_dryRun; }
    inline bool DryRunHasBeenSet() const { return m_dryRunHasBeenSet; }
    inline void SetDryRun(bool value) { m_dryRunHasBeenSet = true; m_dryRun = value; }
    inline DescribeInstancesRequest& WithDryRun(bool value) { SetDryRun(value); return *this;}
    ///@}

    ///@{
    /**
     * <p>The filters.</p> <ul> <li> <p> <code>affinity</code> - The affinity setting
     * for an instance running on a Dedicated Host (<code>default</code> |
     * <code>host</code>).</p> </li> <li> <p> <code>architecture</code> - The instance
     * architecture (<code>i386</code> | <code>x86_64</code> | <code>arm64</code>).</p>
     * </li> <li> <p> <code>availability-zone</code> - The Availability Zone of the
     * instance.</p> </li> <li> <p> <code>availability-zone-id</code> - The ID of the
     * Availability Zone of the instance.</p> </li> <li> <p>
     * <code>block-device-mapping.attach-time</code> - The attach time for an EBS
     * volume mapped to the instance, for example,
     * <code>2022-09-15T17:15:20.000Z</code>.</p> </li> <li> <p>
     * <code>block-device-mapping.delete-on-termination</code> - A Boolean that
     * indicates whether the EBS volume is deleted on instance termination.</p> </li>
     * <li> <p> <code>block-device-mapping.device-name</code> - The device name
     * specified in the block device mapping (for example, <code>/dev/sdh</code> or
     * <code>xvdh</code>).</p> </li> <li> <p> <code>block-device-mapping.status</code>
     * - The status for the EBS volume (<code>attaching</code> | <code>attached</code>
     * | <code>detaching</code> | <code>detached</code>).</p> </li> <li> <p>
     * <code>block-device-mapping.volume-id</code> - The volume ID of the EBS
     * volume.</p> </li> <li> <p> <code>boot-mode</code> - The boot mode that was
     * specified by the AMI (<code>legacy-bios</code> | <code>uefi</code> |
     * <code>uefi-preferred</code>).</p> </li> <li> <p>
     * <code>capacity-reservation-id</code> - The ID of the Capacity Reservation into
     * which the instance was launched.</p> </li> <li> <p>
     * <code>capacity-reservation-specification.capacity-reservation-preference</code>
     * - The instance's Capacity Reservation preference (<code>open</code> |
     * <code>none</code>).</p> </li> <li> <p>
     * <code>capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id</code>
     * - The ID of the targeted Capacity Reservation.</p> </li> <li> <p>
     * <code>capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn</code>
     * - The ARN of the targeted Capacity Reservation group.</p> </li> <li> <p>
     * <code>client-token</code> - The idempotency token you provided when you launched
     * the instance.</p> </li> <li> <p> <code>current-instance-boot-mode</code> - The
     * boot mode that is used to launch the instance at launch or start
     * (<code>legacy-bios</code> | <code>uefi</code>).</p> </li> <li> <p>
     * <code>dns-name</code> - The public DNS name of the instance.</p> </li> <li> <p>
     * <code>ebs-optimized</code> - A Boolean that indicates whether the instance is
     * optimized for Amazon EBS I/O.</p> </li> <li> <p> <code>ena-support</code> - A
     * Boolean that indicates whether the instance is enabled for enhanced networking
     * with ENA.</p> </li> <li> <p> <code>enclave-options.enabled</code> - A Boolean
     * that indicates whether the instance is enabled for Amazon Web Services Nitro
     * Enclaves.</p> </li> <li> <p> <code>hibernation-options.configured</code> - A
     * Boolean that indicates whether the instance is enabled for hibernation. A value
     * of <code>true</code> means that the instance is enabled for hibernation.</p>
     * </li> <li> <p> <code>host-id</code> - The ID of the Dedicated Host on which the
     * instance is running, if applicable.</p> </li> <li> <p> <code>hypervisor</code> -
     * The hypervisor type of the instance (<code>ovm</code> | <code>xen</code>). The
     * value <code>xen</code> is used for both Xen and Nitro hypervisors.</p> </li>
     * <li> <p> <code>iam-instance-profile.arn</code> - The instance profile associated
     * with the instance. Specified as an ARN.</p> </li> <li> <p>
     * <code>iam-instance-profile.id</code> - The instance profile associated with the
     * instance. Specified as an ID.</p> </li> <li> <p> <code>image-id</code> - The ID
     * of the image used to launch the instance.</p> </li> <li> <p>
     * <code>instance-id</code> - The ID of the instance.</p> </li> <li> <p>
     * <code>instance-lifecycle</code> - Indicates whether this is a Spot Instance, a
     * Scheduled Instance, or a Capacity Block (<code>spot</code> |
     * <code>scheduled</code> | <code>capacity-block</code>).</p> </li> <li> <p>
     * <code>instance-state-code</code> - The state of the instance, as a 16-bit
     * unsigned integer. The high byte is used for internal purposes and should be
     * ignored. The low byte is set based on the state represented. The valid values
     * are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64
     * (stopping), and 80 (stopped).</p> </li> <li> <p>
     * <code>instance-state-name</code> - The state of the instance
     * (<code>pending</code> | <code>running</code> | <code>shutting-down</code> |
     * <code>terminated</code> | <code>stopping</code> | <code>stopped</code>).</p>
     * </li> <li> <p> <code>instance-type</code> - The type of instance (for example,
     * <code>t2.micro</code>).</p> </li> <li> <p> <code>instance.group-id</code> - The
     * ID of the security group for the instance. </p> </li> <li> <p>
     * <code>instance.group-name</code> - The name of the security group for the
     * instance. </p> </li> <li> <p> <code>ip-address</code> - The public IPv4 address
     * of the instance.</p> </li> <li> <p> <code>ipv6-address</code> - The IPv6 address
     * of the instance.</p> </li> <li> <p> <code>kernel-id</code> - The kernel ID.</p>
     * </li> <li> <p> <code>key-name</code> - The name of the key pair used when the
     * instance was launched.</p> </li> <li> <p> <code>launch-index</code> - When
     * launching multiple instances, this is the index for the instance in the launch
     * group (for example, 0, 1, 2, and so on). </p> </li> <li> <p>
     * <code>launch-time</code> - The time when the instance was launched, in the ISO
     * 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,
     * <code>2021-09-29T11:04:43.305Z</code>. You can use a wildcard (<code>*</code>),
     * for example, <code>2021-09-29T*</code>, which matches an entire day.</p> </li>
     * <li> <p> <code>maintenance-options.auto-recovery</code> - The current automatic
     * recovery behavior of the instance (<code>disabled</code> |
     * <code>default</code>).</p> </li> <li> <p>
     * <code>metadata-options.http-endpoint</code> - The status of access to the HTTP
     * metadata endpoint on your instance (<code>enabled</code> |
     * <code>disabled</code>)</p> </li> <li> <p>
     * <code>metadata-options.http-protocol-ipv4</code> - Indicates whether the IPv4
     * endpoint is enabled (<code>disabled</code> | <code>enabled</code>).</p> </li>
     * <li> <p> <code>metadata-options.http-protocol-ipv6</code> - Indicates whether
     * the IPv6 endpoint is enabled (<code>disabled</code> | <code>enabled</code>).</p>
     * </li> <li> <p> <code>metadata-options.http-put-response-hop-limit</code> - The
     * HTTP metadata request put response hop limit (integer, possible values
     * <code>1</code> to <code>64</code>)</p> </li> <li> <p>
     * <code>metadata-options.http-tokens</code> - The metadata request authorization
     * state (<code>optional</code> | <code>required</code>)</p> </li> <li> <p>
     * <code>metadata-options.instance-metadata-tags</code> - The status of access to
     * instance tags from the instance metadata (<code>enabled</code> |
     * <code>disabled</code>)</p> </li> <li> <p> <code>metadata-options.state</code> -
     * The state of the metadata option changes (<code>pending</code> |
     * <code>applied</code>).</p> </li> <li> <p> <code>monitoring-state</code> -
     * Indicates whether detailed monitoring is enabled (<code>disabled</code> |
     * <code>enabled</code>).</p> </li> <li> <p>
     * <code>network-interface.addresses.association.allocation-id</code> - The
     * allocation ID.</p> </li> <li> <p>
     * <code>network-interface.addresses.association.association-id</code> - The
     * association ID.</p> </li> <li> <p>
     * <code>network-interface.addresses.association.carrier-ip</code> - The carrier IP
     * address.</p> </li> <li> <p>
     * <code>network-interface.addresses.association.customer-owned-ip</code> - The
     * customer-owned IP address.</p> </li> <li> <p>
     * <code>network-interface.addresses.association.ip-owner-id</code> - The owner ID
     * of the private IPv4 address associated with the network interface.</p> </li>
     * <li> <p> <code>network-interface.addresses.association.public-dns-name</code> -
     * The public DNS name.</p> </li> <li> <p>
     * <code>network-interface.addresses.association.public-ip</code> - The ID of the
     * association of an Elastic IP address (IPv4) with a network interface.</p> </li>
     * <li> <p> <code>network-interface.addresses.primary</code> - Specifies whether
     * the IPv4 address of the network interface is the primary private IPv4
     * address.</p> </li> <li> <p>
     * <code>network-interface.addresses.private-dns-name</code> - The private DNS
     * name.</p> </li> <li> <p>
     * <code>network-interface.addresses.private-ip-address</code> - The private IPv4
     * address associated with the network interface.</p> </li> <li> <p>
     * <code>network-interface.association.allocation-id</code> - The allocation ID
     * returned when you allocated the Elastic IP address (IPv4) for your network
     * interface.</p> </li> <li> <p>
     * <code>network-interface.association.association-id</code> - The association ID
     * returned when the network interface was associated with an IPv4 address.</p>
     * </li> <li> <p> <code>network-interface.association.carrier-ip</code> - The
     * customer-owned IP address.</p> </li> <li> <p>
     * <code>network-interface.association.customer-owned-ip</code> - The
     * customer-owned IP address.</p> </li> <li> <p>
     * <code>network-interface.association.ip-owner-id</code> - The owner of the
     * Elastic IP address (IPv4) associated with the network interface.</p> </li> <li>
     * <p> <code>network-interface.association.public-dns-name</code> - The public DNS
     * name.</p> </li> <li> <p> <code>network-interface.association.public-ip</code> -
     * The address of the Elastic IP address (IPv4) bound to the network interface.</p>
     * </li> <li> <p> <code>network-interface.attachment.attach-time</code> - The time
     * that the network interface was attached to an instance.</p> </li> <li> <p>
     * <code>network-interface.attachment.attachment-id</code> - The ID of the
     * interface attachment.</p> </li> <li> <p>
     * <code>network-interface.attachment.delete-on-termination</code> - Specifies
     * whether the attachment is deleted when an instance is terminated.</p> </li> <li>
     * <p> <code>network-interface.attachment.device-index</code> - The device index to
     * which the network interface is attached.</p> </li> <li> <p>
     * <code>network-interface.attachment.instance-id</code> - The ID of the instance
     * to which the network interface is attached.</p> </li> <li> <p>
     * <code>network-interface.attachment.instance-owner-id</code> - The owner ID of
     * the instance to which the network interface is attached.</p> </li> <li> <p>
     * <code>network-interface.attachment.network-card-index</code> - The index of the
     * network card.</p> </li> <li> <p>
     * <code>network-interface.attachment.status</code> - The status of the attachment
     * (<code>attaching</code> | <code>attached</code> | <code>detaching</code> |
     * <code>detached</code>).</p> </li> <li> <p>
     * <code>network-interface.availability-zone</code> - The Availability Zone for the
     * network interface.</p> </li> <li> <p>
     * <code>network-interface.deny-all-igw-traffic</code> - A Boolean that indicates
     * whether a network interface with an IPv6 address is unreachable from the public
     * internet.</p> </li> <li> <p> <code>network-interface.description</code> - The
     * description of the network interface.</p> </li> <li> <p>
     * <code>network-interface.group-id</code> - The ID of a security group associated
     * with the network interface.</p> </li> <li> <p>
     * <code>network-interface.group-name</code> - The name of a security group
     * associated with the network interface.</p> </li> <li> <p>
     * <code>network-interface.ipv4-prefixes.ipv4-prefix</code> - The IPv4 prefixes
     * that are assigned to the network interface.</p> </li> <li> <p>
     * <code>network-interface.ipv6-address</code> - The IPv6 address associated with
     * the network interface.</p> </li> <li> <p>
     * <code>network-interface.ipv6-addresses.ipv6-address</code> - The IPv6 address
     * associated with the network interface.</p> </li> <li> <p>
     * <code>network-interface.ipv6-addresses.is-primary-ipv6</code> - A Boolean that
     * indicates whether this is the primary IPv6 address.</p> </li> <li> <p>
     * <code>network-interface.ipv6-native</code> - A Boolean that indicates whether
     * this is an IPv6 only network interface.</p> </li> <li> <p>
     * <code>network-interface.ipv6-prefixes.ipv6-prefix</code> - The IPv6 prefix
     * assigned to the network interface.</p> </li> <li> <p>
     * <code>network-interface.mac-address</code> - The MAC address of the network
     * interface.</p> </li> <li> <p>
     * <code>network-interface.network-interface-id</code> - The ID of the network
     * interface.</p> </li> <li> <p> <code>network-interface.operator.managed</code> -
     * A Boolean that indicates whether the instance has a managed network
     * interface.</p> </li> <li> <p> <code>network-interface.operator.principal</code>
     * - The principal that manages the network interface. Only valid for instances
     * with managed network interfaces, where <code>managed</code> is
     * <code>true</code>.</p> </li> <li> <p> <code>network-interface.outpost-arn</code>
     * - The ARN of the Outpost.</p> </li> <li> <p>
     * <code>network-interface.owner-id</code> - The ID of the owner of the network
     * interface.</p> </li> <li> <p> <code>network-interface.private-dns-name</code> -
     * The private DNS name of the network interface.</p> </li> <li> <p>
     * <code>network-interface.private-ip-address</code> - The private IPv4
     * address.</p> </li> <li> <p> <code>network-interface.public-dns-name</code> - The
     * public DNS name.</p> </li> <li> <p> <code>network-interface.requester-id</code>
     * - The requester ID for the network interface.</p> </li> <li> <p>
     * <code>network-interface.requester-managed</code> - Indicates whether the network
     * interface is being managed by Amazon Web Services.</p> </li> <li> <p>
     * <code>network-interface.status</code> - The status of the network interface
     * (<code>available</code>) | <code>in-use</code>).</p> </li> <li> <p>
     * <code>network-interface.source-dest-check</code> - Whether the network interface
     * performs source/destination checking. A value of <code>true</code> means that
     * checking is enabled, and <code>false</code> means that checking is disabled. The
     * value must be <code>false</code> for the network interface to perform network
     * address translation (NAT) in your VPC.</p> </li> <li> <p>
     * <code>network-interface.subnet-id</code> - The ID of the subnet for the network
     * interface.</p> </li> <li> <p> <code>network-interface.tag-key</code> - The key
     * of a tag assigned to the network interface.</p> </li> <li> <p>
     * <code>network-interface.tag-value</code> - The value of a tag assigned to the
     * network interface.</p> </li> <li> <p> <code>network-interface.vpc-id</code> -
     * The ID of the VPC for the network interface.</p> </li> <li> <p>
     * <code>network-performance-options.bandwidth-weighting</code> - Where the
     * performance boost is applied, if applicable. Valid values: <code>default</code>,
     * <code>vpc-1</code>, <code>ebs-1</code>.</p> </li> <li> <p>
     * <code>operator.managed</code> - A Boolean that indicates whether this is a
     * managed instance.</p> </li> <li> <p> <code>operator.principal</code> - The
     * principal that manages the instance. Only valid for managed instances, where
     * <code>managed</code> is <code>true</code>.</p> </li> <li> <p>
     * <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the Outpost.</p>
     * </li> <li> <p> <code>owner-id</code> - The Amazon Web Services account ID of the
     * instance owner.</p> </li> <li> <p> <code>placement-group-name</code> - The name
     * of the placement group for the instance.</p> </li> <li> <p>
     * <code>placement-partition-number</code> - The partition in which the instance is
     * located.</p> </li> <li> <p> <code>platform</code> - The platform. To list only
     * Windows instances, use <code>windows</code>.</p> </li> <li> <p>
     * <code>platform-details</code> - The platform (<code>Linux/UNIX</code> |
     * <code>Red Hat BYOL Linux</code> | <code> Red Hat Enterprise Linux</code> |
     * <code>Red Hat Enterprise Linux with HA</code> | <code>Red Hat Enterprise Linux
     * with High Availability</code> | <code>Red Hat Enterprise Linux with SQL Server
     * Standard and HA</code> | <code>Red Hat Enterprise Linux with SQL Server
     * Enterprise and HA</code> | <code>Red Hat Enterprise Linux with SQL Server
     * Standard</code> | <code>Red Hat Enterprise Linux with SQL Server Web</code> |
     * <code>Red Hat Enterprise Linux with SQL Server Enterprise</code> | <code>SQL
     * Server Enterprise</code> | <code>SQL Server Standard</code> | <code>SQL Server
     * Web</code> | <code>SUSE Linux</code> | <code>Ubuntu Pro</code> |
     * <code>Windows</code> | <code>Windows BYOL</code> | <code>Windows with SQL Server
     * Enterprise</code> | <code>Windows with SQL Server Standard</code> |
     * <code>Windows with SQL Server Web</code>).</p> </li> <li> <p>
     * <code>private-dns-name</code> - The private IPv4 DNS name of the instance.</p>
     * </li> <li> <p>
     * <code>private-dns-name-options.enable-resource-name-dns-a-record</code> - A
     * Boolean that indicates whether to respond to DNS queries for instance hostnames
     * with DNS A records.</p> </li> <li> <p>
     * <code>private-dns-name-options.enable-resource-name-dns-aaaa-record</code> - A
     * Boolean that indicates whether to respond to DNS queries for instance hostnames
     * with DNS AAAA records.</p> </li> <li> <p>
     * <code>private-dns-name-options.hostname-type</code> - The type of hostname
     * (<code>ip-name</code> | <code>resource-name</code>).</p> </li> <li> <p>
     * <code>private-ip-address</code> - The private IPv4 address of the instance. This
     * can only be used to filter by the primary IP address of the network interface
     * attached to the instance. To filter by additional IP addresses assigned to the
     * network interface, use the filter
     * <code>network-interface.addresses.private-ip-address</code>.</p> </li> <li> <p>
     * <code>product-code</code> - The product code associated with the AMI used to
     * launch the instance.</p> </li> <li> <p> <code>product-code.type</code> - The
     * type of product code (<code>devpay</code> | <code>marketplace</code>).</p> </li>
     * <li> <p> <code>ramdisk-id</code> - The RAM disk ID.</p> </li> <li> <p>
     * <code>reason</code> - The reason for the current state of the instance (for
     * example, shows "User Initiated [date]" when you stop or terminate the instance).
     * Similar to the state-reason-code filter.</p> </li> <li> <p>
     * <code>requester-id</code> - The ID of the entity that launched the instance on
     * your behalf (for example, Amazon Web Services Management Console, Auto Scaling,
     * and so on).</p> </li> <li> <p> <code>reservation-id</code> - The ID of the
     * instance's reservation. A reservation ID is created any time you launch an
     * instance. A reservation ID has a one-to-one relationship with an instance launch
     * request, but can be associated with more than one instance if you launch
     * multiple instances using the same launch request. For example, if you launch one
     * instance, you get one reservation ID. If you launch ten instances using the same
     * launch request, you also get one reservation ID.</p> </li> <li> <p>
     * <code>root-device-name</code> - The device name of the root device volume (for
     * example, <code>/dev/sda1</code>).</p> </li> <li> <p>
     * <code>root-device-type</code> - The type of the root device volume
     * (<code>ebs</code> | <code>instance-store</code>).</p> </li> <li> <p>
     * <code>source-dest-check</code> - Indicates whether the instance performs
     * source/destination checking. A value of <code>true</code> means that checking is
     * enabled, and <code>false</code> means that checking is disabled. The value must
     * be <code>false</code> for the instance to perform network address translation
     * (NAT) in your VPC. </p> </li> <li> <p> <code>spot-instance-request-id</code> -
     * The ID of the Spot Instance request.</p> </li> <li> <p>
     * <code>state-reason-code</code> - The reason code for the state change.</p> </li>
     * <li> <p> <code>state-reason-message</code> - A message that describes the state
     * change.</p> </li> <li> <p> <code>subnet-id</code> - The ID of the subnet for the
     * instance.</p> </li> <li> <p> <code>tag:&lt;key&gt;</code> - The key/value
     * combination of a tag assigned to the resource. Use the tag key in the filter
     * name and the tag value as the filter value. For example, to find all resources
     * that have a tag with the key <code>Owner</code> and the value
     * <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and
     * <code>TeamA</code> for the filter value.</p> </li> <li> <p> <code>tag-key</code>
     * - The key of a tag assigned to the resource. Use this filter to find all
     * resources that have a tag with a specific key, regardless of the tag value.</p>
     * </li> <li> <p> <code>tenancy</code> - The tenancy of an instance
     * (<code>dedicated</code> | <code>default</code> | <code>host</code>).</p> </li>
     * <li> <p> <code>tpm-support</code> - Indicates if the instance is configured for
     * NitroTPM support (<code>v2.0</code>). </p> </li> <li> <p>
     * <code>usage-operation</code> - The usage operation value for the instance
     * (<code>RunInstances</code> | <code>RunInstances:00g0</code> |
     * <code>RunInstances:0010</code> | <code>RunInstances:1010</code> |
     * <code>RunInstances:1014</code> | <code>RunInstances:1110</code> |
     * <code>RunInstances:0014</code> | <code>RunInstances:0210</code> |
     * <code>RunInstances:0110</code> | <code>RunInstances:0100</code> |
     * <code>RunInstances:0004</code> | <code>RunInstances:0200</code> |
     * <code>RunInstances:000g</code> | <code>RunInstances:0g00</code> |
     * <code>RunInstances:0002</code> | <code>RunInstances:0800</code> |
     * <code>RunInstances:0102</code> | <code>RunInstances:0006</code> |
     * <code>RunInstances:0202</code>).</p> </li> <li> <p>
     * <code>usage-operation-update-time</code> - The time that the usage operation was
     * last updated, for example, <code>2022-09-15T17:15:20.000Z</code>.</p> </li> <li>
     * <p> <code>virtualization-type</code> - The virtualization type of the instance
     * (<code>paravirtual</code> | <code>hvm</code>).</p> </li> <li> <p>
     * <code>vpc-id</code> - The ID of the VPC that the instance is running in.</p>
     * </li> </ul>
     */
    inline const Aws::Vector<Filter>& GetFilters() const { return m_filters; }
    inline bool FiltersHasBeenSet() const { return m_filtersHasBeenSet; }
    template<typename FiltersT = Aws::Vector<Filter>>
    void SetFilters(FiltersT&& value) { m_filtersHasBeenSet = true; m_filters = std::forward<FiltersT>(value); }
    template<typename FiltersT = Aws::Vector<Filter>>
    DescribeInstancesRequest& WithFilters(FiltersT&& value) { SetFilters(std::forward<FiltersT>(value)); return *this;}
    template<typename FiltersT = Filter>
    DescribeInstancesRequest& AddFilters(FiltersT&& value) { m_filtersHasBeenSet = true; m_filters.emplace_back(std::forward<FiltersT>(value)); return *this; }
    ///@}

    ///@{
    /**
     * <p>The token returned from a previous paginated request. Pagination continues
     * from the end of the items returned by the previous request.</p>
     */
    inline const Aws::String& GetNextToken() const { return m_nextToken; }
    inline bool NextTokenHasBeenSet() const { return m_nextTokenHasBeenSet; }
    template<typename NextTokenT = Aws::String>
    void SetNextToken(NextTokenT&& value) { m_nextTokenHasBeenSet = true; m_nextToken = std::forward<NextTokenT>(value); }
    template<typename NextTokenT = Aws::String>
    DescribeInstancesRequest& WithNextToken(NextTokenT&& value) { SetNextToken(std::forward<NextTokenT>(value)); return *this;}
    ///@}

    ///@{
    /**
     * <p>The maximum number of items to return for this request. To get the next page
     * of items, make another request with the token returned in the output. For more
     * information, see <a
     * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination">Pagination</a>.</p>
     * <p>You cannot specify this parameter and the instance IDs parameter in the same
     * request.</p>
     */
    inline int GetMaxResults() const { return m_maxResults; }
    inline bool MaxResultsHasBeenSet() const { return m_maxResultsHasBeenSet; }
    inline void SetMaxResults(int value) { m_maxResultsHasBeenSet = true; m_maxResults = value; }
    inline DescribeInstancesRequest& WithMaxResults(int value) { SetMaxResults(value); return *this;}
    ///@}
  private:

    Aws::Vector<Aws::String> m_instanceIds;
    bool m_instanceIdsHasBeenSet = false;

    bool m_dryRun{false};
    bool m_dryRunHasBeenSet = false;

    Aws::Vector<Filter> m_filters;
    bool m_filtersHasBeenSet = false;

    Aws::String m_nextToken;
    bool m_nextTokenHasBeenSet = false;

    int m_maxResults{0};
    bool m_maxResultsHasBeenSet = false;
  };

} // namespace Model
} // namespace EC2
} // namespace Aws
