{-# 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.Kinesis.RegisterStreamConsumer
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Registers a consumer with a Kinesis data stream. When you use this
-- operation, the consumer you register can then call SubscribeToShard to
-- receive data from the stream using enhanced fan-out, at a rate of up to
-- 2 MiB per second for every shard you subscribe to. This rate is
-- unaffected by the total number of consumers that read from the same
-- stream.
--
-- You can register up to 20 consumers per stream. A given consumer can
-- only be registered with one stream at a time.
--
-- For an example of how to use this operations, see
-- </streams/latest/dev/building-enhanced-consumers-api.html Enhanced Fan-Out Using the Kinesis Data Streams API>.
--
-- The use of this operation has a limit of five transactions per second
-- per account. Also, only 5 consumers can be created simultaneously. In
-- other words, you cannot have more than 5 consumers in a @CREATING@
-- status at the same time. Registering a 6th consumer while there are 5 in
-- a @CREATING@ status results in a @LimitExceededException@.
module Amazonka.Kinesis.RegisterStreamConsumer
  ( -- * Creating a Request
    RegisterStreamConsumer (..),
    newRegisterStreamConsumer,

    -- * Request Lenses
    registerStreamConsumer_streamARN,
    registerStreamConsumer_consumerName,

    -- * Destructuring the Response
    RegisterStreamConsumerResponse (..),
    newRegisterStreamConsumerResponse,

    -- * Response Lenses
    registerStreamConsumerResponse_httpStatus,
    registerStreamConsumerResponse_consumer,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.Kinesis.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newRegisterStreamConsumer' smart constructor.
data RegisterStreamConsumer = RegisterStreamConsumer'
  { -- | The ARN of the Kinesis data stream that you want to register the
    -- consumer with. For more info, see
    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kinesis-streams Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces>.
    RegisterStreamConsumer -> Text
streamARN :: Prelude.Text,
    -- | For a given Kinesis data stream, each consumer must have a unique name.
    -- However, consumer names don\'t have to be unique across data streams.
    RegisterStreamConsumer -> Text
consumerName :: Prelude.Text
  }
  deriving (RegisterStreamConsumer -> RegisterStreamConsumer -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegisterStreamConsumer -> RegisterStreamConsumer -> Bool
$c/= :: RegisterStreamConsumer -> RegisterStreamConsumer -> Bool
== :: RegisterStreamConsumer -> RegisterStreamConsumer -> Bool
$c== :: RegisterStreamConsumer -> RegisterStreamConsumer -> Bool
Prelude.Eq, ReadPrec [RegisterStreamConsumer]
ReadPrec RegisterStreamConsumer
Int -> ReadS RegisterStreamConsumer
ReadS [RegisterStreamConsumer]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RegisterStreamConsumer]
$creadListPrec :: ReadPrec [RegisterStreamConsumer]
readPrec :: ReadPrec RegisterStreamConsumer
$creadPrec :: ReadPrec RegisterStreamConsumer
readList :: ReadS [RegisterStreamConsumer]
$creadList :: ReadS [RegisterStreamConsumer]
readsPrec :: Int -> ReadS RegisterStreamConsumer
$creadsPrec :: Int -> ReadS RegisterStreamConsumer
Prelude.Read, Int -> RegisterStreamConsumer -> ShowS
[RegisterStreamConsumer] -> ShowS
RegisterStreamConsumer -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterStreamConsumer] -> ShowS
$cshowList :: [RegisterStreamConsumer] -> ShowS
show :: RegisterStreamConsumer -> String
$cshow :: RegisterStreamConsumer -> String
showsPrec :: Int -> RegisterStreamConsumer -> ShowS
$cshowsPrec :: Int -> RegisterStreamConsumer -> ShowS
Prelude.Show, forall x. Rep RegisterStreamConsumer x -> RegisterStreamConsumer
forall x. RegisterStreamConsumer -> Rep RegisterStreamConsumer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RegisterStreamConsumer x -> RegisterStreamConsumer
$cfrom :: forall x. RegisterStreamConsumer -> Rep RegisterStreamConsumer x
Prelude.Generic)

-- |
-- Create a value of 'RegisterStreamConsumer' 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:
--
-- 'streamARN', 'registerStreamConsumer_streamARN' - The ARN of the Kinesis data stream that you want to register the
-- consumer with. For more info, see
-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kinesis-streams Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces>.
--
-- 'consumerName', 'registerStreamConsumer_consumerName' - For a given Kinesis data stream, each consumer must have a unique name.
-- However, consumer names don\'t have to be unique across data streams.
newRegisterStreamConsumer ::
  -- | 'streamARN'
  Prelude.Text ->
  -- | 'consumerName'
  Prelude.Text ->
  RegisterStreamConsumer
newRegisterStreamConsumer :: Text -> Text -> RegisterStreamConsumer
newRegisterStreamConsumer Text
pStreamARN_ Text
pConsumerName_ =
  RegisterStreamConsumer'
    { $sel:streamARN:RegisterStreamConsumer' :: Text
streamARN = Text
pStreamARN_,
      $sel:consumerName:RegisterStreamConsumer' :: Text
consumerName = Text
pConsumerName_
    }

-- | The ARN of the Kinesis data stream that you want to register the
-- consumer with. For more info, see
-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kinesis-streams Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces>.
registerStreamConsumer_streamARN :: Lens.Lens' RegisterStreamConsumer Prelude.Text
registerStreamConsumer_streamARN :: Lens' RegisterStreamConsumer Text
registerStreamConsumer_streamARN = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterStreamConsumer' {Text
streamARN :: Text
$sel:streamARN:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
streamARN} -> Text
streamARN) (\s :: RegisterStreamConsumer
s@RegisterStreamConsumer' {} Text
a -> RegisterStreamConsumer
s {$sel:streamARN:RegisterStreamConsumer' :: Text
streamARN = Text
a} :: RegisterStreamConsumer)

-- | For a given Kinesis data stream, each consumer must have a unique name.
-- However, consumer names don\'t have to be unique across data streams.
registerStreamConsumer_consumerName :: Lens.Lens' RegisterStreamConsumer Prelude.Text
registerStreamConsumer_consumerName :: Lens' RegisterStreamConsumer Text
registerStreamConsumer_consumerName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterStreamConsumer' {Text
consumerName :: Text
$sel:consumerName:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
consumerName} -> Text
consumerName) (\s :: RegisterStreamConsumer
s@RegisterStreamConsumer' {} Text
a -> RegisterStreamConsumer
s {$sel:consumerName:RegisterStreamConsumer' :: Text
consumerName = Text
a} :: RegisterStreamConsumer)

instance Core.AWSRequest RegisterStreamConsumer where
  type
    AWSResponse RegisterStreamConsumer =
      RegisterStreamConsumerResponse
  request :: (Service -> Service)
-> RegisterStreamConsumer -> Request RegisterStreamConsumer
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy RegisterStreamConsumer
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse RegisterStreamConsumer)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Int -> Consumer -> RegisterStreamConsumerResponse
RegisterStreamConsumerResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"Consumer")
      )

instance Prelude.Hashable RegisterStreamConsumer where
  hashWithSalt :: Int -> RegisterStreamConsumer -> Int
hashWithSalt Int
_salt RegisterStreamConsumer' {Text
consumerName :: Text
streamARN :: Text
$sel:consumerName:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
$sel:streamARN:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
streamARN
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
consumerName

instance Prelude.NFData RegisterStreamConsumer where
  rnf :: RegisterStreamConsumer -> ()
rnf RegisterStreamConsumer' {Text
consumerName :: Text
streamARN :: Text
$sel:consumerName:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
$sel:streamARN:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
streamARN
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
consumerName

instance Data.ToHeaders RegisterStreamConsumer where
  toHeaders :: RegisterStreamConsumer -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"Kinesis_20131202.RegisterStreamConsumer" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON RegisterStreamConsumer where
  toJSON :: RegisterStreamConsumer -> Value
toJSON RegisterStreamConsumer' {Text
consumerName :: Text
streamARN :: Text
$sel:consumerName:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
$sel:streamARN:RegisterStreamConsumer' :: RegisterStreamConsumer -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"StreamARN" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
streamARN),
            forall a. a -> Maybe a
Prelude.Just (Key
"ConsumerName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
consumerName)
          ]
      )

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

instance Data.ToQuery RegisterStreamConsumer where
  toQuery :: RegisterStreamConsumer -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newRegisterStreamConsumerResponse' smart constructor.
data RegisterStreamConsumerResponse = RegisterStreamConsumerResponse'
  { -- | The response's http status code.
    RegisterStreamConsumerResponse -> Int
httpStatus :: Prelude.Int,
    -- | An object that represents the details of the consumer you registered.
    -- When you register a consumer, it gets an ARN that is generated by
    -- Kinesis Data Streams.
    RegisterStreamConsumerResponse -> Consumer
consumer :: Consumer
  }
  deriving (RegisterStreamConsumerResponse
-> RegisterStreamConsumerResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegisterStreamConsumerResponse
-> RegisterStreamConsumerResponse -> Bool
$c/= :: RegisterStreamConsumerResponse
-> RegisterStreamConsumerResponse -> Bool
== :: RegisterStreamConsumerResponse
-> RegisterStreamConsumerResponse -> Bool
$c== :: RegisterStreamConsumerResponse
-> RegisterStreamConsumerResponse -> Bool
Prelude.Eq, ReadPrec [RegisterStreamConsumerResponse]
ReadPrec RegisterStreamConsumerResponse
Int -> ReadS RegisterStreamConsumerResponse
ReadS [RegisterStreamConsumerResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RegisterStreamConsumerResponse]
$creadListPrec :: ReadPrec [RegisterStreamConsumerResponse]
readPrec :: ReadPrec RegisterStreamConsumerResponse
$creadPrec :: ReadPrec RegisterStreamConsumerResponse
readList :: ReadS [RegisterStreamConsumerResponse]
$creadList :: ReadS [RegisterStreamConsumerResponse]
readsPrec :: Int -> ReadS RegisterStreamConsumerResponse
$creadsPrec :: Int -> ReadS RegisterStreamConsumerResponse
Prelude.Read, Int -> RegisterStreamConsumerResponse -> ShowS
[RegisterStreamConsumerResponse] -> ShowS
RegisterStreamConsumerResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterStreamConsumerResponse] -> ShowS
$cshowList :: [RegisterStreamConsumerResponse] -> ShowS
show :: RegisterStreamConsumerResponse -> String
$cshow :: RegisterStreamConsumerResponse -> String
showsPrec :: Int -> RegisterStreamConsumerResponse -> ShowS
$cshowsPrec :: Int -> RegisterStreamConsumerResponse -> ShowS
Prelude.Show, forall x.
Rep RegisterStreamConsumerResponse x
-> RegisterStreamConsumerResponse
forall x.
RegisterStreamConsumerResponse
-> Rep RegisterStreamConsumerResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep RegisterStreamConsumerResponse x
-> RegisterStreamConsumerResponse
$cfrom :: forall x.
RegisterStreamConsumerResponse
-> Rep RegisterStreamConsumerResponse x
Prelude.Generic)

-- |
-- Create a value of 'RegisterStreamConsumerResponse' 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:
--
-- 'httpStatus', 'registerStreamConsumerResponse_httpStatus' - The response's http status code.
--
-- 'consumer', 'registerStreamConsumerResponse_consumer' - An object that represents the details of the consumer you registered.
-- When you register a consumer, it gets an ARN that is generated by
-- Kinesis Data Streams.
newRegisterStreamConsumerResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'consumer'
  Consumer ->
  RegisterStreamConsumerResponse
newRegisterStreamConsumerResponse :: Int -> Consumer -> RegisterStreamConsumerResponse
newRegisterStreamConsumerResponse
  Int
pHttpStatus_
  Consumer
pConsumer_ =
    RegisterStreamConsumerResponse'
      { $sel:httpStatus:RegisterStreamConsumerResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:consumer:RegisterStreamConsumerResponse' :: Consumer
consumer = Consumer
pConsumer_
      }

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

-- | An object that represents the details of the consumer you registered.
-- When you register a consumer, it gets an ARN that is generated by
-- Kinesis Data Streams.
registerStreamConsumerResponse_consumer :: Lens.Lens' RegisterStreamConsumerResponse Consumer
registerStreamConsumerResponse_consumer :: Lens' RegisterStreamConsumerResponse Consumer
registerStreamConsumerResponse_consumer = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterStreamConsumerResponse' {Consumer
consumer :: Consumer
$sel:consumer:RegisterStreamConsumerResponse' :: RegisterStreamConsumerResponse -> Consumer
consumer} -> Consumer
consumer) (\s :: RegisterStreamConsumerResponse
s@RegisterStreamConsumerResponse' {} Consumer
a -> RegisterStreamConsumerResponse
s {$sel:consumer:RegisterStreamConsumerResponse' :: Consumer
consumer = Consumer
a} :: RegisterStreamConsumerResponse)

instance
  Prelude.NFData
    RegisterStreamConsumerResponse
  where
  rnf :: RegisterStreamConsumerResponse -> ()
rnf RegisterStreamConsumerResponse' {Int
Consumer
consumer :: Consumer
httpStatus :: Int
$sel:consumer:RegisterStreamConsumerResponse' :: RegisterStreamConsumerResponse -> Consumer
$sel:httpStatus:RegisterStreamConsumerResponse' :: RegisterStreamConsumerResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Consumer
consumer