{-# 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.OpsWorks.DescribeElasticIps
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Describes
-- <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html Elastic IP addresses>.
--
-- This call accepts only one resource-identifying parameter.
--
-- __Required Permissions__: To use this action, an IAM user must have a
-- Show, Deploy, or Manage permissions level for the stack, or an attached
-- policy that explicitly grants permissions. For more information about
-- user permissions, see
-- <https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html Managing User Permissions>.
module Amazonka.OpsWorks.DescribeElasticIps
  ( -- * Creating a Request
    DescribeElasticIps (..),
    newDescribeElasticIps,

    -- * Request Lenses
    describeElasticIps_instanceId,
    describeElasticIps_ips,
    describeElasticIps_stackId,

    -- * Destructuring the Response
    DescribeElasticIpsResponse (..),
    newDescribeElasticIpsResponse,

    -- * Response Lenses
    describeElasticIpsResponse_elasticIps,
    describeElasticIpsResponse_httpStatus,
  )
where

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

-- | /See:/ 'newDescribeElasticIps' smart constructor.
data DescribeElasticIps = DescribeElasticIps'
  { -- | The instance ID. If you include this parameter, @DescribeElasticIps@
    -- returns a description of the Elastic IP addresses associated with the
    -- specified instance.
    DescribeElasticIps -> Maybe Text
instanceId :: Prelude.Maybe Prelude.Text,
    -- | An array of Elastic IP addresses to be described. If you include this
    -- parameter, @DescribeElasticIps@ returns a description of the specified
    -- Elastic IP addresses. Otherwise, it returns a description of every
    -- Elastic IP address.
    DescribeElasticIps -> Maybe [Text]
ips :: Prelude.Maybe [Prelude.Text],
    -- | A stack ID. If you include this parameter, @DescribeElasticIps@ returns
    -- a description of the Elastic IP addresses that are registered with the
    -- specified stack.
    DescribeElasticIps -> Maybe Text
stackId :: Prelude.Maybe Prelude.Text
  }
  deriving (DescribeElasticIps -> DescribeElasticIps -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeElasticIps -> DescribeElasticIps -> Bool
$c/= :: DescribeElasticIps -> DescribeElasticIps -> Bool
== :: DescribeElasticIps -> DescribeElasticIps -> Bool
$c== :: DescribeElasticIps -> DescribeElasticIps -> Bool
Prelude.Eq, ReadPrec [DescribeElasticIps]
ReadPrec DescribeElasticIps
Int -> ReadS DescribeElasticIps
ReadS [DescribeElasticIps]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeElasticIps]
$creadListPrec :: ReadPrec [DescribeElasticIps]
readPrec :: ReadPrec DescribeElasticIps
$creadPrec :: ReadPrec DescribeElasticIps
readList :: ReadS [DescribeElasticIps]
$creadList :: ReadS [DescribeElasticIps]
readsPrec :: Int -> ReadS DescribeElasticIps
$creadsPrec :: Int -> ReadS DescribeElasticIps
Prelude.Read, Int -> DescribeElasticIps -> ShowS
[DescribeElasticIps] -> ShowS
DescribeElasticIps -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeElasticIps] -> ShowS
$cshowList :: [DescribeElasticIps] -> ShowS
show :: DescribeElasticIps -> String
$cshow :: DescribeElasticIps -> String
showsPrec :: Int -> DescribeElasticIps -> ShowS
$cshowsPrec :: Int -> DescribeElasticIps -> ShowS
Prelude.Show, forall x. Rep DescribeElasticIps x -> DescribeElasticIps
forall x. DescribeElasticIps -> Rep DescribeElasticIps x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribeElasticIps x -> DescribeElasticIps
$cfrom :: forall x. DescribeElasticIps -> Rep DescribeElasticIps x
Prelude.Generic)

-- |
-- Create a value of 'DescribeElasticIps' 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:
--
-- 'instanceId', 'describeElasticIps_instanceId' - The instance ID. If you include this parameter, @DescribeElasticIps@
-- returns a description of the Elastic IP addresses associated with the
-- specified instance.
--
-- 'ips', 'describeElasticIps_ips' - An array of Elastic IP addresses to be described. If you include this
-- parameter, @DescribeElasticIps@ returns a description of the specified
-- Elastic IP addresses. Otherwise, it returns a description of every
-- Elastic IP address.
--
-- 'stackId', 'describeElasticIps_stackId' - A stack ID. If you include this parameter, @DescribeElasticIps@ returns
-- a description of the Elastic IP addresses that are registered with the
-- specified stack.
newDescribeElasticIps ::
  DescribeElasticIps
newDescribeElasticIps :: DescribeElasticIps
newDescribeElasticIps =
  DescribeElasticIps'
    { $sel:instanceId:DescribeElasticIps' :: Maybe Text
instanceId = forall a. Maybe a
Prelude.Nothing,
      $sel:ips:DescribeElasticIps' :: Maybe [Text]
ips = forall a. Maybe a
Prelude.Nothing,
      $sel:stackId:DescribeElasticIps' :: Maybe Text
stackId = forall a. Maybe a
Prelude.Nothing
    }

-- | The instance ID. If you include this parameter, @DescribeElasticIps@
-- returns a description of the Elastic IP addresses associated with the
-- specified instance.
describeElasticIps_instanceId :: Lens.Lens' DescribeElasticIps (Prelude.Maybe Prelude.Text)
describeElasticIps_instanceId :: Lens' DescribeElasticIps (Maybe Text)
describeElasticIps_instanceId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeElasticIps' {Maybe Text
instanceId :: Maybe Text
$sel:instanceId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
instanceId} -> Maybe Text
instanceId) (\s :: DescribeElasticIps
s@DescribeElasticIps' {} Maybe Text
a -> DescribeElasticIps
s {$sel:instanceId:DescribeElasticIps' :: Maybe Text
instanceId = Maybe Text
a} :: DescribeElasticIps)

-- | An array of Elastic IP addresses to be described. If you include this
-- parameter, @DescribeElasticIps@ returns a description of the specified
-- Elastic IP addresses. Otherwise, it returns a description of every
-- Elastic IP address.
describeElasticIps_ips :: Lens.Lens' DescribeElasticIps (Prelude.Maybe [Prelude.Text])
describeElasticIps_ips :: Lens' DescribeElasticIps (Maybe [Text])
describeElasticIps_ips = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeElasticIps' {Maybe [Text]
ips :: Maybe [Text]
$sel:ips:DescribeElasticIps' :: DescribeElasticIps -> Maybe [Text]
ips} -> Maybe [Text]
ips) (\s :: DescribeElasticIps
s@DescribeElasticIps' {} Maybe [Text]
a -> DescribeElasticIps
s {$sel:ips:DescribeElasticIps' :: Maybe [Text]
ips = Maybe [Text]
a} :: DescribeElasticIps) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A stack ID. If you include this parameter, @DescribeElasticIps@ returns
-- a description of the Elastic IP addresses that are registered with the
-- specified stack.
describeElasticIps_stackId :: Lens.Lens' DescribeElasticIps (Prelude.Maybe Prelude.Text)
describeElasticIps_stackId :: Lens' DescribeElasticIps (Maybe Text)
describeElasticIps_stackId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeElasticIps' {Maybe Text
stackId :: Maybe Text
$sel:stackId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
stackId} -> Maybe Text
stackId) (\s :: DescribeElasticIps
s@DescribeElasticIps' {} Maybe Text
a -> DescribeElasticIps
s {$sel:stackId:DescribeElasticIps' :: Maybe Text
stackId = Maybe Text
a} :: DescribeElasticIps)

instance Core.AWSRequest DescribeElasticIps where
  type
    AWSResponse DescribeElasticIps =
      DescribeElasticIpsResponse
  request :: (Service -> Service)
-> DescribeElasticIps -> Request DescribeElasticIps
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 DescribeElasticIps
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DescribeElasticIps)))
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 [ElasticIp] -> Int -> DescribeElasticIpsResponse
DescribeElasticIpsResponse'
            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
"ElasticIps" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            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 DescribeElasticIps where
  hashWithSalt :: Int -> DescribeElasticIps -> Int
hashWithSalt Int
_salt DescribeElasticIps' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
ips :: Maybe [Text]
instanceId :: Maybe Text
$sel:stackId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
$sel:ips:DescribeElasticIps' :: DescribeElasticIps -> Maybe [Text]
$sel:instanceId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
instanceId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Text]
ips
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
stackId

instance Prelude.NFData DescribeElasticIps where
  rnf :: DescribeElasticIps -> ()
rnf DescribeElasticIps' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
ips :: Maybe [Text]
instanceId :: Maybe Text
$sel:stackId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
$sel:ips:DescribeElasticIps' :: DescribeElasticIps -> Maybe [Text]
$sel:instanceId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
instanceId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [Text]
ips
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
stackId

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

instance Data.ToJSON DescribeElasticIps where
  toJSON :: DescribeElasticIps -> Value
toJSON DescribeElasticIps' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
ips :: Maybe [Text]
instanceId :: Maybe Text
$sel:stackId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
$sel:ips:DescribeElasticIps' :: DescribeElasticIps -> Maybe [Text]
$sel:instanceId:DescribeElasticIps' :: DescribeElasticIps -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"InstanceId" 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
instanceId,
            (Key
"Ips" 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]
ips,
            (Key
"StackId" 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
stackId
          ]
      )

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

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

-- | Contains the response to a @DescribeElasticIps@ request.
--
-- /See:/ 'newDescribeElasticIpsResponse' smart constructor.
data DescribeElasticIpsResponse = DescribeElasticIpsResponse'
  { -- | An @ElasticIps@ object that describes the specified Elastic IP
    -- addresses.
    DescribeElasticIpsResponse -> Maybe [ElasticIp]
elasticIps :: Prelude.Maybe [ElasticIp],
    -- | The response's http status code.
    DescribeElasticIpsResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DescribeElasticIpsResponse -> DescribeElasticIpsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeElasticIpsResponse -> DescribeElasticIpsResponse -> Bool
$c/= :: DescribeElasticIpsResponse -> DescribeElasticIpsResponse -> Bool
== :: DescribeElasticIpsResponse -> DescribeElasticIpsResponse -> Bool
$c== :: DescribeElasticIpsResponse -> DescribeElasticIpsResponse -> Bool
Prelude.Eq, ReadPrec [DescribeElasticIpsResponse]
ReadPrec DescribeElasticIpsResponse
Int -> ReadS DescribeElasticIpsResponse
ReadS [DescribeElasticIpsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeElasticIpsResponse]
$creadListPrec :: ReadPrec [DescribeElasticIpsResponse]
readPrec :: ReadPrec DescribeElasticIpsResponse
$creadPrec :: ReadPrec DescribeElasticIpsResponse
readList :: ReadS [DescribeElasticIpsResponse]
$creadList :: ReadS [DescribeElasticIpsResponse]
readsPrec :: Int -> ReadS DescribeElasticIpsResponse
$creadsPrec :: Int -> ReadS DescribeElasticIpsResponse
Prelude.Read, Int -> DescribeElasticIpsResponse -> ShowS
[DescribeElasticIpsResponse] -> ShowS
DescribeElasticIpsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeElasticIpsResponse] -> ShowS
$cshowList :: [DescribeElasticIpsResponse] -> ShowS
show :: DescribeElasticIpsResponse -> String
$cshow :: DescribeElasticIpsResponse -> String
showsPrec :: Int -> DescribeElasticIpsResponse -> ShowS
$cshowsPrec :: Int -> DescribeElasticIpsResponse -> ShowS
Prelude.Show, forall x.
Rep DescribeElasticIpsResponse x -> DescribeElasticIpsResponse
forall x.
DescribeElasticIpsResponse -> Rep DescribeElasticIpsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DescribeElasticIpsResponse x -> DescribeElasticIpsResponse
$cfrom :: forall x.
DescribeElasticIpsResponse -> Rep DescribeElasticIpsResponse x
Prelude.Generic)

-- |
-- Create a value of 'DescribeElasticIpsResponse' 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:
--
-- 'elasticIps', 'describeElasticIpsResponse_elasticIps' - An @ElasticIps@ object that describes the specified Elastic IP
-- addresses.
--
-- 'httpStatus', 'describeElasticIpsResponse_httpStatus' - The response's http status code.
newDescribeElasticIpsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DescribeElasticIpsResponse
newDescribeElasticIpsResponse :: Int -> DescribeElasticIpsResponse
newDescribeElasticIpsResponse Int
pHttpStatus_ =
  DescribeElasticIpsResponse'
    { $sel:elasticIps:DescribeElasticIpsResponse' :: Maybe [ElasticIp]
elasticIps =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DescribeElasticIpsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An @ElasticIps@ object that describes the specified Elastic IP
-- addresses.
describeElasticIpsResponse_elasticIps :: Lens.Lens' DescribeElasticIpsResponse (Prelude.Maybe [ElasticIp])
describeElasticIpsResponse_elasticIps :: Lens' DescribeElasticIpsResponse (Maybe [ElasticIp])
describeElasticIpsResponse_elasticIps = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeElasticIpsResponse' {Maybe [ElasticIp]
elasticIps :: Maybe [ElasticIp]
$sel:elasticIps:DescribeElasticIpsResponse' :: DescribeElasticIpsResponse -> Maybe [ElasticIp]
elasticIps} -> Maybe [ElasticIp]
elasticIps) (\s :: DescribeElasticIpsResponse
s@DescribeElasticIpsResponse' {} Maybe [ElasticIp]
a -> DescribeElasticIpsResponse
s {$sel:elasticIps:DescribeElasticIpsResponse' :: Maybe [ElasticIp]
elasticIps = Maybe [ElasticIp]
a} :: DescribeElasticIpsResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

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

instance Prelude.NFData DescribeElasticIpsResponse where
  rnf :: DescribeElasticIpsResponse -> ()
rnf DescribeElasticIpsResponse' {Int
Maybe [ElasticIp]
httpStatus :: Int
elasticIps :: Maybe [ElasticIp]
$sel:httpStatus:DescribeElasticIpsResponse' :: DescribeElasticIpsResponse -> Int
$sel:elasticIps:DescribeElasticIpsResponse' :: DescribeElasticIpsResponse -> Maybe [ElasticIp]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [ElasticIp]
elasticIps
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus