{-# 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.RemoveTagsFromStream
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Removes tags from the specified Kinesis data stream. Removed tags are
-- deleted and cannot be recovered after this operation successfully
-- completes.
--
-- When invoking this API, it is recommended you use the @StreamARN@ input
-- parameter rather than the @StreamName@ input parameter.
--
-- If you specify a tag that does not exist, it is ignored.
--
-- RemoveTagsFromStream has a limit of five transactions per second per
-- account.
module Amazonka.Kinesis.RemoveTagsFromStream
  ( -- * Creating a Request
    RemoveTagsFromStream (..),
    newRemoveTagsFromStream,

    -- * Request Lenses
    removeTagsFromStream_streamARN,
    removeTagsFromStream_streamName,
    removeTagsFromStream_tagKeys,

    -- * Destructuring the Response
    RemoveTagsFromStreamResponse (..),
    newRemoveTagsFromStreamResponse,
  )
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 @RemoveTagsFromStream@.
--
-- /See:/ 'newRemoveTagsFromStream' smart constructor.
data RemoveTagsFromStream = RemoveTagsFromStream'
  { -- | The ARN of the stream.
    RemoveTagsFromStream -> Maybe Text
streamARN :: Prelude.Maybe Prelude.Text,
    -- | The name of the stream.
    RemoveTagsFromStream -> Maybe Text
streamName :: Prelude.Maybe Prelude.Text,
    -- | A list of tag keys. Each corresponding tag is removed from the stream.
    RemoveTagsFromStream -> NonEmpty Text
tagKeys :: Prelude.NonEmpty Prelude.Text
  }
  deriving (RemoveTagsFromStream -> RemoveTagsFromStream -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RemoveTagsFromStream -> RemoveTagsFromStream -> Bool
$c/= :: RemoveTagsFromStream -> RemoveTagsFromStream -> Bool
== :: RemoveTagsFromStream -> RemoveTagsFromStream -> Bool
$c== :: RemoveTagsFromStream -> RemoveTagsFromStream -> Bool
Prelude.Eq, ReadPrec [RemoveTagsFromStream]
ReadPrec RemoveTagsFromStream
Int -> ReadS RemoveTagsFromStream
ReadS [RemoveTagsFromStream]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RemoveTagsFromStream]
$creadListPrec :: ReadPrec [RemoveTagsFromStream]
readPrec :: ReadPrec RemoveTagsFromStream
$creadPrec :: ReadPrec RemoveTagsFromStream
readList :: ReadS [RemoveTagsFromStream]
$creadList :: ReadS [RemoveTagsFromStream]
readsPrec :: Int -> ReadS RemoveTagsFromStream
$creadsPrec :: Int -> ReadS RemoveTagsFromStream
Prelude.Read, Int -> RemoveTagsFromStream -> ShowS
[RemoveTagsFromStream] -> ShowS
RemoveTagsFromStream -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RemoveTagsFromStream] -> ShowS
$cshowList :: [RemoveTagsFromStream] -> ShowS
show :: RemoveTagsFromStream -> String
$cshow :: RemoveTagsFromStream -> String
showsPrec :: Int -> RemoveTagsFromStream -> ShowS
$cshowsPrec :: Int -> RemoveTagsFromStream -> ShowS
Prelude.Show, forall x. Rep RemoveTagsFromStream x -> RemoveTagsFromStream
forall x. RemoveTagsFromStream -> Rep RemoveTagsFromStream x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RemoveTagsFromStream x -> RemoveTagsFromStream
$cfrom :: forall x. RemoveTagsFromStream -> Rep RemoveTagsFromStream x
Prelude.Generic)

-- |
-- Create a value of 'RemoveTagsFromStream' 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', 'removeTagsFromStream_streamARN' - The ARN of the stream.
--
-- 'streamName', 'removeTagsFromStream_streamName' - The name of the stream.
--
-- 'tagKeys', 'removeTagsFromStream_tagKeys' - A list of tag keys. Each corresponding tag is removed from the stream.
newRemoveTagsFromStream ::
  -- | 'tagKeys'
  Prelude.NonEmpty Prelude.Text ->
  RemoveTagsFromStream
newRemoveTagsFromStream :: NonEmpty Text -> RemoveTagsFromStream
newRemoveTagsFromStream NonEmpty Text
pTagKeys_ =
  RemoveTagsFromStream'
    { $sel:streamARN:RemoveTagsFromStream' :: Maybe Text
streamARN = forall a. Maybe a
Prelude.Nothing,
      $sel:streamName:RemoveTagsFromStream' :: Maybe Text
streamName = forall a. Maybe a
Prelude.Nothing,
      $sel:tagKeys:RemoveTagsFromStream' :: NonEmpty Text
tagKeys = forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced forall t b. AReview t b -> b -> t
Lens.# NonEmpty Text
pTagKeys_
    }

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

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

-- | A list of tag keys. Each corresponding tag is removed from the stream.
removeTagsFromStream_tagKeys :: Lens.Lens' RemoveTagsFromStream (Prelude.NonEmpty Prelude.Text)
removeTagsFromStream_tagKeys :: Lens' RemoveTagsFromStream (NonEmpty Text)
removeTagsFromStream_tagKeys = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RemoveTagsFromStream' {NonEmpty Text
tagKeys :: NonEmpty Text
$sel:tagKeys:RemoveTagsFromStream' :: RemoveTagsFromStream -> NonEmpty Text
tagKeys} -> NonEmpty Text
tagKeys) (\s :: RemoveTagsFromStream
s@RemoveTagsFromStream' {} NonEmpty Text
a -> RemoveTagsFromStream
s {$sel:tagKeys:RemoveTagsFromStream' :: NonEmpty Text
tagKeys = NonEmpty Text
a} :: RemoveTagsFromStream) 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 RemoveTagsFromStream where
  type
    AWSResponse RemoveTagsFromStream =
      RemoveTagsFromStreamResponse
  request :: (Service -> Service)
-> RemoveTagsFromStream -> Request RemoveTagsFromStream
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 RemoveTagsFromStream
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse RemoveTagsFromStream)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
AWSResponse a
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveNull RemoveTagsFromStreamResponse
RemoveTagsFromStreamResponse'

instance Prelude.Hashable RemoveTagsFromStream where
  hashWithSalt :: Int -> RemoveTagsFromStream -> Int
hashWithSalt Int
_salt RemoveTagsFromStream' {Maybe Text
NonEmpty Text
tagKeys :: NonEmpty Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tagKeys:RemoveTagsFromStream' :: RemoveTagsFromStream -> NonEmpty Text
$sel:streamName:RemoveTagsFromStream' :: RemoveTagsFromStream -> Maybe Text
$sel:streamARN:RemoveTagsFromStream' :: RemoveTagsFromStream -> 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` NonEmpty Text
tagKeys

instance Prelude.NFData RemoveTagsFromStream where
  rnf :: RemoveTagsFromStream -> ()
rnf RemoveTagsFromStream' {Maybe Text
NonEmpty Text
tagKeys :: NonEmpty Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tagKeys:RemoveTagsFromStream' :: RemoveTagsFromStream -> NonEmpty Text
$sel:streamName:RemoveTagsFromStream' :: RemoveTagsFromStream -> Maybe Text
$sel:streamARN:RemoveTagsFromStream' :: RemoveTagsFromStream -> 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 NonEmpty Text
tagKeys

instance Data.ToHeaders RemoveTagsFromStream where
  toHeaders :: RemoveTagsFromStream -> [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.RemoveTagsFromStream" ::
                          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 RemoveTagsFromStream where
  toJSON :: RemoveTagsFromStream -> Value
toJSON RemoveTagsFromStream' {Maybe Text
NonEmpty Text
tagKeys :: NonEmpty Text
streamName :: Maybe Text
streamARN :: Maybe Text
$sel:tagKeys:RemoveTagsFromStream' :: RemoveTagsFromStream -> NonEmpty Text
$sel:streamName:RemoveTagsFromStream' :: RemoveTagsFromStream -> Maybe Text
$sel:streamARN:RemoveTagsFromStream' :: RemoveTagsFromStream -> 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
"TagKeys" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= NonEmpty Text
tagKeys)
          ]
      )

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

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

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

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

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