-- | Use the UpdatePolicy attribute to specify how AWS CloudFormation handles
-- updates to the AWS::AutoScaling::AutoScalingGroup resource. AWS
-- CloudFormation invokes one of three update policies depending on the type
-- of change you make or on whether a scheduled action is associated with the
-- Auto Scaling group.

module Stratosphere.ResourceAttributes.UpdatePolicy where

import Stratosphere.Prelude
import Stratosphere.Property
import Stratosphere.ResourceAttributes.AutoScalingReplacingUpdatePolicy
import Stratosphere.ResourceAttributes.AutoScalingRollingUpdatePolicy
import Stratosphere.ResourceAttributes.AutoScalingScheduledActionPolicy

import qualified Data.Aeson as JSON

-- | Full data type definition for UpdatePolicy. See 'mkUpdatePolicy' for a more
-- convenient constructor.
data UpdatePolicy = UpdatePolicy
  { UpdatePolicy -> Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
  , UpdatePolicy -> Maybe AutoScalingRollingUpdatePolicy
rollingUpdate   :: Maybe AutoScalingRollingUpdatePolicy
  , UpdatePolicy -> Maybe AutoScalingScheduledActionPolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
  }
  deriving (Int -> UpdatePolicy -> ShowS
[UpdatePolicy] -> ShowS
UpdatePolicy -> String
(Int -> UpdatePolicy -> ShowS)
-> (UpdatePolicy -> String)
-> ([UpdatePolicy] -> ShowS)
-> Show UpdatePolicy
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UpdatePolicy -> ShowS
showsPrec :: Int -> UpdatePolicy -> ShowS
$cshow :: UpdatePolicy -> String
show :: UpdatePolicy -> String
$cshowList :: [UpdatePolicy] -> ShowS
showList :: [UpdatePolicy] -> ShowS
Show, UpdatePolicy -> UpdatePolicy -> Bool
(UpdatePolicy -> UpdatePolicy -> Bool)
-> (UpdatePolicy -> UpdatePolicy -> Bool) -> Eq UpdatePolicy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UpdatePolicy -> UpdatePolicy -> Bool
== :: UpdatePolicy -> UpdatePolicy -> Bool
$c/= :: UpdatePolicy -> UpdatePolicy -> Bool
/= :: UpdatePolicy -> UpdatePolicy -> Bool
Eq, (forall x. UpdatePolicy -> Rep UpdatePolicy x)
-> (forall x. Rep UpdatePolicy x -> UpdatePolicy)
-> Generic UpdatePolicy
forall x. Rep UpdatePolicy x -> UpdatePolicy
forall x. UpdatePolicy -> Rep UpdatePolicy x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UpdatePolicy -> Rep UpdatePolicy x
from :: forall x. UpdatePolicy -> Rep UpdatePolicy x
$cto :: forall x. Rep UpdatePolicy x -> UpdatePolicy
to :: forall x. Rep UpdatePolicy x -> UpdatePolicy
Generic)

instance Property "ReplacingUpdate" UpdatePolicy where
  type PropertyType "ReplacingUpdate" UpdatePolicy = AutoScalingReplacingUpdatePolicy
  set :: PropertyType "ReplacingUpdate" UpdatePolicy
-> UpdatePolicy -> UpdatePolicy
set PropertyType "ReplacingUpdate" UpdatePolicy
newValue UpdatePolicy{Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingRollingUpdatePolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: UpdatePolicy -> Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: UpdatePolicy -> Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: UpdatePolicy -> Maybe AutoScalingScheduledActionPolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..} = UpdatePolicy{replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate = AutoScalingReplacingUpdatePolicy
-> Maybe AutoScalingReplacingUpdatePolicy
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PropertyType "ReplacingUpdate" UpdatePolicy
AutoScalingReplacingUpdatePolicy
newValue, Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingRollingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..}

instance Property "RollingUpdate" UpdatePolicy where
  type PropertyType "RollingUpdate" UpdatePolicy = AutoScalingRollingUpdatePolicy
  set :: PropertyType "RollingUpdate" UpdatePolicy
-> UpdatePolicy -> UpdatePolicy
set PropertyType "RollingUpdate" UpdatePolicy
newValue UpdatePolicy{Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingRollingUpdatePolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: UpdatePolicy -> Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: UpdatePolicy -> Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: UpdatePolicy -> Maybe AutoScalingScheduledActionPolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..} = UpdatePolicy{rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
rollingUpdate = AutoScalingRollingUpdatePolicy
-> Maybe AutoScalingRollingUpdatePolicy
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PropertyType "RollingUpdate" UpdatePolicy
AutoScalingRollingUpdatePolicy
newValue, Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..}

instance Property "ScheduledAction" UpdatePolicy where
  type PropertyType "ScheduledAction" UpdatePolicy = AutoScalingScheduledActionPolicy
  set :: PropertyType "ScheduledAction" UpdatePolicy
-> UpdatePolicy -> UpdatePolicy
set PropertyType "ScheduledAction" UpdatePolicy
newValue UpdatePolicy{Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingRollingUpdatePolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: UpdatePolicy -> Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: UpdatePolicy -> Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: UpdatePolicy -> Maybe AutoScalingScheduledActionPolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..} = UpdatePolicy{scheduledAction :: Maybe AutoScalingScheduledActionPolicy
scheduledAction = AutoScalingScheduledActionPolicy
-> Maybe AutoScalingScheduledActionPolicy
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PropertyType "ScheduledAction" UpdatePolicy
AutoScalingScheduledActionPolicy
newValue, Maybe AutoScalingRollingUpdatePolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
..}

instance JSON.ToJSON UpdatePolicy where
  toJSON :: UpdatePolicy -> Value
toJSON UpdatePolicy{Maybe AutoScalingScheduledActionPolicy
Maybe AutoScalingRollingUpdatePolicy
Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate :: UpdatePolicy -> Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: UpdatePolicy -> Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: UpdatePolicy -> Maybe AutoScalingScheduledActionPolicy
replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
scheduledAction :: Maybe AutoScalingScheduledActionPolicy
..}
    = [Pair] -> Value
JSON.object
    ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
    [ (AutoScalingReplacingUpdatePolicy -> Pair)
-> Maybe AutoScalingReplacingUpdatePolicy -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Key
"ReplacingUpdate",) (Value -> Pair)
-> (AutoScalingReplacingUpdatePolicy -> Value)
-> AutoScalingReplacingUpdatePolicy
-> Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AutoScalingReplacingUpdatePolicy -> Value
forall a. ToJSON a => a -> Value
JSON.toJSON) Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate
    , (AutoScalingRollingUpdatePolicy -> Pair)
-> Maybe AutoScalingRollingUpdatePolicy -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Key
"RollingUpdate",) (Value -> Pair)
-> (AutoScalingRollingUpdatePolicy -> Value)
-> AutoScalingRollingUpdatePolicy
-> Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AutoScalingRollingUpdatePolicy -> Value
forall a. ToJSON a => a -> Value
JSON.toJSON) Maybe AutoScalingRollingUpdatePolicy
rollingUpdate
    , (AutoScalingScheduledActionPolicy -> Pair)
-> Maybe AutoScalingScheduledActionPolicy -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Key
"ScheduledAction",) (Value -> Pair)
-> (AutoScalingScheduledActionPolicy -> Value)
-> AutoScalingScheduledActionPolicy
-> Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AutoScalingScheduledActionPolicy -> Value
forall a. ToJSON a => a -> Value
JSON.toJSON) Maybe AutoScalingScheduledActionPolicy
scheduledAction
    ]

-- | Constructor for 'UpdatePolicy' containing required fields as arguments.
mkUpdatePolicy :: UpdatePolicy
mkUpdatePolicy :: UpdatePolicy
mkUpdatePolicy =
  UpdatePolicy
  { replacingUpdate :: Maybe AutoScalingReplacingUpdatePolicy
replacingUpdate = Maybe AutoScalingReplacingUpdatePolicy
forall a. Maybe a
Nothing
  , rollingUpdate :: Maybe AutoScalingRollingUpdatePolicy
rollingUpdate   = Maybe AutoScalingRollingUpdatePolicy
forall a. Maybe a
Nothing
  , scheduledAction :: Maybe AutoScalingScheduledActionPolicy
scheduledAction = Maybe AutoScalingScheduledActionPolicy
forall a. Maybe a
Nothing
  }