{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CostExplorer.Types.InstanceDetails
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.CostExplorer.Types.InstanceDetails where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import Amazonka.CostExplorer.Types.EC2InstanceDetails
import Amazonka.CostExplorer.Types.ESInstanceDetails
import Amazonka.CostExplorer.Types.ElastiCacheInstanceDetails
import Amazonka.CostExplorer.Types.RDSInstanceDetails
import Amazonka.CostExplorer.Types.RedshiftInstanceDetails
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | Details about the instances that Amazon Web Services recommends that you
-- purchase.
--
-- /See:/ 'newInstanceDetails' smart constructor.
data InstanceDetails = InstanceDetails'
  { -- | The Amazon EC2 instances that Amazon Web Services recommends that you
    -- purchase.
    InstanceDetails -> Maybe EC2InstanceDetails
eC2InstanceDetails :: Prelude.Maybe EC2InstanceDetails,
    -- | The Amazon OpenSearch Service instances that Amazon Web Services
    -- recommends that you purchase.
    InstanceDetails -> Maybe ESInstanceDetails
eSInstanceDetails :: Prelude.Maybe ESInstanceDetails,
    -- | The ElastiCache instances that Amazon Web Services recommends that you
    -- purchase.
    InstanceDetails -> Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails :: Prelude.Maybe ElastiCacheInstanceDetails,
    -- | The Amazon RDS instances that Amazon Web Services recommends that you
    -- purchase.
    InstanceDetails -> Maybe RDSInstanceDetails
rDSInstanceDetails :: Prelude.Maybe RDSInstanceDetails,
    -- | The Amazon Redshift instances that Amazon Web Services recommends that
    -- you purchase.
    InstanceDetails -> Maybe RedshiftInstanceDetails
redshiftInstanceDetails :: Prelude.Maybe RedshiftInstanceDetails
  }
  deriving (InstanceDetails -> InstanceDetails -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InstanceDetails -> InstanceDetails -> Bool
$c/= :: InstanceDetails -> InstanceDetails -> Bool
== :: InstanceDetails -> InstanceDetails -> Bool
$c== :: InstanceDetails -> InstanceDetails -> Bool
Prelude.Eq, ReadPrec [InstanceDetails]
ReadPrec InstanceDetails
Int -> ReadS InstanceDetails
ReadS [InstanceDetails]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [InstanceDetails]
$creadListPrec :: ReadPrec [InstanceDetails]
readPrec :: ReadPrec InstanceDetails
$creadPrec :: ReadPrec InstanceDetails
readList :: ReadS [InstanceDetails]
$creadList :: ReadS [InstanceDetails]
readsPrec :: Int -> ReadS InstanceDetails
$creadsPrec :: Int -> ReadS InstanceDetails
Prelude.Read, Int -> InstanceDetails -> ShowS
[InstanceDetails] -> ShowS
InstanceDetails -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InstanceDetails] -> ShowS
$cshowList :: [InstanceDetails] -> ShowS
show :: InstanceDetails -> String
$cshow :: InstanceDetails -> String
showsPrec :: Int -> InstanceDetails -> ShowS
$cshowsPrec :: Int -> InstanceDetails -> ShowS
Prelude.Show, forall x. Rep InstanceDetails x -> InstanceDetails
forall x. InstanceDetails -> Rep InstanceDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InstanceDetails x -> InstanceDetails
$cfrom :: forall x. InstanceDetails -> Rep InstanceDetails x
Prelude.Generic)

-- |
-- Create a value of 'InstanceDetails' 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:
--
-- 'eC2InstanceDetails', 'instanceDetails_eC2InstanceDetails' - The Amazon EC2 instances that Amazon Web Services recommends that you
-- purchase.
--
-- 'eSInstanceDetails', 'instanceDetails_eSInstanceDetails' - The Amazon OpenSearch Service instances that Amazon Web Services
-- recommends that you purchase.
--
-- 'elastiCacheInstanceDetails', 'instanceDetails_elastiCacheInstanceDetails' - The ElastiCache instances that Amazon Web Services recommends that you
-- purchase.
--
-- 'rDSInstanceDetails', 'instanceDetails_rDSInstanceDetails' - The Amazon RDS instances that Amazon Web Services recommends that you
-- purchase.
--
-- 'redshiftInstanceDetails', 'instanceDetails_redshiftInstanceDetails' - The Amazon Redshift instances that Amazon Web Services recommends that
-- you purchase.
newInstanceDetails ::
  InstanceDetails
newInstanceDetails :: InstanceDetails
newInstanceDetails =
  InstanceDetails'
    { $sel:eC2InstanceDetails:InstanceDetails' :: Maybe EC2InstanceDetails
eC2InstanceDetails =
        forall a. Maybe a
Prelude.Nothing,
      $sel:eSInstanceDetails:InstanceDetails' :: Maybe ESInstanceDetails
eSInstanceDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:elastiCacheInstanceDetails:InstanceDetails' :: Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:rDSInstanceDetails:InstanceDetails' :: Maybe RDSInstanceDetails
rDSInstanceDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:redshiftInstanceDetails:InstanceDetails' :: Maybe RedshiftInstanceDetails
redshiftInstanceDetails = forall a. Maybe a
Prelude.Nothing
    }

-- | The Amazon EC2 instances that Amazon Web Services recommends that you
-- purchase.
instanceDetails_eC2InstanceDetails :: Lens.Lens' InstanceDetails (Prelude.Maybe EC2InstanceDetails)
instanceDetails_eC2InstanceDetails :: Lens' InstanceDetails (Maybe EC2InstanceDetails)
instanceDetails_eC2InstanceDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceDetails' {Maybe EC2InstanceDetails
eC2InstanceDetails :: Maybe EC2InstanceDetails
$sel:eC2InstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe EC2InstanceDetails
eC2InstanceDetails} -> Maybe EC2InstanceDetails
eC2InstanceDetails) (\s :: InstanceDetails
s@InstanceDetails' {} Maybe EC2InstanceDetails
a -> InstanceDetails
s {$sel:eC2InstanceDetails:InstanceDetails' :: Maybe EC2InstanceDetails
eC2InstanceDetails = Maybe EC2InstanceDetails
a} :: InstanceDetails)

-- | The Amazon OpenSearch Service instances that Amazon Web Services
-- recommends that you purchase.
instanceDetails_eSInstanceDetails :: Lens.Lens' InstanceDetails (Prelude.Maybe ESInstanceDetails)
instanceDetails_eSInstanceDetails :: Lens' InstanceDetails (Maybe ESInstanceDetails)
instanceDetails_eSInstanceDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceDetails' {Maybe ESInstanceDetails
eSInstanceDetails :: Maybe ESInstanceDetails
$sel:eSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ESInstanceDetails
eSInstanceDetails} -> Maybe ESInstanceDetails
eSInstanceDetails) (\s :: InstanceDetails
s@InstanceDetails' {} Maybe ESInstanceDetails
a -> InstanceDetails
s {$sel:eSInstanceDetails:InstanceDetails' :: Maybe ESInstanceDetails
eSInstanceDetails = Maybe ESInstanceDetails
a} :: InstanceDetails)

-- | The ElastiCache instances that Amazon Web Services recommends that you
-- purchase.
instanceDetails_elastiCacheInstanceDetails :: Lens.Lens' InstanceDetails (Prelude.Maybe ElastiCacheInstanceDetails)
instanceDetails_elastiCacheInstanceDetails :: Lens' InstanceDetails (Maybe ElastiCacheInstanceDetails)
instanceDetails_elastiCacheInstanceDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceDetails' {Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails :: Maybe ElastiCacheInstanceDetails
$sel:elastiCacheInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails} -> Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails) (\s :: InstanceDetails
s@InstanceDetails' {} Maybe ElastiCacheInstanceDetails
a -> InstanceDetails
s {$sel:elastiCacheInstanceDetails:InstanceDetails' :: Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails = Maybe ElastiCacheInstanceDetails
a} :: InstanceDetails)

-- | The Amazon RDS instances that Amazon Web Services recommends that you
-- purchase.
instanceDetails_rDSInstanceDetails :: Lens.Lens' InstanceDetails (Prelude.Maybe RDSInstanceDetails)
instanceDetails_rDSInstanceDetails :: Lens' InstanceDetails (Maybe RDSInstanceDetails)
instanceDetails_rDSInstanceDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceDetails' {Maybe RDSInstanceDetails
rDSInstanceDetails :: Maybe RDSInstanceDetails
$sel:rDSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RDSInstanceDetails
rDSInstanceDetails} -> Maybe RDSInstanceDetails
rDSInstanceDetails) (\s :: InstanceDetails
s@InstanceDetails' {} Maybe RDSInstanceDetails
a -> InstanceDetails
s {$sel:rDSInstanceDetails:InstanceDetails' :: Maybe RDSInstanceDetails
rDSInstanceDetails = Maybe RDSInstanceDetails
a} :: InstanceDetails)

-- | The Amazon Redshift instances that Amazon Web Services recommends that
-- you purchase.
instanceDetails_redshiftInstanceDetails :: Lens.Lens' InstanceDetails (Prelude.Maybe RedshiftInstanceDetails)
instanceDetails_redshiftInstanceDetails :: Lens' InstanceDetails (Maybe RedshiftInstanceDetails)
instanceDetails_redshiftInstanceDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceDetails' {Maybe RedshiftInstanceDetails
redshiftInstanceDetails :: Maybe RedshiftInstanceDetails
$sel:redshiftInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RedshiftInstanceDetails
redshiftInstanceDetails} -> Maybe RedshiftInstanceDetails
redshiftInstanceDetails) (\s :: InstanceDetails
s@InstanceDetails' {} Maybe RedshiftInstanceDetails
a -> InstanceDetails
s {$sel:redshiftInstanceDetails:InstanceDetails' :: Maybe RedshiftInstanceDetails
redshiftInstanceDetails = Maybe RedshiftInstanceDetails
a} :: InstanceDetails)

instance Data.FromJSON InstanceDetails where
  parseJSON :: Value -> Parser InstanceDetails
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"InstanceDetails"
      ( \Object
x ->
          Maybe EC2InstanceDetails
-> Maybe ESInstanceDetails
-> Maybe ElastiCacheInstanceDetails
-> Maybe RDSInstanceDetails
-> Maybe RedshiftInstanceDetails
-> InstanceDetails
InstanceDetails'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"EC2InstanceDetails")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"ESInstanceDetails")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"ElastiCacheInstanceDetails")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"RDSInstanceDetails")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"RedshiftInstanceDetails")
      )

instance Prelude.Hashable InstanceDetails where
  hashWithSalt :: Int -> InstanceDetails -> Int
hashWithSalt Int
_salt InstanceDetails' {Maybe EC2InstanceDetails
Maybe ESInstanceDetails
Maybe ElastiCacheInstanceDetails
Maybe RDSInstanceDetails
Maybe RedshiftInstanceDetails
redshiftInstanceDetails :: Maybe RedshiftInstanceDetails
rDSInstanceDetails :: Maybe RDSInstanceDetails
elastiCacheInstanceDetails :: Maybe ElastiCacheInstanceDetails
eSInstanceDetails :: Maybe ESInstanceDetails
eC2InstanceDetails :: Maybe EC2InstanceDetails
$sel:redshiftInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RedshiftInstanceDetails
$sel:rDSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RDSInstanceDetails
$sel:elastiCacheInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ElastiCacheInstanceDetails
$sel:eSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ESInstanceDetails
$sel:eC2InstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe EC2InstanceDetails
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe EC2InstanceDetails
eC2InstanceDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ESInstanceDetails
eSInstanceDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RDSInstanceDetails
rDSInstanceDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RedshiftInstanceDetails
redshiftInstanceDetails

instance Prelude.NFData InstanceDetails where
  rnf :: InstanceDetails -> ()
rnf InstanceDetails' {Maybe EC2InstanceDetails
Maybe ESInstanceDetails
Maybe ElastiCacheInstanceDetails
Maybe RDSInstanceDetails
Maybe RedshiftInstanceDetails
redshiftInstanceDetails :: Maybe RedshiftInstanceDetails
rDSInstanceDetails :: Maybe RDSInstanceDetails
elastiCacheInstanceDetails :: Maybe ElastiCacheInstanceDetails
eSInstanceDetails :: Maybe ESInstanceDetails
eC2InstanceDetails :: Maybe EC2InstanceDetails
$sel:redshiftInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RedshiftInstanceDetails
$sel:rDSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe RDSInstanceDetails
$sel:elastiCacheInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ElastiCacheInstanceDetails
$sel:eSInstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe ESInstanceDetails
$sel:eC2InstanceDetails:InstanceDetails' :: InstanceDetails -> Maybe EC2InstanceDetails
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe EC2InstanceDetails
eC2InstanceDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ESInstanceDetails
eSInstanceDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ElastiCacheInstanceDetails
elastiCacheInstanceDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RDSInstanceDetails
rDSInstanceDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RedshiftInstanceDetails
redshiftInstanceDetails