{-# 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.EC2.EnableAddressTransfer
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Enables Elastic IP address transfer. For more information, see
-- <https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro Transfer Elastic IP addresses>
-- in the /Amazon Virtual Private Cloud User Guide/.
module Amazonka.EC2.EnableAddressTransfer
  ( -- * Creating a Request
    EnableAddressTransfer (..),
    newEnableAddressTransfer,

    -- * Request Lenses
    enableAddressTransfer_dryRun,
    enableAddressTransfer_allocationId,
    enableAddressTransfer_transferAccountId,

    -- * Destructuring the Response
    EnableAddressTransferResponse (..),
    newEnableAddressTransferResponse,

    -- * Response Lenses
    enableAddressTransferResponse_addressTransfer,
    enableAddressTransferResponse_httpStatus,
  )
where

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

-- | /See:/ 'newEnableAddressTransfer' smart constructor.
data EnableAddressTransfer = EnableAddressTransfer'
  { -- | Checks whether you have the required permissions for the action, without
    -- actually making the request, and provides an error response. If you have
    -- the required permissions, the error response is @DryRunOperation@.
    -- Otherwise, it is @UnauthorizedOperation@.
    EnableAddressTransfer -> Maybe Bool
dryRun :: Prelude.Maybe Prelude.Bool,
    -- | The allocation ID of an Elastic IP address.
    EnableAddressTransfer -> Text
allocationId :: Prelude.Text,
    -- | The ID of the account that you want to transfer the Elastic IP address
    -- to.
    EnableAddressTransfer -> Text
transferAccountId :: Prelude.Text
  }
  deriving (EnableAddressTransfer -> EnableAddressTransfer -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EnableAddressTransfer -> EnableAddressTransfer -> Bool
$c/= :: EnableAddressTransfer -> EnableAddressTransfer -> Bool
== :: EnableAddressTransfer -> EnableAddressTransfer -> Bool
$c== :: EnableAddressTransfer -> EnableAddressTransfer -> Bool
Prelude.Eq, ReadPrec [EnableAddressTransfer]
ReadPrec EnableAddressTransfer
Int -> ReadS EnableAddressTransfer
ReadS [EnableAddressTransfer]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [EnableAddressTransfer]
$creadListPrec :: ReadPrec [EnableAddressTransfer]
readPrec :: ReadPrec EnableAddressTransfer
$creadPrec :: ReadPrec EnableAddressTransfer
readList :: ReadS [EnableAddressTransfer]
$creadList :: ReadS [EnableAddressTransfer]
readsPrec :: Int -> ReadS EnableAddressTransfer
$creadsPrec :: Int -> ReadS EnableAddressTransfer
Prelude.Read, Int -> EnableAddressTransfer -> ShowS
[EnableAddressTransfer] -> ShowS
EnableAddressTransfer -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EnableAddressTransfer] -> ShowS
$cshowList :: [EnableAddressTransfer] -> ShowS
show :: EnableAddressTransfer -> String
$cshow :: EnableAddressTransfer -> String
showsPrec :: Int -> EnableAddressTransfer -> ShowS
$cshowsPrec :: Int -> EnableAddressTransfer -> ShowS
Prelude.Show, forall x. Rep EnableAddressTransfer x -> EnableAddressTransfer
forall x. EnableAddressTransfer -> Rep EnableAddressTransfer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep EnableAddressTransfer x -> EnableAddressTransfer
$cfrom :: forall x. EnableAddressTransfer -> Rep EnableAddressTransfer x
Prelude.Generic)

-- |
-- Create a value of 'EnableAddressTransfer' 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:
--
-- 'dryRun', 'enableAddressTransfer_dryRun' - Checks whether you have the required permissions for the action, without
-- actually making the request, and provides an error response. If you have
-- the required permissions, the error response is @DryRunOperation@.
-- Otherwise, it is @UnauthorizedOperation@.
--
-- 'allocationId', 'enableAddressTransfer_allocationId' - The allocation ID of an Elastic IP address.
--
-- 'transferAccountId', 'enableAddressTransfer_transferAccountId' - The ID of the account that you want to transfer the Elastic IP address
-- to.
newEnableAddressTransfer ::
  -- | 'allocationId'
  Prelude.Text ->
  -- | 'transferAccountId'
  Prelude.Text ->
  EnableAddressTransfer
newEnableAddressTransfer :: Text -> Text -> EnableAddressTransfer
newEnableAddressTransfer
  Text
pAllocationId_
  Text
pTransferAccountId_ =
    EnableAddressTransfer'
      { $sel:dryRun:EnableAddressTransfer' :: Maybe Bool
dryRun = forall a. Maybe a
Prelude.Nothing,
        $sel:allocationId:EnableAddressTransfer' :: Text
allocationId = Text
pAllocationId_,
        $sel:transferAccountId:EnableAddressTransfer' :: Text
transferAccountId = Text
pTransferAccountId_
      }

-- | Checks whether you have the required permissions for the action, without
-- actually making the request, and provides an error response. If you have
-- the required permissions, the error response is @DryRunOperation@.
-- Otherwise, it is @UnauthorizedOperation@.
enableAddressTransfer_dryRun :: Lens.Lens' EnableAddressTransfer (Prelude.Maybe Prelude.Bool)
enableAddressTransfer_dryRun :: Lens' EnableAddressTransfer (Maybe Bool)
enableAddressTransfer_dryRun = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\EnableAddressTransfer' {Maybe Bool
dryRun :: Maybe Bool
$sel:dryRun:EnableAddressTransfer' :: EnableAddressTransfer -> Maybe Bool
dryRun} -> Maybe Bool
dryRun) (\s :: EnableAddressTransfer
s@EnableAddressTransfer' {} Maybe Bool
a -> EnableAddressTransfer
s {$sel:dryRun:EnableAddressTransfer' :: Maybe Bool
dryRun = Maybe Bool
a} :: EnableAddressTransfer)

-- | The allocation ID of an Elastic IP address.
enableAddressTransfer_allocationId :: Lens.Lens' EnableAddressTransfer Prelude.Text
enableAddressTransfer_allocationId :: Lens' EnableAddressTransfer Text
enableAddressTransfer_allocationId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\EnableAddressTransfer' {Text
allocationId :: Text
$sel:allocationId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
allocationId} -> Text
allocationId) (\s :: EnableAddressTransfer
s@EnableAddressTransfer' {} Text
a -> EnableAddressTransfer
s {$sel:allocationId:EnableAddressTransfer' :: Text
allocationId = Text
a} :: EnableAddressTransfer)

-- | The ID of the account that you want to transfer the Elastic IP address
-- to.
enableAddressTransfer_transferAccountId :: Lens.Lens' EnableAddressTransfer Prelude.Text
enableAddressTransfer_transferAccountId :: Lens' EnableAddressTransfer Text
enableAddressTransfer_transferAccountId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\EnableAddressTransfer' {Text
transferAccountId :: Text
$sel:transferAccountId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
transferAccountId} -> Text
transferAccountId) (\s :: EnableAddressTransfer
s@EnableAddressTransfer' {} Text
a -> EnableAddressTransfer
s {$sel:transferAccountId:EnableAddressTransfer' :: Text
transferAccountId = Text
a} :: EnableAddressTransfer)

instance Core.AWSRequest EnableAddressTransfer where
  type
    AWSResponse EnableAddressTransfer =
      EnableAddressTransferResponse
  request :: (Service -> Service)
-> EnableAddressTransfer -> Request EnableAddressTransfer
request Service -> Service
overrides =
    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 EnableAddressTransfer
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse EnableAddressTransfer)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXML
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe AddressTransfer -> Int -> EnableAddressTransferResponse
EnableAddressTransferResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"addressTransfer")
            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 EnableAddressTransfer where
  hashWithSalt :: Int -> EnableAddressTransfer -> Int
hashWithSalt Int
_salt EnableAddressTransfer' {Maybe Bool
Text
transferAccountId :: Text
allocationId :: Text
dryRun :: Maybe Bool
$sel:transferAccountId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:allocationId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:dryRun:EnableAddressTransfer' :: EnableAddressTransfer -> Maybe Bool
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
dryRun
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
allocationId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
transferAccountId

instance Prelude.NFData EnableAddressTransfer where
  rnf :: EnableAddressTransfer -> ()
rnf EnableAddressTransfer' {Maybe Bool
Text
transferAccountId :: Text
allocationId :: Text
dryRun :: Maybe Bool
$sel:transferAccountId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:allocationId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:dryRun:EnableAddressTransfer' :: EnableAddressTransfer -> Maybe Bool
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
dryRun
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
allocationId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
transferAccountId

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

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

instance Data.ToQuery EnableAddressTransfer where
  toQuery :: EnableAddressTransfer -> QueryString
toQuery EnableAddressTransfer' {Maybe Bool
Text
transferAccountId :: Text
allocationId :: Text
dryRun :: Maybe Bool
$sel:transferAccountId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:allocationId:EnableAddressTransfer' :: EnableAddressTransfer -> Text
$sel:dryRun:EnableAddressTransfer' :: EnableAddressTransfer -> Maybe Bool
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"EnableAddressTransfer" :: Prelude.ByteString),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2016-11-15" :: Prelude.ByteString),
        ByteString
"DryRun" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Bool
dryRun,
        ByteString
"AllocationId" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
allocationId,
        ByteString
"TransferAccountId" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
transferAccountId
      ]

-- | /See:/ 'newEnableAddressTransferResponse' smart constructor.
data EnableAddressTransferResponse = EnableAddressTransferResponse'
  { -- | An Elastic IP address transfer.
    EnableAddressTransferResponse -> Maybe AddressTransfer
addressTransfer :: Prelude.Maybe AddressTransfer,
    -- | The response's http status code.
    EnableAddressTransferResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (EnableAddressTransferResponse
-> EnableAddressTransferResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EnableAddressTransferResponse
-> EnableAddressTransferResponse -> Bool
$c/= :: EnableAddressTransferResponse
-> EnableAddressTransferResponse -> Bool
== :: EnableAddressTransferResponse
-> EnableAddressTransferResponse -> Bool
$c== :: EnableAddressTransferResponse
-> EnableAddressTransferResponse -> Bool
Prelude.Eq, ReadPrec [EnableAddressTransferResponse]
ReadPrec EnableAddressTransferResponse
Int -> ReadS EnableAddressTransferResponse
ReadS [EnableAddressTransferResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [EnableAddressTransferResponse]
$creadListPrec :: ReadPrec [EnableAddressTransferResponse]
readPrec :: ReadPrec EnableAddressTransferResponse
$creadPrec :: ReadPrec EnableAddressTransferResponse
readList :: ReadS [EnableAddressTransferResponse]
$creadList :: ReadS [EnableAddressTransferResponse]
readsPrec :: Int -> ReadS EnableAddressTransferResponse
$creadsPrec :: Int -> ReadS EnableAddressTransferResponse
Prelude.Read, Int -> EnableAddressTransferResponse -> ShowS
[EnableAddressTransferResponse] -> ShowS
EnableAddressTransferResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EnableAddressTransferResponse] -> ShowS
$cshowList :: [EnableAddressTransferResponse] -> ShowS
show :: EnableAddressTransferResponse -> String
$cshow :: EnableAddressTransferResponse -> String
showsPrec :: Int -> EnableAddressTransferResponse -> ShowS
$cshowsPrec :: Int -> EnableAddressTransferResponse -> ShowS
Prelude.Show, forall x.
Rep EnableAddressTransferResponse x
-> EnableAddressTransferResponse
forall x.
EnableAddressTransferResponse
-> Rep EnableAddressTransferResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep EnableAddressTransferResponse x
-> EnableAddressTransferResponse
$cfrom :: forall x.
EnableAddressTransferResponse
-> Rep EnableAddressTransferResponse x
Prelude.Generic)

-- |
-- Create a value of 'EnableAddressTransferResponse' 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:
--
-- 'addressTransfer', 'enableAddressTransferResponse_addressTransfer' - An Elastic IP address transfer.
--
-- 'httpStatus', 'enableAddressTransferResponse_httpStatus' - The response's http status code.
newEnableAddressTransferResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  EnableAddressTransferResponse
newEnableAddressTransferResponse :: Int -> EnableAddressTransferResponse
newEnableAddressTransferResponse Int
pHttpStatus_ =
  EnableAddressTransferResponse'
    { $sel:addressTransfer:EnableAddressTransferResponse' :: Maybe AddressTransfer
addressTransfer =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:EnableAddressTransferResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An Elastic IP address transfer.
enableAddressTransferResponse_addressTransfer :: Lens.Lens' EnableAddressTransferResponse (Prelude.Maybe AddressTransfer)
enableAddressTransferResponse_addressTransfer :: Lens' EnableAddressTransferResponse (Maybe AddressTransfer)
enableAddressTransferResponse_addressTransfer = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\EnableAddressTransferResponse' {Maybe AddressTransfer
addressTransfer :: Maybe AddressTransfer
$sel:addressTransfer:EnableAddressTransferResponse' :: EnableAddressTransferResponse -> Maybe AddressTransfer
addressTransfer} -> Maybe AddressTransfer
addressTransfer) (\s :: EnableAddressTransferResponse
s@EnableAddressTransferResponse' {} Maybe AddressTransfer
a -> EnableAddressTransferResponse
s {$sel:addressTransfer:EnableAddressTransferResponse' :: Maybe AddressTransfer
addressTransfer = Maybe AddressTransfer
a} :: EnableAddressTransferResponse)

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

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