{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.SQS.ReceiveMessage
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Retrieves one or more messages (up to 10), from the specified queue.
-- Using the @WaitTimeSeconds@ parameter enables long-poll support. For
-- more information, see
-- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html Amazon SQS Long Polling>
-- in the /Amazon SQS Developer Guide/.
--
-- Short poll is the default behavior where a weighted random set of
-- machines is sampled on a @ReceiveMessage@ call. Thus, only the messages
-- on the sampled machines are returned. If the number of messages in the
-- queue is small (fewer than 1,000), you most likely get fewer messages
-- than you requested per @ReceiveMessage@ call. If the number of messages
-- in the queue is extremely small, you might not receive any messages in a
-- particular @ReceiveMessage@ response. If this happens, repeat the
-- request.
--
-- For each message returned, the response includes the following:
--
-- -   The message body.
--
-- -   An MD5 digest of the message body. For information about MD5, see
--     <https://www.ietf.org/rfc/rfc1321.txt RFC1321>.
--
-- -   The @MessageId@ you received when you sent the message to the queue.
--
-- -   The receipt handle.
--
-- -   The message attributes.
--
-- -   An MD5 digest of the message attributes.
--
-- The receipt handle is the identifier you must provide when deleting the
-- message. For more information, see
-- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html Queue and Message Identifiers>
-- in the /Amazon SQS Developer Guide/.
--
-- You can provide the @VisibilityTimeout@ parameter in your request. The
-- parameter is applied to the messages that Amazon SQS returns in the
-- response. If you don\'t include the parameter, the overall visibility
-- timeout for the queue is used for the returned messages. For more
-- information, see
-- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html Visibility Timeout>
-- in the /Amazon SQS Developer Guide/.
--
-- A message that isn\'t deleted or a message whose visibility isn\'t
-- extended before the visibility timeout expires counts as a failed
-- receive. Depending on the configuration of the queue, the message might
-- be sent to the dead-letter queue.
--
-- In the future, new attributes might be added. If you write code that
-- calls this action, we recommend that you structure your code so that it
-- can handle new attributes gracefully.
module Amazonka.SQS.ReceiveMessage
  ( -- * Creating a Request
    ReceiveMessage (..),
    newReceiveMessage,

    -- * Request Lenses
    receiveMessage_receiveRequestAttemptId,
    receiveMessage_visibilityTimeout,
    receiveMessage_messageAttributeNames,
    receiveMessage_waitTimeSeconds,
    receiveMessage_attributeNames,
    receiveMessage_maxNumberOfMessages,
    receiveMessage_queueUrl,

    -- * Destructuring the Response
    ReceiveMessageResponse (..),
    newReceiveMessageResponse,

    -- * Response Lenses
    receiveMessageResponse_messages,
    receiveMessageResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.SQS.Types

-- |
--
-- /See:/ 'newReceiveMessage' smart constructor.
data ReceiveMessage = ReceiveMessage'
  { -- | This parameter applies only to FIFO (first-in-first-out) queues.
    --
    -- The token used for deduplication of @ReceiveMessage@ calls. If a
    -- networking issue occurs after a @ReceiveMessage@ action, and instead of
    -- a response you receive a generic error, it is possible to retry the same
    -- action with an identical @ReceiveRequestAttemptId@ to retrieve the same
    -- set of messages, even if their visibility timeout has not yet expired.
    --
    -- -   You can use @ReceiveRequestAttemptId@ only for 5 minutes after a
    --     @ReceiveMessage@ action.
    --
    -- -   When you set @FifoQueue@, a caller of the @ReceiveMessage@ action
    --     can provide a @ReceiveRequestAttemptId@ explicitly.
    --
    -- -   If a caller of the @ReceiveMessage@ action doesn\'t provide a
    --     @ReceiveRequestAttemptId@, Amazon SQS generates a
    --     @ReceiveRequestAttemptId@.
    --
    -- -   It is possible to retry the @ReceiveMessage@ action with the same
    --     @ReceiveRequestAttemptId@ if none of the messages have been modified
    --     (deleted or had their visibility changes).
    --
    -- -   During a visibility timeout, subsequent calls with the same
    --     @ReceiveRequestAttemptId@ return the same messages and receipt
    --     handles. If a retry occurs within the deduplication interval, it
    --     resets the visibility timeout. For more information, see
    --     <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html Visibility Timeout>
    --     in the /Amazon SQS Developer Guide/.
    --
    --     If a caller of the @ReceiveMessage@ action still processes messages
    --     when the visibility timeout expires and messages become visible,
    --     another worker consuming from the same queue can receive the same
    --     messages and therefore process duplicates. Also, if a consumer whose
    --     message processing time is longer than the visibility timeout tries
    --     to delete the processed messages, the action fails with an error.
    --
    --     To mitigate this effect, ensure that your application observes a
    --     safe threshold before the visibility timeout expires and extend the
    --     visibility timeout as necessary.
    --
    -- -   While messages with a particular @MessageGroupId@ are invisible, no
    --     more messages belonging to the same @MessageGroupId@ are returned
    --     until the visibility timeout expires. You can still receive messages
    --     with another @MessageGroupId@ as long as it is also visible.
    --
    -- -   If a caller of @ReceiveMessage@ can\'t track the
    --     @ReceiveRequestAttemptId@, no retries work until the original
    --     visibility timeout expires. As a result, delays might occur but the
    --     messages in the queue remain in a strict order.
    --
    -- The maximum length of @ReceiveRequestAttemptId@ is 128 characters.
    -- @ReceiveRequestAttemptId@ can contain alphanumeric characters (@a-z@,
    -- @A-Z@, @0-9@) and punctuation
    -- (@!\"#$%&\'()*+,-.\/:;\<=>?\@[\\]^_\`{|}~@).
    --
    -- For best practices of using @ReceiveRequestAttemptId@, see
    -- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-receiverequestattemptid-request-parameter.html Using the ReceiveRequestAttemptId Request Parameter>
    -- in the /Amazon SQS Developer Guide/.
    ReceiveMessage -> Maybe Text
receiveRequestAttemptId :: Prelude.Maybe Prelude.Text,
    -- | The duration (in seconds) that the received messages are hidden from
    -- subsequent retrieve requests after being retrieved by a @ReceiveMessage@
    -- request.
    ReceiveMessage -> Maybe Int
visibilityTimeout :: Prelude.Maybe Prelude.Int,
    -- | The name of the message attribute, where /N/ is the index.
    --
    -- -   The name can contain alphanumeric characters and the underscore
    --     (@_@), hyphen (@-@), and period (@.@).
    --
    -- -   The name is case-sensitive and must be unique among all attribute
    --     names for the message.
    --
    -- -   The name must not start with AWS-reserved prefixes such as @AWS.@ or
    --     @Amazon.@ (or any casing variants).
    --
    -- -   The name must not start or end with a period (@.@), and it should
    --     not have periods in succession (@..@).
    --
    -- -   The name can be up to 256 characters long.
    --
    -- When using @ReceiveMessage@, you can send a list of attribute names to
    -- receive, or you can return all of the attributes by specifying @All@ or
    -- @.*@ in your request. You can also use all message attributes starting
    -- with a prefix, for example @bar.*@.
    ReceiveMessage -> Maybe [Text]
messageAttributeNames :: Prelude.Maybe [Prelude.Text],
    -- | The duration (in seconds) for which the call waits for a message to
    -- arrive in the queue before returning. If a message is available, the
    -- call returns sooner than @WaitTimeSeconds@. If no messages are available
    -- and the wait time expires, the call returns successfully with an empty
    -- list of messages.
    --
    -- To avoid HTTP errors, ensure that the HTTP response timeout for
    -- @ReceiveMessage@ requests is longer than the @WaitTimeSeconds@
    -- parameter. For example, with the Java SDK, you can set HTTP transport
    -- settings using the
    -- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html NettyNioAsyncHttpClient>
    -- for asynchronous clients, or the
    -- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html ApacheHttpClient>
    -- for synchronous clients.
    ReceiveMessage -> Maybe Int
waitTimeSeconds :: Prelude.Maybe Prelude.Int,
    -- | A list of attributes that need to be returned along with each message.
    -- These attributes include:
    --
    -- -   @All@ – Returns all values.
    --
    -- -   @ApproximateFirstReceiveTimestamp@ – Returns the time the message
    --     was first received from the queue
    --     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
    --     milliseconds).
    --
    -- -   @ApproximateReceiveCount@ – Returns the number of times a message
    --     has been received across all queues but not deleted.
    --
    -- -   @AWSTraceHeader@ – Returns the X-Ray trace header string.
    --
    -- -   @SenderId@
    --
    --     -   For an IAM user, returns the IAM user ID, for example
    --         @ABCDEFGHI1JKLMNOPQ23R@.
    --
    --     -   For an IAM role, returns the IAM role ID, for example
    --         @ABCDE1F2GH3I4JK5LMNOP:i-a123b456@.
    --
    -- -   @SentTimestamp@ – Returns the time the message was sent to the queue
    --     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
    --     milliseconds).
    --
    -- -   @MessageDeduplicationId@ – Returns the value provided by the
    --     producer that calls the @ SendMessage @ action.
    --
    -- -   @MessageGroupId@ – Returns the value provided by the producer that
    --     calls the @ SendMessage @ action. Messages with the same
    --     @MessageGroupId@ are returned in sequence.
    --
    -- -   @SequenceNumber@ – Returns the value provided by Amazon SQS.
    ReceiveMessage -> Maybe [MessageAttribute]
attributeNames :: Prelude.Maybe [MessageAttribute],
    -- | The maximum number of messages to return. Amazon SQS never returns more
    -- messages than this value (however, fewer messages might be returned).
    -- Valid values: 1 to 10. Default: 1.
    ReceiveMessage -> Maybe Int
maxNumberOfMessages :: Prelude.Maybe Prelude.Int,
    -- | The URL of the Amazon SQS queue from which messages are received.
    --
    -- Queue URLs and names are case-sensitive.
    ReceiveMessage -> Text
queueUrl :: Prelude.Text
  }
  deriving (ReceiveMessage -> ReceiveMessage -> Bool
(ReceiveMessage -> ReceiveMessage -> Bool)
-> (ReceiveMessage -> ReceiveMessage -> Bool) -> Eq ReceiveMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReceiveMessage -> ReceiveMessage -> Bool
$c/= :: ReceiveMessage -> ReceiveMessage -> Bool
== :: ReceiveMessage -> ReceiveMessage -> Bool
$c== :: ReceiveMessage -> ReceiveMessage -> Bool
Prelude.Eq, ReadPrec [ReceiveMessage]
ReadPrec ReceiveMessage
Int -> ReadS ReceiveMessage
ReadS [ReceiveMessage]
(Int -> ReadS ReceiveMessage)
-> ReadS [ReceiveMessage]
-> ReadPrec ReceiveMessage
-> ReadPrec [ReceiveMessage]
-> Read ReceiveMessage
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ReceiveMessage]
$creadListPrec :: ReadPrec [ReceiveMessage]
readPrec :: ReadPrec ReceiveMessage
$creadPrec :: ReadPrec ReceiveMessage
readList :: ReadS [ReceiveMessage]
$creadList :: ReadS [ReceiveMessage]
readsPrec :: Int -> ReadS ReceiveMessage
$creadsPrec :: Int -> ReadS ReceiveMessage
Prelude.Read, Int -> ReceiveMessage -> ShowS
[ReceiveMessage] -> ShowS
ReceiveMessage -> String
(Int -> ReceiveMessage -> ShowS)
-> (ReceiveMessage -> String)
-> ([ReceiveMessage] -> ShowS)
-> Show ReceiveMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReceiveMessage] -> ShowS
$cshowList :: [ReceiveMessage] -> ShowS
show :: ReceiveMessage -> String
$cshow :: ReceiveMessage -> String
showsPrec :: Int -> ReceiveMessage -> ShowS
$cshowsPrec :: Int -> ReceiveMessage -> ShowS
Prelude.Show, (forall x. ReceiveMessage -> Rep ReceiveMessage x)
-> (forall x. Rep ReceiveMessage x -> ReceiveMessage)
-> Generic ReceiveMessage
forall x. Rep ReceiveMessage x -> ReceiveMessage
forall x. ReceiveMessage -> Rep ReceiveMessage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ReceiveMessage x -> ReceiveMessage
$cfrom :: forall x. ReceiveMessage -> Rep ReceiveMessage x
Prelude.Generic)

-- |
-- Create a value of 'ReceiveMessage' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'receiveRequestAttemptId', 'receiveMessage_receiveRequestAttemptId' - This parameter applies only to FIFO (first-in-first-out) queues.
--
-- The token used for deduplication of @ReceiveMessage@ calls. If a
-- networking issue occurs after a @ReceiveMessage@ action, and instead of
-- a response you receive a generic error, it is possible to retry the same
-- action with an identical @ReceiveRequestAttemptId@ to retrieve the same
-- set of messages, even if their visibility timeout has not yet expired.
--
-- -   You can use @ReceiveRequestAttemptId@ only for 5 minutes after a
--     @ReceiveMessage@ action.
--
-- -   When you set @FifoQueue@, a caller of the @ReceiveMessage@ action
--     can provide a @ReceiveRequestAttemptId@ explicitly.
--
-- -   If a caller of the @ReceiveMessage@ action doesn\'t provide a
--     @ReceiveRequestAttemptId@, Amazon SQS generates a
--     @ReceiveRequestAttemptId@.
--
-- -   It is possible to retry the @ReceiveMessage@ action with the same
--     @ReceiveRequestAttemptId@ if none of the messages have been modified
--     (deleted or had their visibility changes).
--
-- -   During a visibility timeout, subsequent calls with the same
--     @ReceiveRequestAttemptId@ return the same messages and receipt
--     handles. If a retry occurs within the deduplication interval, it
--     resets the visibility timeout. For more information, see
--     <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html Visibility Timeout>
--     in the /Amazon SQS Developer Guide/.
--
--     If a caller of the @ReceiveMessage@ action still processes messages
--     when the visibility timeout expires and messages become visible,
--     another worker consuming from the same queue can receive the same
--     messages and therefore process duplicates. Also, if a consumer whose
--     message processing time is longer than the visibility timeout tries
--     to delete the processed messages, the action fails with an error.
--
--     To mitigate this effect, ensure that your application observes a
--     safe threshold before the visibility timeout expires and extend the
--     visibility timeout as necessary.
--
-- -   While messages with a particular @MessageGroupId@ are invisible, no
--     more messages belonging to the same @MessageGroupId@ are returned
--     until the visibility timeout expires. You can still receive messages
--     with another @MessageGroupId@ as long as it is also visible.
--
-- -   If a caller of @ReceiveMessage@ can\'t track the
--     @ReceiveRequestAttemptId@, no retries work until the original
--     visibility timeout expires. As a result, delays might occur but the
--     messages in the queue remain in a strict order.
--
-- The maximum length of @ReceiveRequestAttemptId@ is 128 characters.
-- @ReceiveRequestAttemptId@ can contain alphanumeric characters (@a-z@,
-- @A-Z@, @0-9@) and punctuation
-- (@!\"#$%&\'()*+,-.\/:;\<=>?\@[\\]^_\`{|}~@).
--
-- For best practices of using @ReceiveRequestAttemptId@, see
-- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-receiverequestattemptid-request-parameter.html Using the ReceiveRequestAttemptId Request Parameter>
-- in the /Amazon SQS Developer Guide/.
--
-- 'visibilityTimeout', 'receiveMessage_visibilityTimeout' - The duration (in seconds) that the received messages are hidden from
-- subsequent retrieve requests after being retrieved by a @ReceiveMessage@
-- request.
--
-- 'messageAttributeNames', 'receiveMessage_messageAttributeNames' - The name of the message attribute, where /N/ is the index.
--
-- -   The name can contain alphanumeric characters and the underscore
--     (@_@), hyphen (@-@), and period (@.@).
--
-- -   The name is case-sensitive and must be unique among all attribute
--     names for the message.
--
-- -   The name must not start with AWS-reserved prefixes such as @AWS.@ or
--     @Amazon.@ (or any casing variants).
--
-- -   The name must not start or end with a period (@.@), and it should
--     not have periods in succession (@..@).
--
-- -   The name can be up to 256 characters long.
--
-- When using @ReceiveMessage@, you can send a list of attribute names to
-- receive, or you can return all of the attributes by specifying @All@ or
-- @.*@ in your request. You can also use all message attributes starting
-- with a prefix, for example @bar.*@.
--
-- 'waitTimeSeconds', 'receiveMessage_waitTimeSeconds' - The duration (in seconds) for which the call waits for a message to
-- arrive in the queue before returning. If a message is available, the
-- call returns sooner than @WaitTimeSeconds@. If no messages are available
-- and the wait time expires, the call returns successfully with an empty
-- list of messages.
--
-- To avoid HTTP errors, ensure that the HTTP response timeout for
-- @ReceiveMessage@ requests is longer than the @WaitTimeSeconds@
-- parameter. For example, with the Java SDK, you can set HTTP transport
-- settings using the
-- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html NettyNioAsyncHttpClient>
-- for asynchronous clients, or the
-- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html ApacheHttpClient>
-- for synchronous clients.
--
-- 'attributeNames', 'receiveMessage_attributeNames' - A list of attributes that need to be returned along with each message.
-- These attributes include:
--
-- -   @All@ – Returns all values.
--
-- -   @ApproximateFirstReceiveTimestamp@ – Returns the time the message
--     was first received from the queue
--     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
--     milliseconds).
--
-- -   @ApproximateReceiveCount@ – Returns the number of times a message
--     has been received across all queues but not deleted.
--
-- -   @AWSTraceHeader@ – Returns the X-Ray trace header string.
--
-- -   @SenderId@
--
--     -   For an IAM user, returns the IAM user ID, for example
--         @ABCDEFGHI1JKLMNOPQ23R@.
--
--     -   For an IAM role, returns the IAM role ID, for example
--         @ABCDE1F2GH3I4JK5LMNOP:i-a123b456@.
--
-- -   @SentTimestamp@ – Returns the time the message was sent to the queue
--     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
--     milliseconds).
--
-- -   @MessageDeduplicationId@ – Returns the value provided by the
--     producer that calls the @ SendMessage @ action.
--
-- -   @MessageGroupId@ – Returns the value provided by the producer that
--     calls the @ SendMessage @ action. Messages with the same
--     @MessageGroupId@ are returned in sequence.
--
-- -   @SequenceNumber@ – Returns the value provided by Amazon SQS.
--
-- 'maxNumberOfMessages', 'receiveMessage_maxNumberOfMessages' - The maximum number of messages to return. Amazon SQS never returns more
-- messages than this value (however, fewer messages might be returned).
-- Valid values: 1 to 10. Default: 1.
--
-- 'queueUrl', 'receiveMessage_queueUrl' - The URL of the Amazon SQS queue from which messages are received.
--
-- Queue URLs and names are case-sensitive.
newReceiveMessage ::
  -- | 'queueUrl'
  Prelude.Text ->
  ReceiveMessage
newReceiveMessage :: Text -> ReceiveMessage
newReceiveMessage Text
pQueueUrl_ =
  ReceiveMessage' :: Maybe Text
-> Maybe Int
-> Maybe [Text]
-> Maybe Int
-> Maybe [MessageAttribute]
-> Maybe Int
-> Text
-> ReceiveMessage
ReceiveMessage'
    { $sel:receiveRequestAttemptId:ReceiveMessage' :: Maybe Text
receiveRequestAttemptId =
        Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:visibilityTimeout:ReceiveMessage' :: Maybe Int
visibilityTimeout = Maybe Int
forall a. Maybe a
Prelude.Nothing,
      $sel:messageAttributeNames:ReceiveMessage' :: Maybe [Text]
messageAttributeNames = Maybe [Text]
forall a. Maybe a
Prelude.Nothing,
      $sel:waitTimeSeconds:ReceiveMessage' :: Maybe Int
waitTimeSeconds = Maybe Int
forall a. Maybe a
Prelude.Nothing,
      $sel:attributeNames:ReceiveMessage' :: Maybe [MessageAttribute]
attributeNames = Maybe [MessageAttribute]
forall a. Maybe a
Prelude.Nothing,
      $sel:maxNumberOfMessages:ReceiveMessage' :: Maybe Int
maxNumberOfMessages = Maybe Int
forall a. Maybe a
Prelude.Nothing,
      $sel:queueUrl:ReceiveMessage' :: Text
queueUrl = Text
pQueueUrl_
    }

-- | This parameter applies only to FIFO (first-in-first-out) queues.
--
-- The token used for deduplication of @ReceiveMessage@ calls. If a
-- networking issue occurs after a @ReceiveMessage@ action, and instead of
-- a response you receive a generic error, it is possible to retry the same
-- action with an identical @ReceiveRequestAttemptId@ to retrieve the same
-- set of messages, even if their visibility timeout has not yet expired.
--
-- -   You can use @ReceiveRequestAttemptId@ only for 5 minutes after a
--     @ReceiveMessage@ action.
--
-- -   When you set @FifoQueue@, a caller of the @ReceiveMessage@ action
--     can provide a @ReceiveRequestAttemptId@ explicitly.
--
-- -   If a caller of the @ReceiveMessage@ action doesn\'t provide a
--     @ReceiveRequestAttemptId@, Amazon SQS generates a
--     @ReceiveRequestAttemptId@.
--
-- -   It is possible to retry the @ReceiveMessage@ action with the same
--     @ReceiveRequestAttemptId@ if none of the messages have been modified
--     (deleted or had their visibility changes).
--
-- -   During a visibility timeout, subsequent calls with the same
--     @ReceiveRequestAttemptId@ return the same messages and receipt
--     handles. If a retry occurs within the deduplication interval, it
--     resets the visibility timeout. For more information, see
--     <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html Visibility Timeout>
--     in the /Amazon SQS Developer Guide/.
--
--     If a caller of the @ReceiveMessage@ action still processes messages
--     when the visibility timeout expires and messages become visible,
--     another worker consuming from the same queue can receive the same
--     messages and therefore process duplicates. Also, if a consumer whose
--     message processing time is longer than the visibility timeout tries
--     to delete the processed messages, the action fails with an error.
--
--     To mitigate this effect, ensure that your application observes a
--     safe threshold before the visibility timeout expires and extend the
--     visibility timeout as necessary.
--
-- -   While messages with a particular @MessageGroupId@ are invisible, no
--     more messages belonging to the same @MessageGroupId@ are returned
--     until the visibility timeout expires. You can still receive messages
--     with another @MessageGroupId@ as long as it is also visible.
--
-- -   If a caller of @ReceiveMessage@ can\'t track the
--     @ReceiveRequestAttemptId@, no retries work until the original
--     visibility timeout expires. As a result, delays might occur but the
--     messages in the queue remain in a strict order.
--
-- The maximum length of @ReceiveRequestAttemptId@ is 128 characters.
-- @ReceiveRequestAttemptId@ can contain alphanumeric characters (@a-z@,
-- @A-Z@, @0-9@) and punctuation
-- (@!\"#$%&\'()*+,-.\/:;\<=>?\@[\\]^_\`{|}~@).
--
-- For best practices of using @ReceiveRequestAttemptId@, see
-- <https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-receiverequestattemptid-request-parameter.html Using the ReceiveRequestAttemptId Request Parameter>
-- in the /Amazon SQS Developer Guide/.
receiveMessage_receiveRequestAttemptId :: Lens.Lens' ReceiveMessage (Prelude.Maybe Prelude.Text)
receiveMessage_receiveRequestAttemptId :: (Maybe Text -> f (Maybe Text))
-> ReceiveMessage -> f ReceiveMessage
receiveMessage_receiveRequestAttemptId = (ReceiveMessage -> Maybe Text)
-> (ReceiveMessage -> Maybe Text -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe Text
receiveRequestAttemptId :: Maybe Text
$sel:receiveRequestAttemptId:ReceiveMessage' :: ReceiveMessage -> Maybe Text
receiveRequestAttemptId} -> Maybe Text
receiveRequestAttemptId) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe Text
a -> ReceiveMessage
s {$sel:receiveRequestAttemptId:ReceiveMessage' :: Maybe Text
receiveRequestAttemptId = Maybe Text
a} :: ReceiveMessage)

-- | The duration (in seconds) that the received messages are hidden from
-- subsequent retrieve requests after being retrieved by a @ReceiveMessage@
-- request.
receiveMessage_visibilityTimeout :: Lens.Lens' ReceiveMessage (Prelude.Maybe Prelude.Int)
receiveMessage_visibilityTimeout :: (Maybe Int -> f (Maybe Int)) -> ReceiveMessage -> f ReceiveMessage
receiveMessage_visibilityTimeout = (ReceiveMessage -> Maybe Int)
-> (ReceiveMessage -> Maybe Int -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage (Maybe Int) (Maybe Int)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe Int
visibilityTimeout :: Maybe Int
$sel:visibilityTimeout:ReceiveMessage' :: ReceiveMessage -> Maybe Int
visibilityTimeout} -> Maybe Int
visibilityTimeout) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe Int
a -> ReceiveMessage
s {$sel:visibilityTimeout:ReceiveMessage' :: Maybe Int
visibilityTimeout = Maybe Int
a} :: ReceiveMessage)

-- | The name of the message attribute, where /N/ is the index.
--
-- -   The name can contain alphanumeric characters and the underscore
--     (@_@), hyphen (@-@), and period (@.@).
--
-- -   The name is case-sensitive and must be unique among all attribute
--     names for the message.
--
-- -   The name must not start with AWS-reserved prefixes such as @AWS.@ or
--     @Amazon.@ (or any casing variants).
--
-- -   The name must not start or end with a period (@.@), and it should
--     not have periods in succession (@..@).
--
-- -   The name can be up to 256 characters long.
--
-- When using @ReceiveMessage@, you can send a list of attribute names to
-- receive, or you can return all of the attributes by specifying @All@ or
-- @.*@ in your request. You can also use all message attributes starting
-- with a prefix, for example @bar.*@.
receiveMessage_messageAttributeNames :: Lens.Lens' ReceiveMessage (Prelude.Maybe [Prelude.Text])
receiveMessage_messageAttributeNames :: (Maybe [Text] -> f (Maybe [Text]))
-> ReceiveMessage -> f ReceiveMessage
receiveMessage_messageAttributeNames = (ReceiveMessage -> Maybe [Text])
-> (ReceiveMessage -> Maybe [Text] -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage (Maybe [Text]) (Maybe [Text])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe [Text]
messageAttributeNames :: Maybe [Text]
$sel:messageAttributeNames:ReceiveMessage' :: ReceiveMessage -> Maybe [Text]
messageAttributeNames} -> Maybe [Text]
messageAttributeNames) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe [Text]
a -> ReceiveMessage
s {$sel:messageAttributeNames:ReceiveMessage' :: Maybe [Text]
messageAttributeNames = Maybe [Text]
a} :: ReceiveMessage) ((Maybe [Text] -> f (Maybe [Text]))
 -> ReceiveMessage -> f ReceiveMessage)
-> ((Maybe [Text] -> f (Maybe [Text]))
    -> Maybe [Text] -> f (Maybe [Text]))
-> (Maybe [Text] -> f (Maybe [Text]))
-> ReceiveMessage
-> f ReceiveMessage
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso [Text] [Text] [Text] [Text]
-> Iso (Maybe [Text]) (Maybe [Text]) (Maybe [Text]) (Maybe [Text])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso [Text] [Text] [Text] [Text]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The duration (in seconds) for which the call waits for a message to
-- arrive in the queue before returning. If a message is available, the
-- call returns sooner than @WaitTimeSeconds@. If no messages are available
-- and the wait time expires, the call returns successfully with an empty
-- list of messages.
--
-- To avoid HTTP errors, ensure that the HTTP response timeout for
-- @ReceiveMessage@ requests is longer than the @WaitTimeSeconds@
-- parameter. For example, with the Java SDK, you can set HTTP transport
-- settings using the
-- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html NettyNioAsyncHttpClient>
-- for asynchronous clients, or the
-- <https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html ApacheHttpClient>
-- for synchronous clients.
receiveMessage_waitTimeSeconds :: Lens.Lens' ReceiveMessage (Prelude.Maybe Prelude.Int)
receiveMessage_waitTimeSeconds :: (Maybe Int -> f (Maybe Int)) -> ReceiveMessage -> f ReceiveMessage
receiveMessage_waitTimeSeconds = (ReceiveMessage -> Maybe Int)
-> (ReceiveMessage -> Maybe Int -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage (Maybe Int) (Maybe Int)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe Int
waitTimeSeconds :: Maybe Int
$sel:waitTimeSeconds:ReceiveMessage' :: ReceiveMessage -> Maybe Int
waitTimeSeconds} -> Maybe Int
waitTimeSeconds) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe Int
a -> ReceiveMessage
s {$sel:waitTimeSeconds:ReceiveMessage' :: Maybe Int
waitTimeSeconds = Maybe Int
a} :: ReceiveMessage)

-- | A list of attributes that need to be returned along with each message.
-- These attributes include:
--
-- -   @All@ – Returns all values.
--
-- -   @ApproximateFirstReceiveTimestamp@ – Returns the time the message
--     was first received from the queue
--     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
--     milliseconds).
--
-- -   @ApproximateReceiveCount@ – Returns the number of times a message
--     has been received across all queues but not deleted.
--
-- -   @AWSTraceHeader@ – Returns the X-Ray trace header string.
--
-- -   @SenderId@
--
--     -   For an IAM user, returns the IAM user ID, for example
--         @ABCDEFGHI1JKLMNOPQ23R@.
--
--     -   For an IAM role, returns the IAM role ID, for example
--         @ABCDE1F2GH3I4JK5LMNOP:i-a123b456@.
--
-- -   @SentTimestamp@ – Returns the time the message was sent to the queue
--     (<http://en.wikipedia.org/wiki/Unix_time epoch time> in
--     milliseconds).
--
-- -   @MessageDeduplicationId@ – Returns the value provided by the
--     producer that calls the @ SendMessage @ action.
--
-- -   @MessageGroupId@ – Returns the value provided by the producer that
--     calls the @ SendMessage @ action. Messages with the same
--     @MessageGroupId@ are returned in sequence.
--
-- -   @SequenceNumber@ – Returns the value provided by Amazon SQS.
receiveMessage_attributeNames :: Lens.Lens' ReceiveMessage (Prelude.Maybe [MessageAttribute])
receiveMessage_attributeNames :: (Maybe [MessageAttribute] -> f (Maybe [MessageAttribute]))
-> ReceiveMessage -> f ReceiveMessage
receiveMessage_attributeNames = (ReceiveMessage -> Maybe [MessageAttribute])
-> (ReceiveMessage -> Maybe [MessageAttribute] -> ReceiveMessage)
-> Lens
     ReceiveMessage
     ReceiveMessage
     (Maybe [MessageAttribute])
     (Maybe [MessageAttribute])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe [MessageAttribute]
attributeNames :: Maybe [MessageAttribute]
$sel:attributeNames:ReceiveMessage' :: ReceiveMessage -> Maybe [MessageAttribute]
attributeNames} -> Maybe [MessageAttribute]
attributeNames) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe [MessageAttribute]
a -> ReceiveMessage
s {$sel:attributeNames:ReceiveMessage' :: Maybe [MessageAttribute]
attributeNames = Maybe [MessageAttribute]
a} :: ReceiveMessage) ((Maybe [MessageAttribute] -> f (Maybe [MessageAttribute]))
 -> ReceiveMessage -> f ReceiveMessage)
-> ((Maybe [MessageAttribute] -> f (Maybe [MessageAttribute]))
    -> Maybe [MessageAttribute] -> f (Maybe [MessageAttribute]))
-> (Maybe [MessageAttribute] -> f (Maybe [MessageAttribute]))
-> ReceiveMessage
-> f ReceiveMessage
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  [MessageAttribute]
  [MessageAttribute]
  [MessageAttribute]
  [MessageAttribute]
-> Iso
     (Maybe [MessageAttribute])
     (Maybe [MessageAttribute])
     (Maybe [MessageAttribute])
     (Maybe [MessageAttribute])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  [MessageAttribute]
  [MessageAttribute]
  [MessageAttribute]
  [MessageAttribute]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The maximum number of messages to return. Amazon SQS never returns more
-- messages than this value (however, fewer messages might be returned).
-- Valid values: 1 to 10. Default: 1.
receiveMessage_maxNumberOfMessages :: Lens.Lens' ReceiveMessage (Prelude.Maybe Prelude.Int)
receiveMessage_maxNumberOfMessages :: (Maybe Int -> f (Maybe Int)) -> ReceiveMessage -> f ReceiveMessage
receiveMessage_maxNumberOfMessages = (ReceiveMessage -> Maybe Int)
-> (ReceiveMessage -> Maybe Int -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage (Maybe Int) (Maybe Int)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Maybe Int
maxNumberOfMessages :: Maybe Int
$sel:maxNumberOfMessages:ReceiveMessage' :: ReceiveMessage -> Maybe Int
maxNumberOfMessages} -> Maybe Int
maxNumberOfMessages) (\s :: ReceiveMessage
s@ReceiveMessage' {} Maybe Int
a -> ReceiveMessage
s {$sel:maxNumberOfMessages:ReceiveMessage' :: Maybe Int
maxNumberOfMessages = Maybe Int
a} :: ReceiveMessage)

-- | The URL of the Amazon SQS queue from which messages are received.
--
-- Queue URLs and names are case-sensitive.
receiveMessage_queueUrl :: Lens.Lens' ReceiveMessage Prelude.Text
receiveMessage_queueUrl :: (Text -> f Text) -> ReceiveMessage -> f ReceiveMessage
receiveMessage_queueUrl = (ReceiveMessage -> Text)
-> (ReceiveMessage -> Text -> ReceiveMessage)
-> Lens ReceiveMessage ReceiveMessage Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessage' {Text
queueUrl :: Text
$sel:queueUrl:ReceiveMessage' :: ReceiveMessage -> Text
queueUrl} -> Text
queueUrl) (\s :: ReceiveMessage
s@ReceiveMessage' {} Text
a -> ReceiveMessage
s {$sel:queueUrl:ReceiveMessage' :: Text
queueUrl = Text
a} :: ReceiveMessage)

instance Core.AWSRequest ReceiveMessage where
  type
    AWSResponse ReceiveMessage =
      ReceiveMessageResponse
  request :: ReceiveMessage -> Request ReceiveMessage
request = Service -> ReceiveMessage -> Request ReceiveMessage
forall a. ToRequest a => Service -> a -> Request a
Request.postQuery Service
defaultService
  response :: Logger
-> Service
-> Proxy ReceiveMessage
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse ReceiveMessage)))
response =
    Text
-> (Int
    -> ResponseHeaders
    -> [Node]
    -> Either String (AWSResponse ReceiveMessage))
-> Logger
-> Service
-> Proxy ReceiveMessage
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse ReceiveMessage)))
forall (m :: * -> *) a.
MonadResource m =>
Text
-> (Int
    -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> Logger
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXMLWrapper
      Text
"ReceiveMessageResult"
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe [Message] -> Int -> ReceiveMessageResponse
ReceiveMessageResponse'
            (Maybe [Message] -> Int -> ReceiveMessageResponse)
-> Either String (Maybe [Message])
-> Either String (Int -> ReceiveMessageResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (([Node] -> Either String [Message])
-> [Node] -> Either String (Maybe [Message])
forall (f :: * -> *) a b.
Applicative f =>
([a] -> f b) -> [a] -> f (Maybe b)
Core.may (Text -> [Node] -> Either String [Message]
forall a. FromXML a => Text -> [Node] -> Either String [a]
Core.parseXMLList Text
"Message") [Node]
x)
            Either String (Int -> ReceiveMessageResponse)
-> Either String Int -> Either String ReceiveMessageResponse
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Int -> Either String Int
forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (Int -> Int
forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable ReceiveMessage

instance Prelude.NFData ReceiveMessage

instance Core.ToHeaders ReceiveMessage where
  toHeaders :: ReceiveMessage -> ResponseHeaders
toHeaders = ResponseHeaders -> ReceiveMessage -> ResponseHeaders
forall a b. a -> b -> a
Prelude.const ResponseHeaders
forall a. Monoid a => a
Prelude.mempty

instance Core.ToPath ReceiveMessage where
  toPath :: ReceiveMessage -> ByteString
toPath = ByteString -> ReceiveMessage -> ByteString
forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Core.ToQuery ReceiveMessage where
  toQuery :: ReceiveMessage -> QueryString
toQuery ReceiveMessage' {Maybe Int
Maybe [Text]
Maybe [MessageAttribute]
Maybe Text
Text
queueUrl :: Text
maxNumberOfMessages :: Maybe Int
attributeNames :: Maybe [MessageAttribute]
waitTimeSeconds :: Maybe Int
messageAttributeNames :: Maybe [Text]
visibilityTimeout :: Maybe Int
receiveRequestAttemptId :: Maybe Text
$sel:queueUrl:ReceiveMessage' :: ReceiveMessage -> Text
$sel:maxNumberOfMessages:ReceiveMessage' :: ReceiveMessage -> Maybe Int
$sel:attributeNames:ReceiveMessage' :: ReceiveMessage -> Maybe [MessageAttribute]
$sel:waitTimeSeconds:ReceiveMessage' :: ReceiveMessage -> Maybe Int
$sel:messageAttributeNames:ReceiveMessage' :: ReceiveMessage -> Maybe [Text]
$sel:visibilityTimeout:ReceiveMessage' :: ReceiveMessage -> Maybe Int
$sel:receiveRequestAttemptId:ReceiveMessage' :: ReceiveMessage -> Maybe Text
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: (ByteString
"ReceiveMessage" :: Prelude.ByteString),
        ByteString
"Version"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: (ByteString
"2012-11-05" :: Prelude.ByteString),
        ByteString
"ReceiveRequestAttemptId"
          ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
receiveRequestAttemptId,
        ByteString
"VisibilityTimeout" ByteString -> Maybe Int -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Int
visibilityTimeout,
        Maybe QueryString -> QueryString
forall a. ToQuery a => a -> QueryString
Core.toQuery
          ( ByteString -> [Text] -> QueryString
forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Core.toQueryList ByteString
"MessageAttributeName"
              ([Text] -> QueryString) -> Maybe [Text] -> Maybe QueryString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [Text]
messageAttributeNames
          ),
        ByteString
"WaitTimeSeconds" ByteString -> Maybe Int -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Int
waitTimeSeconds,
        Maybe QueryString -> QueryString
forall a. ToQuery a => a -> QueryString
Core.toQuery
          ( ByteString -> [MessageAttribute] -> QueryString
forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Core.toQueryList ByteString
"AttributeName"
              ([MessageAttribute] -> QueryString)
-> Maybe [MessageAttribute] -> Maybe QueryString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [MessageAttribute]
attributeNames
          ),
        ByteString
"MaxNumberOfMessages" ByteString -> Maybe Int -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Int
maxNumberOfMessages,
        ByteString
"QueueUrl" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Text
queueUrl
      ]

-- | A list of received messages.
--
-- /See:/ 'newReceiveMessageResponse' smart constructor.
data ReceiveMessageResponse = ReceiveMessageResponse'
  { -- | A list of messages.
    ReceiveMessageResponse -> Maybe [Message]
messages :: Prelude.Maybe [Message],
    -- | The response's http status code.
    ReceiveMessageResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (ReceiveMessageResponse -> ReceiveMessageResponse -> Bool
(ReceiveMessageResponse -> ReceiveMessageResponse -> Bool)
-> (ReceiveMessageResponse -> ReceiveMessageResponse -> Bool)
-> Eq ReceiveMessageResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReceiveMessageResponse -> ReceiveMessageResponse -> Bool
$c/= :: ReceiveMessageResponse -> ReceiveMessageResponse -> Bool
== :: ReceiveMessageResponse -> ReceiveMessageResponse -> Bool
$c== :: ReceiveMessageResponse -> ReceiveMessageResponse -> Bool
Prelude.Eq, ReadPrec [ReceiveMessageResponse]
ReadPrec ReceiveMessageResponse
Int -> ReadS ReceiveMessageResponse
ReadS [ReceiveMessageResponse]
(Int -> ReadS ReceiveMessageResponse)
-> ReadS [ReceiveMessageResponse]
-> ReadPrec ReceiveMessageResponse
-> ReadPrec [ReceiveMessageResponse]
-> Read ReceiveMessageResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ReceiveMessageResponse]
$creadListPrec :: ReadPrec [ReceiveMessageResponse]
readPrec :: ReadPrec ReceiveMessageResponse
$creadPrec :: ReadPrec ReceiveMessageResponse
readList :: ReadS [ReceiveMessageResponse]
$creadList :: ReadS [ReceiveMessageResponse]
readsPrec :: Int -> ReadS ReceiveMessageResponse
$creadsPrec :: Int -> ReadS ReceiveMessageResponse
Prelude.Read, Int -> ReceiveMessageResponse -> ShowS
[ReceiveMessageResponse] -> ShowS
ReceiveMessageResponse -> String
(Int -> ReceiveMessageResponse -> ShowS)
-> (ReceiveMessageResponse -> String)
-> ([ReceiveMessageResponse] -> ShowS)
-> Show ReceiveMessageResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReceiveMessageResponse] -> ShowS
$cshowList :: [ReceiveMessageResponse] -> ShowS
show :: ReceiveMessageResponse -> String
$cshow :: ReceiveMessageResponse -> String
showsPrec :: Int -> ReceiveMessageResponse -> ShowS
$cshowsPrec :: Int -> ReceiveMessageResponse -> ShowS
Prelude.Show, (forall x. ReceiveMessageResponse -> Rep ReceiveMessageResponse x)
-> (forall x.
    Rep ReceiveMessageResponse x -> ReceiveMessageResponse)
-> Generic ReceiveMessageResponse
forall x. Rep ReceiveMessageResponse x -> ReceiveMessageResponse
forall x. ReceiveMessageResponse -> Rep ReceiveMessageResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ReceiveMessageResponse x -> ReceiveMessageResponse
$cfrom :: forall x. ReceiveMessageResponse -> Rep ReceiveMessageResponse x
Prelude.Generic)

-- |
-- Create a value of 'ReceiveMessageResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'messages', 'receiveMessageResponse_messages' - A list of messages.
--
-- 'httpStatus', 'receiveMessageResponse_httpStatus' - The response's http status code.
newReceiveMessageResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  ReceiveMessageResponse
newReceiveMessageResponse :: Int -> ReceiveMessageResponse
newReceiveMessageResponse Int
pHttpStatus_ =
  ReceiveMessageResponse' :: Maybe [Message] -> Int -> ReceiveMessageResponse
ReceiveMessageResponse'
    { $sel:messages:ReceiveMessageResponse' :: Maybe [Message]
messages = Maybe [Message]
forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:ReceiveMessageResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A list of messages.
receiveMessageResponse_messages :: Lens.Lens' ReceiveMessageResponse (Prelude.Maybe [Message])
receiveMessageResponse_messages :: (Maybe [Message] -> f (Maybe [Message]))
-> ReceiveMessageResponse -> f ReceiveMessageResponse
receiveMessageResponse_messages = (ReceiveMessageResponse -> Maybe [Message])
-> (ReceiveMessageResponse
    -> Maybe [Message] -> ReceiveMessageResponse)
-> Lens
     ReceiveMessageResponse
     ReceiveMessageResponse
     (Maybe [Message])
     (Maybe [Message])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessageResponse' {Maybe [Message]
messages :: Maybe [Message]
$sel:messages:ReceiveMessageResponse' :: ReceiveMessageResponse -> Maybe [Message]
messages} -> Maybe [Message]
messages) (\s :: ReceiveMessageResponse
s@ReceiveMessageResponse' {} Maybe [Message]
a -> ReceiveMessageResponse
s {$sel:messages:ReceiveMessageResponse' :: Maybe [Message]
messages = Maybe [Message]
a} :: ReceiveMessageResponse) ((Maybe [Message] -> f (Maybe [Message]))
 -> ReceiveMessageResponse -> f ReceiveMessageResponse)
-> ((Maybe [Message] -> f (Maybe [Message]))
    -> Maybe [Message] -> f (Maybe [Message]))
-> (Maybe [Message] -> f (Maybe [Message]))
-> ReceiveMessageResponse
-> f ReceiveMessageResponse
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso [Message] [Message] [Message] [Message]
-> Iso
     (Maybe [Message])
     (Maybe [Message])
     (Maybe [Message])
     (Maybe [Message])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso [Message] [Message] [Message] [Message]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The response's http status code.
receiveMessageResponse_httpStatus :: Lens.Lens' ReceiveMessageResponse Prelude.Int
receiveMessageResponse_httpStatus :: (Int -> f Int)
-> ReceiveMessageResponse -> f ReceiveMessageResponse
receiveMessageResponse_httpStatus = (ReceiveMessageResponse -> Int)
-> (ReceiveMessageResponse -> Int -> ReceiveMessageResponse)
-> Lens ReceiveMessageResponse ReceiveMessageResponse Int Int
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReceiveMessageResponse' {Int
httpStatus :: Int
$sel:httpStatus:ReceiveMessageResponse' :: ReceiveMessageResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: ReceiveMessageResponse
s@ReceiveMessageResponse' {} Int
a -> ReceiveMessageResponse
s {$sel:httpStatus:ReceiveMessageResponse' :: Int
httpStatus = Int
a} :: ReceiveMessageResponse)

instance Prelude.NFData ReceiveMessageResponse