{-# 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.AddTagsToStream
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Adds or updates tags for the specified Kinesis data stream. You can
-- assign up to 50 tags to a data stream.
--
-- When invoking this API, it is recommended you use the @StreamARN@ input
-- parameter rather than the @StreamName@ input parameter.
--
-- If tags have already been assigned to the stream, @AddTagsToStream@
-- overwrites any existing tags that correspond to the specified tag keys.
--
-- AddTagsToStream has a limit of five transactions per second per account.
module Amazonka.Kinesis.AddTagsToStream
  ( -- * Creating a Request
    AddTagsToStream (..),
    newAddTagsToStream,

    -- * Request Lenses
    addTagsToStream_streamARN,
    addTagsToStream_streamName,
    addTagsToStream_tags,

    -- * Destructuring the Response
    AddTagsToStreamResponse (..),
    newAddTagsToStreamResponse,
  )
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

-- | Represents the input for @AddTagsToStream@.
--
-- /See:/ 'newAddTagsToStream' smart constructor.
data AddTagsToStream = AddTagsToStream'
  { -- | The ARN of the stream.
    AddTagsToStream -> Maybe Text
streamARN :: Prelude.Maybe Prelude.Text,
    -- | The name of the stream.
    AddTagsToStream -> Maybe Text
streamName :: Prelude.Maybe Prelude.Text,
    -- | A set of up to 10 key-value pairs to use to create the tags.
    AddTagsToStream -> HashMap Text Text
tags :: Prelude.HashMap Prelude.Text Prelude.Text
  }
  deriving (AddTagsToStream -> AddTagsToStream -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AddTagsToStream -> AddTagsToStream -> Bool
$c/= :: AddTagsToStream -> AddTagsToStream -> Bool
== :: AddTagsToStream -> AddTagsToStream -> Bool
$c== :: AddTagsToStream -> AddTagsToStream -> Bool
Prelude.Eq, ReadPrec [AddTagsToStream]
ReadPrec AddTagsToStream
Int -> ReadS AddTagsToStream
ReadS [AddTagsToStream]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AddTagsToStream]
$creadListPrec :: ReadPrec [AddTagsToStream]
readPrec :: ReadPrec AddTagsToStream
$creadPrec :: ReadPrec AddTagsToStream
readList :: ReadS [AddTagsToStream]
$creadList :: ReadS [AddTagsToStream]
readsPrec :: Int -> ReadS AddTagsToStream
$creadsPrec :: Int -> ReadS AddTagsToStream
Prelude.Read, Int -> AddTagsToStream -> ShowS
[AddTagsToStream] -> ShowS
AddTagsToStream -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AddTagsToStream] -> ShowS
$cshowList :: [AddTagsToStream] -> ShowS
show :: AddTagsToStream -> String
$cshow :: AddTagsToStream -> String
showsPrec :: Int -> AddTagsToStream -> ShowS
$cshowsPrec :: Int -> AddTagsToStream -> ShowS
Prelude.Show, forall x. Rep AddTagsToStream x -> AddTagsToStream
forall x. AddTagsToStream -> Rep AddTagsToStream x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AddTagsToStream x -> AddTagsToStream
$cfrom :: forall x. AddTagsToStream -> Rep AddTagsToStream x
Prelude.Generic)

-- |
-- Create a value of 'AddTagsToStream' 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', 'addTagsToStream_streamARN' - The ARN of the stream.
--
-- 'streamName', 'addTagsToStream_streamName' - The name of the stream.
--
-- 'tags', 'addTagsToStream_tags' - A set of up to 10 key-value pairs to use to create the tags.
newAddTagsToStream ::
  AddTagsToStream
newAddTagsToStream :: AddTagsToStream
newAddTagsToStream =
  AddTagsToStream'
    { $sel:streamARN:AddTagsToStream' :: Maybe Text
streamARN = forall a. Maybe a
Prelude.Nothing,
      $sel:streamName:AddTagsToStream' :: Maybe Text
streamName = forall a. Maybe a
Prelude.Nothing,
      $sel:tags:AddTagsToStream' :: HashMap Text Text
tags = forall a. Monoid a => a
Prelude.mempty
    }

-- | The ARN of the stream.
addTagsToStream_streamARN :: Lens.Lens' AddTagsToStream (Prelude.Maybe Prelude.Text)
addTagsToStream_streamARN :: Lens' AddTagsToStream (Maybe Text)
addTagsToStream_streamARN = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddTagsToStream' {Maybe Text
streamARN :: Maybe Text
$sel:streamARN:AddTagsToStream' :: AddTagsToStream -> Maybe Text
streamARN} -> Maybe Text
streamARN) (\s :: AddTagsToStream
s@AddTagsToStream' {} Maybe Text
a -> AddTagsToStream
s {$sel:streamARN:AddTagsToStream' :: Maybe Text
streamARN = Maybe Text
a} :: AddTagsToStream)

-- | The name of the stream.
addTagsToStream_streamName :: Lens.Lens' AddTagsToStream (Prelude.Maybe Prelude.Text)
addTagsToStream_streamName :: Lens' AddTagsToStream (Maybe Text)
addTagsToStream_streamName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddTagsToStream' {Maybe Text
streamName :: Maybe Text
$sel:streamName:AddTagsToStream' :: AddTagsToStream -> Maybe Text
streamName} -> Maybe Text
streamName) (\s :: AddTagsToStream
s@AddTagsToStream' {} Maybe Text
a -> AddTagsToStream
s {$sel:streamName:AddTagsToStream' :: Maybe Text
streamName = Maybe Text
a} :: AddTagsToStream)

-- | A set of up to 10 key-value pairs to use to create the tags.
addTagsToStream_tags :: Lens.Lens' AddTagsToStream (Prelude.HashMap Prelude.Text Prelude.Text)
addTagsToStream_tags :: Lens' AddTagsToStream (HashMap Text Text)
addTagsToStream_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddTagsToStream' {HashMap Text Text
tags :: HashMap Text Text
$sel:tags:AddTagsToStream' :: AddTagsToStream -> HashMap Text Text
tags} -> HashMap Text Text
tags) (\s :: AddTagsToStream
s@AddTagsToStream' {} HashMap Text Text
a -> AddTagsToStream
s {$sel:tags:AddTagsToStream' :: HashMap Text Text
tags = HashMap Text Text
a} :: AddTagsToStream) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance Core.AWSRequest AddTagsToStream where
  type
    AWSResponse AddTagsToStream =
      AddTagsToStreamResponse
  request :: (Service -> Service) -> AddTagsToStream -> Request AddTagsToStream
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 AddTagsToStream
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse AddTagsToStream)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
AWSResponse a
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveNull AddTagsToStreamResponse
AddTagsToStreamResponse'

instance Prelude.Hashable AddTagsToStream where
  hashWithSalt :: Int -> AddTagsToStream -> Int
hashWithSalt Int
_salt AddTagsToStream' {Maybe Text
HashMap Text Text
tags :: HashMap Text Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tags:AddTagsToStream' :: AddTagsToStream -> HashMap Text Text
$sel:streamName:AddTagsToStream' :: AddTagsToStream -> Maybe Text
$sel:streamARN:AddTagsToStream' :: AddTagsToStream -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
streamARN
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
streamName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` HashMap Text Text
tags

instance Prelude.NFData AddTagsToStream where
  rnf :: AddTagsToStream -> ()
rnf AddTagsToStream' {Maybe Text
HashMap Text Text
tags :: HashMap Text Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tags:AddTagsToStream' :: AddTagsToStream -> HashMap Text Text
$sel:streamName:AddTagsToStream' :: AddTagsToStream -> Maybe Text
$sel:streamARN:AddTagsToStream' :: AddTagsToStream -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
streamARN
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
streamName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf HashMap Text Text
tags

instance Data.ToHeaders AddTagsToStream where
  toHeaders :: AddTagsToStream -> [Header]
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 -> [Header]
Data.=# ( ByteString
"Kinesis_20131202.AddTagsToStream" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> [Header]
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON AddTagsToStream where
  toJSON :: AddTagsToStream -> Value
toJSON AddTagsToStream' {Maybe Text
HashMap Text Text
tags :: HashMap Text Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tags:AddTagsToStream' :: AddTagsToStream -> HashMap Text Text
$sel:streamName:AddTagsToStream' :: AddTagsToStream -> Maybe Text
$sel:streamARN:AddTagsToStream' :: AddTagsToStream -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"StreamARN" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
streamARN,
            (Key
"StreamName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
streamName,
            forall a. a -> Maybe a
Prelude.Just (Key
"Tags" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= HashMap Text Text
tags)
          ]
      )

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

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

-- | /See:/ 'newAddTagsToStreamResponse' smart constructor.
data AddTagsToStreamResponse = AddTagsToStreamResponse'
  {
  }
  deriving (AddTagsToStreamResponse -> AddTagsToStreamResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AddTagsToStreamResponse -> AddTagsToStreamResponse -> Bool
$c/= :: AddTagsToStreamResponse -> AddTagsToStreamResponse -> Bool
== :: AddTagsToStreamResponse -> AddTagsToStreamResponse -> Bool
$c== :: AddTagsToStreamResponse -> AddTagsToStreamResponse -> Bool
Prelude.Eq, ReadPrec [AddTagsToStreamResponse]
ReadPrec AddTagsToStreamResponse
Int -> ReadS AddTagsToStreamResponse
ReadS [AddTagsToStreamResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AddTagsToStreamResponse]
$creadListPrec :: ReadPrec [AddTagsToStreamResponse]
readPrec :: ReadPrec AddTagsToStreamResponse
$creadPrec :: ReadPrec AddTagsToStreamResponse
readList :: ReadS [AddTagsToStreamResponse]
$creadList :: ReadS [AddTagsToStreamResponse]
readsPrec :: Int -> ReadS AddTagsToStreamResponse
$creadsPrec :: Int -> ReadS AddTagsToStreamResponse
Prelude.Read, Int -> AddTagsToStreamResponse -> ShowS
[AddTagsToStreamResponse] -> ShowS
AddTagsToStreamResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AddTagsToStreamResponse] -> ShowS
$cshowList :: [AddTagsToStreamResponse] -> ShowS
show :: AddTagsToStreamResponse -> String
$cshow :: AddTagsToStreamResponse -> String
showsPrec :: Int -> AddTagsToStreamResponse -> ShowS
$cshowsPrec :: Int -> AddTagsToStreamResponse -> ShowS
Prelude.Show, forall x. Rep AddTagsToStreamResponse x -> AddTagsToStreamResponse
forall x. AddTagsToStreamResponse -> Rep AddTagsToStreamResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AddTagsToStreamResponse x -> AddTagsToStreamResponse
$cfrom :: forall x. AddTagsToStreamResponse -> Rep AddTagsToStreamResponse x
Prelude.Generic)

-- |
-- Create a value of 'AddTagsToStreamResponse' 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.
newAddTagsToStreamResponse ::
  AddTagsToStreamResponse
newAddTagsToStreamResponse :: AddTagsToStreamResponse
newAddTagsToStreamResponse = AddTagsToStreamResponse
AddTagsToStreamResponse'

instance Prelude.NFData AddTagsToStreamResponse where
  rnf :: AddTagsToStreamResponse -> ()
rnf AddTagsToStreamResponse
_ = ()