{-# 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.Budgets.Types.Definition
-- 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.Budgets.Types.Definition where

import Amazonka.Budgets.Types.IamActionDefinition
import Amazonka.Budgets.Types.ScpActionDefinition
import Amazonka.Budgets.Types.SsmActionDefinition
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | Specifies all of the type-specific parameters.
--
-- /See:/ 'newDefinition' smart constructor.
data Definition = Definition'
  { -- | The Identity and Access Management (IAM) action definition details.
    Definition -> Maybe IamActionDefinition
iamActionDefinition :: Prelude.Maybe IamActionDefinition,
    -- | The service control policies (SCPs) action definition details.
    Definition -> Maybe ScpActionDefinition
scpActionDefinition :: Prelude.Maybe ScpActionDefinition,
    -- | The Amazon Web Services Systems Manager (SSM) action definition details.
    Definition -> Maybe SsmActionDefinition
ssmActionDefinition :: Prelude.Maybe SsmActionDefinition
  }
  deriving (Definition -> Definition -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Definition -> Definition -> Bool
$c/= :: Definition -> Definition -> Bool
== :: Definition -> Definition -> Bool
$c== :: Definition -> Definition -> Bool
Prelude.Eq, ReadPrec [Definition]
ReadPrec Definition
Int -> ReadS Definition
ReadS [Definition]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Definition]
$creadListPrec :: ReadPrec [Definition]
readPrec :: ReadPrec Definition
$creadPrec :: ReadPrec Definition
readList :: ReadS [Definition]
$creadList :: ReadS [Definition]
readsPrec :: Int -> ReadS Definition
$creadsPrec :: Int -> ReadS Definition
Prelude.Read, Int -> Definition -> ShowS
[Definition] -> ShowS
Definition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Definition] -> ShowS
$cshowList :: [Definition] -> ShowS
show :: Definition -> String
$cshow :: Definition -> String
showsPrec :: Int -> Definition -> ShowS
$cshowsPrec :: Int -> Definition -> ShowS
Prelude.Show, forall x. Rep Definition x -> Definition
forall x. Definition -> Rep Definition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Definition x -> Definition
$cfrom :: forall x. Definition -> Rep Definition x
Prelude.Generic)

-- |
-- Create a value of 'Definition' 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:
--
-- 'iamActionDefinition', 'definition_iamActionDefinition' - The Identity and Access Management (IAM) action definition details.
--
-- 'scpActionDefinition', 'definition_scpActionDefinition' - The service control policies (SCPs) action definition details.
--
-- 'ssmActionDefinition', 'definition_ssmActionDefinition' - The Amazon Web Services Systems Manager (SSM) action definition details.
newDefinition ::
  Definition
newDefinition :: Definition
newDefinition =
  Definition'
    { $sel:iamActionDefinition:Definition' :: Maybe IamActionDefinition
iamActionDefinition = forall a. Maybe a
Prelude.Nothing,
      $sel:scpActionDefinition:Definition' :: Maybe ScpActionDefinition
scpActionDefinition = forall a. Maybe a
Prelude.Nothing,
      $sel:ssmActionDefinition:Definition' :: Maybe SsmActionDefinition
ssmActionDefinition = forall a. Maybe a
Prelude.Nothing
    }

-- | The Identity and Access Management (IAM) action definition details.
definition_iamActionDefinition :: Lens.Lens' Definition (Prelude.Maybe IamActionDefinition)
definition_iamActionDefinition :: Lens' Definition (Maybe IamActionDefinition)
definition_iamActionDefinition = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Definition' {Maybe IamActionDefinition
iamActionDefinition :: Maybe IamActionDefinition
$sel:iamActionDefinition:Definition' :: Definition -> Maybe IamActionDefinition
iamActionDefinition} -> Maybe IamActionDefinition
iamActionDefinition) (\s :: Definition
s@Definition' {} Maybe IamActionDefinition
a -> Definition
s {$sel:iamActionDefinition:Definition' :: Maybe IamActionDefinition
iamActionDefinition = Maybe IamActionDefinition
a} :: Definition)

-- | The service control policies (SCPs) action definition details.
definition_scpActionDefinition :: Lens.Lens' Definition (Prelude.Maybe ScpActionDefinition)
definition_scpActionDefinition :: Lens' Definition (Maybe ScpActionDefinition)
definition_scpActionDefinition = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Definition' {Maybe ScpActionDefinition
scpActionDefinition :: Maybe ScpActionDefinition
$sel:scpActionDefinition:Definition' :: Definition -> Maybe ScpActionDefinition
scpActionDefinition} -> Maybe ScpActionDefinition
scpActionDefinition) (\s :: Definition
s@Definition' {} Maybe ScpActionDefinition
a -> Definition
s {$sel:scpActionDefinition:Definition' :: Maybe ScpActionDefinition
scpActionDefinition = Maybe ScpActionDefinition
a} :: Definition)

-- | The Amazon Web Services Systems Manager (SSM) action definition details.
definition_ssmActionDefinition :: Lens.Lens' Definition (Prelude.Maybe SsmActionDefinition)
definition_ssmActionDefinition :: Lens' Definition (Maybe SsmActionDefinition)
definition_ssmActionDefinition = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Definition' {Maybe SsmActionDefinition
ssmActionDefinition :: Maybe SsmActionDefinition
$sel:ssmActionDefinition:Definition' :: Definition -> Maybe SsmActionDefinition
ssmActionDefinition} -> Maybe SsmActionDefinition
ssmActionDefinition) (\s :: Definition
s@Definition' {} Maybe SsmActionDefinition
a -> Definition
s {$sel:ssmActionDefinition:Definition' :: Maybe SsmActionDefinition
ssmActionDefinition = Maybe SsmActionDefinition
a} :: Definition)

instance Data.FromJSON Definition where
  parseJSON :: Value -> Parser Definition
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Definition"
      ( \Object
x ->
          Maybe IamActionDefinition
-> Maybe ScpActionDefinition
-> Maybe SsmActionDefinition
-> Definition
Definition'
            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
"IamActionDefinition")
            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
"ScpActionDefinition")
            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
"SsmActionDefinition")
      )

instance Prelude.Hashable Definition where
  hashWithSalt :: Int -> Definition -> Int
hashWithSalt Int
_salt Definition' {Maybe IamActionDefinition
Maybe ScpActionDefinition
Maybe SsmActionDefinition
ssmActionDefinition :: Maybe SsmActionDefinition
scpActionDefinition :: Maybe ScpActionDefinition
iamActionDefinition :: Maybe IamActionDefinition
$sel:ssmActionDefinition:Definition' :: Definition -> Maybe SsmActionDefinition
$sel:scpActionDefinition:Definition' :: Definition -> Maybe ScpActionDefinition
$sel:iamActionDefinition:Definition' :: Definition -> Maybe IamActionDefinition
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe IamActionDefinition
iamActionDefinition
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ScpActionDefinition
scpActionDefinition
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SsmActionDefinition
ssmActionDefinition

instance Prelude.NFData Definition where
  rnf :: Definition -> ()
rnf Definition' {Maybe IamActionDefinition
Maybe ScpActionDefinition
Maybe SsmActionDefinition
ssmActionDefinition :: Maybe SsmActionDefinition
scpActionDefinition :: Maybe ScpActionDefinition
iamActionDefinition :: Maybe IamActionDefinition
$sel:ssmActionDefinition:Definition' :: Definition -> Maybe SsmActionDefinition
$sel:scpActionDefinition:Definition' :: Definition -> Maybe ScpActionDefinition
$sel:iamActionDefinition:Definition' :: Definition -> Maybe IamActionDefinition
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe IamActionDefinition
iamActionDefinition
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ScpActionDefinition
scpActionDefinition
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SsmActionDefinition
ssmActionDefinition

instance Data.ToJSON Definition where
  toJSON :: Definition -> Value
toJSON Definition' {Maybe IamActionDefinition
Maybe ScpActionDefinition
Maybe SsmActionDefinition
ssmActionDefinition :: Maybe SsmActionDefinition
scpActionDefinition :: Maybe ScpActionDefinition
iamActionDefinition :: Maybe IamActionDefinition
$sel:ssmActionDefinition:Definition' :: Definition -> Maybe SsmActionDefinition
$sel:scpActionDefinition:Definition' :: Definition -> Maybe ScpActionDefinition
$sel:iamActionDefinition:Definition' :: Definition -> Maybe IamActionDefinition
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"IamActionDefinition" 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 IamActionDefinition
iamActionDefinition,
            (Key
"ScpActionDefinition" 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 ScpActionDefinition
scpActionDefinition,
            (Key
"SsmActionDefinition" 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 SsmActionDefinition
ssmActionDefinition
          ]
      )