{-# 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.ElasticSearch.Types.Limits
-- 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.ElasticSearch.Types.Limits where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.ElasticSearch.Types.AdditionalLimit
import Amazonka.ElasticSearch.Types.InstanceLimits
import Amazonka.ElasticSearch.Types.StorageType
import qualified Amazonka.Prelude as Prelude

-- | Limits for given InstanceType and for each of it\'s role.
-- Limits contains following @ @@StorageTypes,@@ @ @ @@InstanceLimits@@ @
-- and @ @@AdditionalLimits@@ @
--
-- /See:/ 'newLimits' smart constructor.
data Limits = Limits'
  { -- | List of additional limits that are specific to a given InstanceType and
    -- for each of it\'s @ @@InstanceRole@@ @ .
    Limits -> Maybe [AdditionalLimit]
additionalLimits :: Prelude.Maybe [AdditionalLimit],
    Limits -> Maybe InstanceLimits
instanceLimits :: Prelude.Maybe InstanceLimits,
    -- | StorageType represents the list of storage related types and attributes
    -- that are available for given InstanceType.
    Limits -> Maybe [StorageType]
storageTypes :: Prelude.Maybe [StorageType]
  }
  deriving (Limits -> Limits -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Limits -> Limits -> Bool
$c/= :: Limits -> Limits -> Bool
== :: Limits -> Limits -> Bool
$c== :: Limits -> Limits -> Bool
Prelude.Eq, ReadPrec [Limits]
ReadPrec Limits
Int -> ReadS Limits
ReadS [Limits]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Limits]
$creadListPrec :: ReadPrec [Limits]
readPrec :: ReadPrec Limits
$creadPrec :: ReadPrec Limits
readList :: ReadS [Limits]
$creadList :: ReadS [Limits]
readsPrec :: Int -> ReadS Limits
$creadsPrec :: Int -> ReadS Limits
Prelude.Read, Int -> Limits -> ShowS
[Limits] -> ShowS
Limits -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Limits] -> ShowS
$cshowList :: [Limits] -> ShowS
show :: Limits -> String
$cshow :: Limits -> String
showsPrec :: Int -> Limits -> ShowS
$cshowsPrec :: Int -> Limits -> ShowS
Prelude.Show, forall x. Rep Limits x -> Limits
forall x. Limits -> Rep Limits x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Limits x -> Limits
$cfrom :: forall x. Limits -> Rep Limits x
Prelude.Generic)

-- |
-- Create a value of 'Limits' 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:
--
-- 'additionalLimits', 'limits_additionalLimits' - List of additional limits that are specific to a given InstanceType and
-- for each of it\'s @ @@InstanceRole@@ @ .
--
-- 'instanceLimits', 'limits_instanceLimits' - Undocumented member.
--
-- 'storageTypes', 'limits_storageTypes' - StorageType represents the list of storage related types and attributes
-- that are available for given InstanceType.
newLimits ::
  Limits
newLimits :: Limits
newLimits =
  Limits'
    { $sel:additionalLimits:Limits' :: Maybe [AdditionalLimit]
additionalLimits = forall a. Maybe a
Prelude.Nothing,
      $sel:instanceLimits:Limits' :: Maybe InstanceLimits
instanceLimits = forall a. Maybe a
Prelude.Nothing,
      $sel:storageTypes:Limits' :: Maybe [StorageType]
storageTypes = forall a. Maybe a
Prelude.Nothing
    }

-- | List of additional limits that are specific to a given InstanceType and
-- for each of it\'s @ @@InstanceRole@@ @ .
limits_additionalLimits :: Lens.Lens' Limits (Prelude.Maybe [AdditionalLimit])
limits_additionalLimits :: Lens' Limits (Maybe [AdditionalLimit])
limits_additionalLimits = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Limits' {Maybe [AdditionalLimit]
additionalLimits :: Maybe [AdditionalLimit]
$sel:additionalLimits:Limits' :: Limits -> Maybe [AdditionalLimit]
additionalLimits} -> Maybe [AdditionalLimit]
additionalLimits) (\s :: Limits
s@Limits' {} Maybe [AdditionalLimit]
a -> Limits
s {$sel:additionalLimits:Limits' :: Maybe [AdditionalLimit]
additionalLimits = Maybe [AdditionalLimit]
a} :: Limits) 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

-- | Undocumented member.
limits_instanceLimits :: Lens.Lens' Limits (Prelude.Maybe InstanceLimits)
limits_instanceLimits :: Lens' Limits (Maybe InstanceLimits)
limits_instanceLimits = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Limits' {Maybe InstanceLimits
instanceLimits :: Maybe InstanceLimits
$sel:instanceLimits:Limits' :: Limits -> Maybe InstanceLimits
instanceLimits} -> Maybe InstanceLimits
instanceLimits) (\s :: Limits
s@Limits' {} Maybe InstanceLimits
a -> Limits
s {$sel:instanceLimits:Limits' :: Maybe InstanceLimits
instanceLimits = Maybe InstanceLimits
a} :: Limits)

-- | StorageType represents the list of storage related types and attributes
-- that are available for given InstanceType.
limits_storageTypes :: Lens.Lens' Limits (Prelude.Maybe [StorageType])
limits_storageTypes :: Lens' Limits (Maybe [StorageType])
limits_storageTypes = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Limits' {Maybe [StorageType]
storageTypes :: Maybe [StorageType]
$sel:storageTypes:Limits' :: Limits -> Maybe [StorageType]
storageTypes} -> Maybe [StorageType]
storageTypes) (\s :: Limits
s@Limits' {} Maybe [StorageType]
a -> Limits
s {$sel:storageTypes:Limits' :: Maybe [StorageType]
storageTypes = Maybe [StorageType]
a} :: Limits) 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

instance Data.FromJSON Limits where
  parseJSON :: Value -> Parser Limits
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Limits"
      ( \Object
x ->
          Maybe [AdditionalLimit]
-> Maybe InstanceLimits -> Maybe [StorageType] -> Limits
Limits'
            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
"AdditionalLimits"
                            forall a. Parser (Maybe a) -> a -> Parser a
Data..!= forall a. Monoid a => a
Prelude.mempty
                        )
            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
"InstanceLimits")
            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
"StorageTypes" forall a. Parser (Maybe a) -> a -> Parser a
Data..!= forall a. Monoid a => a
Prelude.mempty)
      )

instance Prelude.Hashable Limits where
  hashWithSalt :: Int -> Limits -> Int
hashWithSalt Int
_salt Limits' {Maybe [AdditionalLimit]
Maybe [StorageType]
Maybe InstanceLimits
storageTypes :: Maybe [StorageType]
instanceLimits :: Maybe InstanceLimits
additionalLimits :: Maybe [AdditionalLimit]
$sel:storageTypes:Limits' :: Limits -> Maybe [StorageType]
$sel:instanceLimits:Limits' :: Limits -> Maybe InstanceLimits
$sel:additionalLimits:Limits' :: Limits -> Maybe [AdditionalLimit]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [AdditionalLimit]
additionalLimits
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe InstanceLimits
instanceLimits
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [StorageType]
storageTypes

instance Prelude.NFData Limits where
  rnf :: Limits -> ()
rnf Limits' {Maybe [AdditionalLimit]
Maybe [StorageType]
Maybe InstanceLimits
storageTypes :: Maybe [StorageType]
instanceLimits :: Maybe InstanceLimits
additionalLimits :: Maybe [AdditionalLimit]
$sel:storageTypes:Limits' :: Limits -> Maybe [StorageType]
$sel:instanceLimits:Limits' :: Limits -> Maybe InstanceLimits
$sel:additionalLimits:Limits' :: Limits -> Maybe [AdditionalLimit]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [AdditionalLimit]
additionalLimits
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe InstanceLimits
instanceLimits
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [StorageType]
storageTypes