{-# 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.VoiceId.OptOutSpeaker
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Opts out a speaker from Voice ID. A speaker can be opted out regardless
-- of whether or not they already exist in Voice ID. If they don\'t yet
-- exist, a new speaker is created in an opted out state. If they already
-- exist, their existing status is overridden and they are opted out.
-- Enrollment and evaluation authentication requests are rejected for opted
-- out speakers, and opted out speakers have no voice embeddings stored in
-- Voice ID.
module Amazonka.VoiceId.OptOutSpeaker
  ( -- * Creating a Request
    OptOutSpeaker (..),
    newOptOutSpeaker,

    -- * Request Lenses
    optOutSpeaker_domainId,
    optOutSpeaker_speakerId,

    -- * Destructuring the Response
    OptOutSpeakerResponse (..),
    newOptOutSpeakerResponse,

    -- * Response Lenses
    optOutSpeakerResponse_speaker,
    optOutSpeakerResponse_httpStatus,
  )
where

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

-- | /See:/ 'newOptOutSpeaker' smart constructor.
data OptOutSpeaker = OptOutSpeaker'
  { -- | The identifier of the domain containing the speaker.
    OptOutSpeaker -> Text
domainId :: Prelude.Text,
    -- | The identifier of the speaker you want opted-out.
    OptOutSpeaker -> Sensitive Text
speakerId :: Data.Sensitive Prelude.Text
  }
  deriving (OptOutSpeaker -> OptOutSpeaker -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OptOutSpeaker -> OptOutSpeaker -> Bool
$c/= :: OptOutSpeaker -> OptOutSpeaker -> Bool
== :: OptOutSpeaker -> OptOutSpeaker -> Bool
$c== :: OptOutSpeaker -> OptOutSpeaker -> Bool
Prelude.Eq, Int -> OptOutSpeaker -> ShowS
[OptOutSpeaker] -> ShowS
OptOutSpeaker -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OptOutSpeaker] -> ShowS
$cshowList :: [OptOutSpeaker] -> ShowS
show :: OptOutSpeaker -> String
$cshow :: OptOutSpeaker -> String
showsPrec :: Int -> OptOutSpeaker -> ShowS
$cshowsPrec :: Int -> OptOutSpeaker -> ShowS
Prelude.Show, forall x. Rep OptOutSpeaker x -> OptOutSpeaker
forall x. OptOutSpeaker -> Rep OptOutSpeaker x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OptOutSpeaker x -> OptOutSpeaker
$cfrom :: forall x. OptOutSpeaker -> Rep OptOutSpeaker x
Prelude.Generic)

-- |
-- Create a value of 'OptOutSpeaker' 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:
--
-- 'domainId', 'optOutSpeaker_domainId' - The identifier of the domain containing the speaker.
--
-- 'speakerId', 'optOutSpeaker_speakerId' - The identifier of the speaker you want opted-out.
newOptOutSpeaker ::
  -- | 'domainId'
  Prelude.Text ->
  -- | 'speakerId'
  Prelude.Text ->
  OptOutSpeaker
newOptOutSpeaker :: Text -> Text -> OptOutSpeaker
newOptOutSpeaker Text
pDomainId_ Text
pSpeakerId_ =
  OptOutSpeaker'
    { $sel:domainId:OptOutSpeaker' :: Text
domainId = Text
pDomainId_,
      $sel:speakerId:OptOutSpeaker' :: Sensitive Text
speakerId = forall a. Iso' (Sensitive a) a
Data._Sensitive forall t b. AReview t b -> b -> t
Lens.# Text
pSpeakerId_
    }

-- | The identifier of the domain containing the speaker.
optOutSpeaker_domainId :: Lens.Lens' OptOutSpeaker Prelude.Text
optOutSpeaker_domainId :: Lens' OptOutSpeaker Text
optOutSpeaker_domainId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OptOutSpeaker' {Text
domainId :: Text
$sel:domainId:OptOutSpeaker' :: OptOutSpeaker -> Text
domainId} -> Text
domainId) (\s :: OptOutSpeaker
s@OptOutSpeaker' {} Text
a -> OptOutSpeaker
s {$sel:domainId:OptOutSpeaker' :: Text
domainId = Text
a} :: OptOutSpeaker)

-- | The identifier of the speaker you want opted-out.
optOutSpeaker_speakerId :: Lens.Lens' OptOutSpeaker Prelude.Text
optOutSpeaker_speakerId :: Lens' OptOutSpeaker Text
optOutSpeaker_speakerId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OptOutSpeaker' {Sensitive Text
speakerId :: Sensitive Text
$sel:speakerId:OptOutSpeaker' :: OptOutSpeaker -> Sensitive Text
speakerId} -> Sensitive Text
speakerId) (\s :: OptOutSpeaker
s@OptOutSpeaker' {} Sensitive Text
a -> OptOutSpeaker
s {$sel:speakerId:OptOutSpeaker' :: Sensitive Text
speakerId = Sensitive Text
a} :: OptOutSpeaker) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. Iso' (Sensitive a) a
Data._Sensitive

instance Core.AWSRequest OptOutSpeaker where
  type
    AWSResponse OptOutSpeaker =
      OptOutSpeakerResponse
  request :: (Service -> Service) -> OptOutSpeaker -> Request OptOutSpeaker
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 OptOutSpeaker
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse OptOutSpeaker)))
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 ->
          Maybe Speaker -> Int -> OptOutSpeakerResponse
OptOutSpeakerResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"Speaker")
            forall (f :: * -> *) a b. Applicative f => 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))
      )

instance Prelude.Hashable OptOutSpeaker where
  hashWithSalt :: Int -> OptOutSpeaker -> Int
hashWithSalt Int
_salt OptOutSpeaker' {Text
Sensitive Text
speakerId :: Sensitive Text
domainId :: Text
$sel:speakerId:OptOutSpeaker' :: OptOutSpeaker -> Sensitive Text
$sel:domainId:OptOutSpeaker' :: OptOutSpeaker -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
domainId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Sensitive Text
speakerId

instance Prelude.NFData OptOutSpeaker where
  rnf :: OptOutSpeaker -> ()
rnf OptOutSpeaker' {Text
Sensitive Text
speakerId :: Sensitive Text
domainId :: Text
$sel:speakerId:OptOutSpeaker' :: OptOutSpeaker -> Sensitive Text
$sel:domainId:OptOutSpeaker' :: OptOutSpeaker -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
domainId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Sensitive Text
speakerId

instance Data.ToHeaders OptOutSpeaker where
  toHeaders :: OptOutSpeaker -> 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
"VoiceID.OptOutSpeaker" :: Prelude.ByteString),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.0" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON OptOutSpeaker where
  toJSON :: OptOutSpeaker -> Value
toJSON OptOutSpeaker' {Text
Sensitive Text
speakerId :: Sensitive Text
domainId :: Text
$sel:speakerId:OptOutSpeaker' :: OptOutSpeaker -> Sensitive Text
$sel:domainId:OptOutSpeaker' :: OptOutSpeaker -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"DomainId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
domainId),
            forall a. a -> Maybe a
Prelude.Just (Key
"SpeakerId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Sensitive Text
speakerId)
          ]
      )

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

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

-- | /See:/ 'newOptOutSpeakerResponse' smart constructor.
data OptOutSpeakerResponse = OptOutSpeakerResponse'
  { -- | Details about the opted-out speaker.
    OptOutSpeakerResponse -> Maybe Speaker
speaker :: Prelude.Maybe Speaker,
    -- | The response's http status code.
    OptOutSpeakerResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (OptOutSpeakerResponse -> OptOutSpeakerResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OptOutSpeakerResponse -> OptOutSpeakerResponse -> Bool
$c/= :: OptOutSpeakerResponse -> OptOutSpeakerResponse -> Bool
== :: OptOutSpeakerResponse -> OptOutSpeakerResponse -> Bool
$c== :: OptOutSpeakerResponse -> OptOutSpeakerResponse -> Bool
Prelude.Eq, Int -> OptOutSpeakerResponse -> ShowS
[OptOutSpeakerResponse] -> ShowS
OptOutSpeakerResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OptOutSpeakerResponse] -> ShowS
$cshowList :: [OptOutSpeakerResponse] -> ShowS
show :: OptOutSpeakerResponse -> String
$cshow :: OptOutSpeakerResponse -> String
showsPrec :: Int -> OptOutSpeakerResponse -> ShowS
$cshowsPrec :: Int -> OptOutSpeakerResponse -> ShowS
Prelude.Show, forall x. Rep OptOutSpeakerResponse x -> OptOutSpeakerResponse
forall x. OptOutSpeakerResponse -> Rep OptOutSpeakerResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OptOutSpeakerResponse x -> OptOutSpeakerResponse
$cfrom :: forall x. OptOutSpeakerResponse -> Rep OptOutSpeakerResponse x
Prelude.Generic)

-- |
-- Create a value of 'OptOutSpeakerResponse' 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:
--
-- 'speaker', 'optOutSpeakerResponse_speaker' - Details about the opted-out speaker.
--
-- 'httpStatus', 'optOutSpeakerResponse_httpStatus' - The response's http status code.
newOptOutSpeakerResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  OptOutSpeakerResponse
newOptOutSpeakerResponse :: Int -> OptOutSpeakerResponse
newOptOutSpeakerResponse Int
pHttpStatus_ =
  OptOutSpeakerResponse'
    { $sel:speaker:OptOutSpeakerResponse' :: Maybe Speaker
speaker = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:OptOutSpeakerResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Details about the opted-out speaker.
optOutSpeakerResponse_speaker :: Lens.Lens' OptOutSpeakerResponse (Prelude.Maybe Speaker)
optOutSpeakerResponse_speaker :: Lens' OptOutSpeakerResponse (Maybe Speaker)
optOutSpeakerResponse_speaker = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OptOutSpeakerResponse' {Maybe Speaker
speaker :: Maybe Speaker
$sel:speaker:OptOutSpeakerResponse' :: OptOutSpeakerResponse -> Maybe Speaker
speaker} -> Maybe Speaker
speaker) (\s :: OptOutSpeakerResponse
s@OptOutSpeakerResponse' {} Maybe Speaker
a -> OptOutSpeakerResponse
s {$sel:speaker:OptOutSpeakerResponse' :: Maybe Speaker
speaker = Maybe Speaker
a} :: OptOutSpeakerResponse)

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

instance Prelude.NFData OptOutSpeakerResponse where
  rnf :: OptOutSpeakerResponse -> ()
rnf OptOutSpeakerResponse' {Int
Maybe Speaker
httpStatus :: Int
speaker :: Maybe Speaker
$sel:httpStatus:OptOutSpeakerResponse' :: OptOutSpeakerResponse -> Int
$sel:speaker:OptOutSpeakerResponse' :: OptOutSpeakerResponse -> Maybe Speaker
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Speaker
speaker
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus