module Network.CloudSeeder.DSL
( DeploymentConfiguration(..)
, StackConfiguration(..)
, environmentVariables
, name
, stacks
, deployment
, environment
, stack_
, stack
)
where
import Control.Lens ((%=))
import Control.Monad.State (StateT, execStateT, lift)
import Control.Lens.TH (makeFields)
import qualified Data.Text as T
data DeploymentConfiguration = DeploymentConfiguration
{ _deploymentConfigurationName :: T.Text
, _deploymentConfigurationEnvironmentVariables :: [T.Text]
, _deploymentConfigurationStacks :: [StackConfiguration]
} deriving (Eq, Show)
data StackConfiguration = StackConfiguration
{ _stackConfigurationName :: T.Text
, _stackConfigurationEnvironmentVariables :: [T.Text]
} deriving (Eq, Show)
makeFields ''DeploymentConfiguration
makeFields ''StackConfiguration
deployment :: Monad m => T.Text -> StateT DeploymentConfiguration m a -> m DeploymentConfiguration
deployment name' x =
let config = DeploymentConfiguration name' [] []
in execStateT x config
environment :: (Monad m, HasEnvironmentVariables a [T.Text]) => [T.Text] -> StateT a m ()
environment vars = environmentVariables %= (++ vars)
stack_ :: Monad m => T.Text -> StateT DeploymentConfiguration m ()
stack_ name' = stack name' $ return ()
stack :: Monad m => T.Text -> StateT StackConfiguration m a -> StateT DeploymentConfiguration m ()
stack name' x = do
let stackConfig = StackConfiguration name' []
stackConfig' <- lift $ execStateT x stackConfig
stacks %= (++ [stackConfig'])