{-# 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.SNS.OptInPhoneNumber
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Use this request to opt in a phone number that is opted out, which
-- enables you to resume sending SMS messages to the number.
--
-- You can opt in a phone number only once every 30 days.
module Amazonka.SNS.OptInPhoneNumber
  ( -- * Creating a Request
    OptInPhoneNumber (..),
    newOptInPhoneNumber,

    -- * Request Lenses
    optInPhoneNumber_phoneNumber,

    -- * Destructuring the Response
    OptInPhoneNumberResponse (..),
    newOptInPhoneNumberResponse,

    -- * Response Lenses
    optInPhoneNumberResponse_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.SNS.Types

-- | Input for the OptInPhoneNumber action.
--
-- /See:/ 'newOptInPhoneNumber' smart constructor.
data OptInPhoneNumber = OptInPhoneNumber'
  { -- | The phone number to opt in. Use E.164 format.
    OptInPhoneNumber -> Text
phoneNumber :: Prelude.Text
  }
  deriving (OptInPhoneNumber -> OptInPhoneNumber -> Bool
(OptInPhoneNumber -> OptInPhoneNumber -> Bool)
-> (OptInPhoneNumber -> OptInPhoneNumber -> Bool)
-> Eq OptInPhoneNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OptInPhoneNumber -> OptInPhoneNumber -> Bool
== :: OptInPhoneNumber -> OptInPhoneNumber -> Bool
$c/= :: OptInPhoneNumber -> OptInPhoneNumber -> Bool
/= :: OptInPhoneNumber -> OptInPhoneNumber -> Bool
Prelude.Eq, ReadPrec [OptInPhoneNumber]
ReadPrec OptInPhoneNumber
Int -> ReadS OptInPhoneNumber
ReadS [OptInPhoneNumber]
(Int -> ReadS OptInPhoneNumber)
-> ReadS [OptInPhoneNumber]
-> ReadPrec OptInPhoneNumber
-> ReadPrec [OptInPhoneNumber]
-> Read OptInPhoneNumber
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS OptInPhoneNumber
readsPrec :: Int -> ReadS OptInPhoneNumber
$creadList :: ReadS [OptInPhoneNumber]
readList :: ReadS [OptInPhoneNumber]
$creadPrec :: ReadPrec OptInPhoneNumber
readPrec :: ReadPrec OptInPhoneNumber
$creadListPrec :: ReadPrec [OptInPhoneNumber]
readListPrec :: ReadPrec [OptInPhoneNumber]
Prelude.Read, Int -> OptInPhoneNumber -> ShowS
[OptInPhoneNumber] -> ShowS
OptInPhoneNumber -> String
(Int -> OptInPhoneNumber -> ShowS)
-> (OptInPhoneNumber -> String)
-> ([OptInPhoneNumber] -> ShowS)
-> Show OptInPhoneNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OptInPhoneNumber -> ShowS
showsPrec :: Int -> OptInPhoneNumber -> ShowS
$cshow :: OptInPhoneNumber -> String
show :: OptInPhoneNumber -> String
$cshowList :: [OptInPhoneNumber] -> ShowS
showList :: [OptInPhoneNumber] -> ShowS
Prelude.Show, (forall x. OptInPhoneNumber -> Rep OptInPhoneNumber x)
-> (forall x. Rep OptInPhoneNumber x -> OptInPhoneNumber)
-> Generic OptInPhoneNumber
forall x. Rep OptInPhoneNumber x -> OptInPhoneNumber
forall x. OptInPhoneNumber -> Rep OptInPhoneNumber x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. OptInPhoneNumber -> Rep OptInPhoneNumber x
from :: forall x. OptInPhoneNumber -> Rep OptInPhoneNumber x
$cto :: forall x. Rep OptInPhoneNumber x -> OptInPhoneNumber
to :: forall x. Rep OptInPhoneNumber x -> OptInPhoneNumber
Prelude.Generic)

-- |
-- Create a value of 'OptInPhoneNumber' 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:
--
-- 'phoneNumber', 'optInPhoneNumber_phoneNumber' - The phone number to opt in. Use E.164 format.
newOptInPhoneNumber ::
  -- | 'phoneNumber'
  Prelude.Text ->
  OptInPhoneNumber
newOptInPhoneNumber :: Text -> OptInPhoneNumber
newOptInPhoneNumber Text
pPhoneNumber_ =
  OptInPhoneNumber' {phoneNumber :: Text
phoneNumber = Text
pPhoneNumber_}

-- | The phone number to opt in. Use E.164 format.
optInPhoneNumber_phoneNumber :: Lens.Lens' OptInPhoneNumber Prelude.Text
optInPhoneNumber_phoneNumber :: Lens' OptInPhoneNumber Text
optInPhoneNumber_phoneNumber = (OptInPhoneNumber -> Text)
-> (OptInPhoneNumber -> Text -> OptInPhoneNumber)
-> Lens' OptInPhoneNumber Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OptInPhoneNumber' {Text
phoneNumber :: OptInPhoneNumber -> Text
phoneNumber :: Text
phoneNumber} -> Text
phoneNumber) (\s :: OptInPhoneNumber
s@OptInPhoneNumber' {} Text
a -> OptInPhoneNumber
s {phoneNumber = a} :: OptInPhoneNumber)

instance Core.AWSRequest OptInPhoneNumber where
  type
    AWSResponse OptInPhoneNumber =
      OptInPhoneNumberResponse
  request :: (Service -> Service)
-> OptInPhoneNumber -> Request OptInPhoneNumber
request Service -> Service
overrides =
    Service -> OptInPhoneNumber -> Request OptInPhoneNumber
forall a. ToRequest a => Service -> a -> Request a
Request.postQuery (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy OptInPhoneNumber
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse OptInPhoneNumber)))
response =
    Text
-> (Int
    -> ResponseHeaders
    -> [Node]
    -> Either String (AWSResponse OptInPhoneNumber))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy OptInPhoneNumber
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse OptInPhoneNumber)))
forall (m :: * -> *) a.
MonadResource m =>
Text
-> (Int
    -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXMLWrapper
      Text
"OptInPhoneNumberResult"
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Int -> OptInPhoneNumberResponse
OptInPhoneNumberResponse'
            (Int -> OptInPhoneNumberResponse)
-> Either String Int -> Either String OptInPhoneNumberResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Int -> Either String Int
forall a. a -> Either String a
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 OptInPhoneNumber where
  hashWithSalt :: Int -> OptInPhoneNumber -> Int
hashWithSalt Int
_salt OptInPhoneNumber' {Text
phoneNumber :: OptInPhoneNumber -> Text
phoneNumber :: Text
..} =
    Int
_salt Int -> Text -> Int
forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
phoneNumber

instance Prelude.NFData OptInPhoneNumber where
  rnf :: OptInPhoneNumber -> ()
rnf OptInPhoneNumber' {Text
phoneNumber :: OptInPhoneNumber -> Text
phoneNumber :: Text
..} = Text -> ()
forall a. NFData a => a -> ()
Prelude.rnf Text
phoneNumber

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

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

instance Data.ToQuery OptInPhoneNumber where
  toQuery :: OptInPhoneNumber -> QueryString
toQuery OptInPhoneNumber' {Text
phoneNumber :: OptInPhoneNumber -> Text
phoneNumber :: Text
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"OptInPhoneNumber" :: Prelude.ByteString),
        ByteString
"Version"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2010-03-31" :: Prelude.ByteString),
        ByteString
"phoneNumber" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
phoneNumber
      ]

-- | The response for the OptInPhoneNumber action.
--
-- /See:/ 'newOptInPhoneNumberResponse' smart constructor.
data OptInPhoneNumberResponse = OptInPhoneNumberResponse'
  { -- | The response's http status code.
    OptInPhoneNumberResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool
(OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool)
-> (OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool)
-> Eq OptInPhoneNumberResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool
== :: OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool
$c/= :: OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool
/= :: OptInPhoneNumberResponse -> OptInPhoneNumberResponse -> Bool
Prelude.Eq, ReadPrec [OptInPhoneNumberResponse]
ReadPrec OptInPhoneNumberResponse
Int -> ReadS OptInPhoneNumberResponse
ReadS [OptInPhoneNumberResponse]
(Int -> ReadS OptInPhoneNumberResponse)
-> ReadS [OptInPhoneNumberResponse]
-> ReadPrec OptInPhoneNumberResponse
-> ReadPrec [OptInPhoneNumberResponse]
-> Read OptInPhoneNumberResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS OptInPhoneNumberResponse
readsPrec :: Int -> ReadS OptInPhoneNumberResponse
$creadList :: ReadS [OptInPhoneNumberResponse]
readList :: ReadS [OptInPhoneNumberResponse]
$creadPrec :: ReadPrec OptInPhoneNumberResponse
readPrec :: ReadPrec OptInPhoneNumberResponse
$creadListPrec :: ReadPrec [OptInPhoneNumberResponse]
readListPrec :: ReadPrec [OptInPhoneNumberResponse]
Prelude.Read, Int -> OptInPhoneNumberResponse -> ShowS
[OptInPhoneNumberResponse] -> ShowS
OptInPhoneNumberResponse -> String
(Int -> OptInPhoneNumberResponse -> ShowS)
-> (OptInPhoneNumberResponse -> String)
-> ([OptInPhoneNumberResponse] -> ShowS)
-> Show OptInPhoneNumberResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OptInPhoneNumberResponse -> ShowS
showsPrec :: Int -> OptInPhoneNumberResponse -> ShowS
$cshow :: OptInPhoneNumberResponse -> String
show :: OptInPhoneNumberResponse -> String
$cshowList :: [OptInPhoneNumberResponse] -> ShowS
showList :: [OptInPhoneNumberResponse] -> ShowS
Prelude.Show, (forall x.
 OptInPhoneNumberResponse -> Rep OptInPhoneNumberResponse x)
-> (forall x.
    Rep OptInPhoneNumberResponse x -> OptInPhoneNumberResponse)
-> Generic OptInPhoneNumberResponse
forall x.
Rep OptInPhoneNumberResponse x -> OptInPhoneNumberResponse
forall x.
OptInPhoneNumberResponse -> Rep OptInPhoneNumberResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
OptInPhoneNumberResponse -> Rep OptInPhoneNumberResponse x
from :: forall x.
OptInPhoneNumberResponse -> Rep OptInPhoneNumberResponse x
$cto :: forall x.
Rep OptInPhoneNumberResponse x -> OptInPhoneNumberResponse
to :: forall x.
Rep OptInPhoneNumberResponse x -> OptInPhoneNumberResponse
Prelude.Generic)

-- |
-- Create a value of 'OptInPhoneNumberResponse' 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', 'optInPhoneNumberResponse_httpStatus' - The response's http status code.
newOptInPhoneNumberResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  OptInPhoneNumberResponse
newOptInPhoneNumberResponse :: Int -> OptInPhoneNumberResponse
newOptInPhoneNumberResponse Int
pHttpStatus_ =
  OptInPhoneNumberResponse'
    { httpStatus :: Int
httpStatus =
        Int
pHttpStatus_
    }

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

instance Prelude.NFData OptInPhoneNumberResponse where
  rnf :: OptInPhoneNumberResponse -> ()
rnf OptInPhoneNumberResponse' {Int
httpStatus :: OptInPhoneNumberResponse -> Int
httpStatus :: Int
..} =
    Int -> ()
forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus