{-# 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.ELBV2.DescribeTargetHealth
-- 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 the health of the specified targets or all of your targets.
module Amazonka.ELBV2.DescribeTargetHealth
  ( -- * Creating a Request
    DescribeTargetHealth (..),
    newDescribeTargetHealth,

    -- * Request Lenses
    describeTargetHealth_targets,
    describeTargetHealth_targetGroupArn,

    -- * Destructuring the Response
    DescribeTargetHealthResponse (..),
    newDescribeTargetHealthResponse,

    -- * Response Lenses
    describeTargetHealthResponse_targetHealthDescriptions,
    describeTargetHealthResponse_httpStatus,
  )
where

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

-- | /See:/ 'newDescribeTargetHealth' smart constructor.
data DescribeTargetHealth = DescribeTargetHealth'
  { -- | The targets.
    DescribeTargetHealth -> Maybe [TargetDescription]
targets :: Prelude.Maybe [TargetDescription],
    -- | The Amazon Resource Name (ARN) of the target group.
    DescribeTargetHealth -> Text
targetGroupArn :: Prelude.Text
  }
  deriving (DescribeTargetHealth -> DescribeTargetHealth -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeTargetHealth -> DescribeTargetHealth -> Bool
$c/= :: DescribeTargetHealth -> DescribeTargetHealth -> Bool
== :: DescribeTargetHealth -> DescribeTargetHealth -> Bool
$c== :: DescribeTargetHealth -> DescribeTargetHealth -> Bool
Prelude.Eq, ReadPrec [DescribeTargetHealth]
ReadPrec DescribeTargetHealth
Int -> ReadS DescribeTargetHealth
ReadS [DescribeTargetHealth]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeTargetHealth]
$creadListPrec :: ReadPrec [DescribeTargetHealth]
readPrec :: ReadPrec DescribeTargetHealth
$creadPrec :: ReadPrec DescribeTargetHealth
readList :: ReadS [DescribeTargetHealth]
$creadList :: ReadS [DescribeTargetHealth]
readsPrec :: Int -> ReadS DescribeTargetHealth
$creadsPrec :: Int -> ReadS DescribeTargetHealth
Prelude.Read, Int -> DescribeTargetHealth -> ShowS
[DescribeTargetHealth] -> ShowS
DescribeTargetHealth -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeTargetHealth] -> ShowS
$cshowList :: [DescribeTargetHealth] -> ShowS
show :: DescribeTargetHealth -> String
$cshow :: DescribeTargetHealth -> String
showsPrec :: Int -> DescribeTargetHealth -> ShowS
$cshowsPrec :: Int -> DescribeTargetHealth -> ShowS
Prelude.Show, forall x. Rep DescribeTargetHealth x -> DescribeTargetHealth
forall x. DescribeTargetHealth -> Rep DescribeTargetHealth x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribeTargetHealth x -> DescribeTargetHealth
$cfrom :: forall x. DescribeTargetHealth -> Rep DescribeTargetHealth x
Prelude.Generic)

-- |
-- Create a value of 'DescribeTargetHealth' 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:
--
-- 'targets', 'describeTargetHealth_targets' - The targets.
--
-- 'targetGroupArn', 'describeTargetHealth_targetGroupArn' - The Amazon Resource Name (ARN) of the target group.
newDescribeTargetHealth ::
  -- | 'targetGroupArn'
  Prelude.Text ->
  DescribeTargetHealth
newDescribeTargetHealth :: Text -> DescribeTargetHealth
newDescribeTargetHealth Text
pTargetGroupArn_ =
  DescribeTargetHealth'
    { $sel:targets:DescribeTargetHealth' :: Maybe [TargetDescription]
targets = forall a. Maybe a
Prelude.Nothing,
      $sel:targetGroupArn:DescribeTargetHealth' :: Text
targetGroupArn = Text
pTargetGroupArn_
    }

-- | The targets.
describeTargetHealth_targets :: Lens.Lens' DescribeTargetHealth (Prelude.Maybe [TargetDescription])
describeTargetHealth_targets :: Lens' DescribeTargetHealth (Maybe [TargetDescription])
describeTargetHealth_targets = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeTargetHealth' {Maybe [TargetDescription]
targets :: Maybe [TargetDescription]
$sel:targets:DescribeTargetHealth' :: DescribeTargetHealth -> Maybe [TargetDescription]
targets} -> Maybe [TargetDescription]
targets) (\s :: DescribeTargetHealth
s@DescribeTargetHealth' {} Maybe [TargetDescription]
a -> DescribeTargetHealth
s {$sel:targets:DescribeTargetHealth' :: Maybe [TargetDescription]
targets = Maybe [TargetDescription]
a} :: DescribeTargetHealth) 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 Amazon Resource Name (ARN) of the target group.
describeTargetHealth_targetGroupArn :: Lens.Lens' DescribeTargetHealth Prelude.Text
describeTargetHealth_targetGroupArn :: Lens' DescribeTargetHealth Text
describeTargetHealth_targetGroupArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeTargetHealth' {Text
targetGroupArn :: Text
$sel:targetGroupArn:DescribeTargetHealth' :: DescribeTargetHealth -> Text
targetGroupArn} -> Text
targetGroupArn) (\s :: DescribeTargetHealth
s@DescribeTargetHealth' {} Text
a -> DescribeTargetHealth
s {$sel:targetGroupArn:DescribeTargetHealth' :: Text
targetGroupArn = Text
a} :: DescribeTargetHealth)

instance Core.AWSRequest DescribeTargetHealth where
  type
    AWSResponse DescribeTargetHealth =
      DescribeTargetHealthResponse
  request :: (Service -> Service)
-> DescribeTargetHealth -> Request DescribeTargetHealth
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 DescribeTargetHealth
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DescribeTargetHealth)))
response =
    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
"DescribeTargetHealthResult"
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe [TargetHealthDescription]
-> Int -> DescribeTargetHealthResponse
DescribeTargetHealthResponse'
            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
"TargetHealthDescriptions"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                            forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
Prelude.>>= forall (f :: * -> *) a b.
Applicative f =>
([a] -> f b) -> [a] -> f (Maybe b)
Core.may (forall a. FromXML a => Text -> [Node] -> Either String [a]
Data.parseXMLList Text
"member")
                        )
            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 DescribeTargetHealth where
  hashWithSalt :: Int -> DescribeTargetHealth -> Int
hashWithSalt Int
_salt DescribeTargetHealth' {Maybe [TargetDescription]
Text
targetGroupArn :: Text
targets :: Maybe [TargetDescription]
$sel:targetGroupArn:DescribeTargetHealth' :: DescribeTargetHealth -> Text
$sel:targets:DescribeTargetHealth' :: DescribeTargetHealth -> Maybe [TargetDescription]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [TargetDescription]
targets
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
targetGroupArn

instance Prelude.NFData DescribeTargetHealth where
  rnf :: DescribeTargetHealth -> ()
rnf DescribeTargetHealth' {Maybe [TargetDescription]
Text
targetGroupArn :: Text
targets :: Maybe [TargetDescription]
$sel:targetGroupArn:DescribeTargetHealth' :: DescribeTargetHealth -> Text
$sel:targets:DescribeTargetHealth' :: DescribeTargetHealth -> Maybe [TargetDescription]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [TargetDescription]
targets
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
targetGroupArn

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

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

instance Data.ToQuery DescribeTargetHealth where
  toQuery :: DescribeTargetHealth -> QueryString
toQuery DescribeTargetHealth' {Maybe [TargetDescription]
Text
targetGroupArn :: Text
targets :: Maybe [TargetDescription]
$sel:targetGroupArn:DescribeTargetHealth' :: DescribeTargetHealth -> Text
$sel:targets:DescribeTargetHealth' :: DescribeTargetHealth -> Maybe [TargetDescription]
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"DescribeTargetHealth" :: Prelude.ByteString),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2015-12-01" :: Prelude.ByteString),
        ByteString
"Targets"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: forall a. ToQuery a => a -> QueryString
Data.toQuery
            (forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Data.toQueryList ByteString
"member" forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [TargetDescription]
targets),
        ByteString
"TargetGroupArn" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
targetGroupArn
      ]

-- | /See:/ 'newDescribeTargetHealthResponse' smart constructor.
data DescribeTargetHealthResponse = DescribeTargetHealthResponse'
  { -- | Information about the health of the targets.
    DescribeTargetHealthResponse -> Maybe [TargetHealthDescription]
targetHealthDescriptions :: Prelude.Maybe [TargetHealthDescription],
    -- | The response's http status code.
    DescribeTargetHealthResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DescribeTargetHealthResponse
-> DescribeTargetHealthResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeTargetHealthResponse
-> DescribeTargetHealthResponse -> Bool
$c/= :: DescribeTargetHealthResponse
-> DescribeTargetHealthResponse -> Bool
== :: DescribeTargetHealthResponse
-> DescribeTargetHealthResponse -> Bool
$c== :: DescribeTargetHealthResponse
-> DescribeTargetHealthResponse -> Bool
Prelude.Eq, ReadPrec [DescribeTargetHealthResponse]
ReadPrec DescribeTargetHealthResponse
Int -> ReadS DescribeTargetHealthResponse
ReadS [DescribeTargetHealthResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeTargetHealthResponse]
$creadListPrec :: ReadPrec [DescribeTargetHealthResponse]
readPrec :: ReadPrec DescribeTargetHealthResponse
$creadPrec :: ReadPrec DescribeTargetHealthResponse
readList :: ReadS [DescribeTargetHealthResponse]
$creadList :: ReadS [DescribeTargetHealthResponse]
readsPrec :: Int -> ReadS DescribeTargetHealthResponse
$creadsPrec :: Int -> ReadS DescribeTargetHealthResponse
Prelude.Read, Int -> DescribeTargetHealthResponse -> ShowS
[DescribeTargetHealthResponse] -> ShowS
DescribeTargetHealthResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeTargetHealthResponse] -> ShowS
$cshowList :: [DescribeTargetHealthResponse] -> ShowS
show :: DescribeTargetHealthResponse -> String
$cshow :: DescribeTargetHealthResponse -> String
showsPrec :: Int -> DescribeTargetHealthResponse -> ShowS
$cshowsPrec :: Int -> DescribeTargetHealthResponse -> ShowS
Prelude.Show, forall x.
Rep DescribeTargetHealthResponse x -> DescribeTargetHealthResponse
forall x.
DescribeTargetHealthResponse -> Rep DescribeTargetHealthResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DescribeTargetHealthResponse x -> DescribeTargetHealthResponse
$cfrom :: forall x.
DescribeTargetHealthResponse -> Rep DescribeTargetHealthResponse x
Prelude.Generic)

-- |
-- Create a value of 'DescribeTargetHealthResponse' 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:
--
-- 'targetHealthDescriptions', 'describeTargetHealthResponse_targetHealthDescriptions' - Information about the health of the targets.
--
-- 'httpStatus', 'describeTargetHealthResponse_httpStatus' - The response's http status code.
newDescribeTargetHealthResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DescribeTargetHealthResponse
newDescribeTargetHealthResponse :: Int -> DescribeTargetHealthResponse
newDescribeTargetHealthResponse Int
pHttpStatus_ =
  DescribeTargetHealthResponse'
    { $sel:targetHealthDescriptions:DescribeTargetHealthResponse' :: Maybe [TargetHealthDescription]
targetHealthDescriptions =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DescribeTargetHealthResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Information about the health of the targets.
describeTargetHealthResponse_targetHealthDescriptions :: Lens.Lens' DescribeTargetHealthResponse (Prelude.Maybe [TargetHealthDescription])
describeTargetHealthResponse_targetHealthDescriptions :: Lens'
  DescribeTargetHealthResponse (Maybe [TargetHealthDescription])
describeTargetHealthResponse_targetHealthDescriptions = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeTargetHealthResponse' {Maybe [TargetHealthDescription]
targetHealthDescriptions :: Maybe [TargetHealthDescription]
$sel:targetHealthDescriptions:DescribeTargetHealthResponse' :: DescribeTargetHealthResponse -> Maybe [TargetHealthDescription]
targetHealthDescriptions} -> Maybe [TargetHealthDescription]
targetHealthDescriptions) (\s :: DescribeTargetHealthResponse
s@DescribeTargetHealthResponse' {} Maybe [TargetHealthDescription]
a -> DescribeTargetHealthResponse
s {$sel:targetHealthDescriptions:DescribeTargetHealthResponse' :: Maybe [TargetHealthDescription]
targetHealthDescriptions = Maybe [TargetHealthDescription]
a} :: DescribeTargetHealthResponse) 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.
describeTargetHealthResponse_httpStatus :: Lens.Lens' DescribeTargetHealthResponse Prelude.Int
describeTargetHealthResponse_httpStatus :: Lens' DescribeTargetHealthResponse Int
describeTargetHealthResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeTargetHealthResponse' {Int
httpStatus :: Int
$sel:httpStatus:DescribeTargetHealthResponse' :: DescribeTargetHealthResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: DescribeTargetHealthResponse
s@DescribeTargetHealthResponse' {} Int
a -> DescribeTargetHealthResponse
s {$sel:httpStatus:DescribeTargetHealthResponse' :: Int
httpStatus = Int
a} :: DescribeTargetHealthResponse)

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