stackctl-1.1.0.0: src/Stackctl/Spec/Capture.hs
module Stackctl.Spec.Capture
( CaptureOptions(..)
, runCaptureOptions
, runCapture
) where
import Stackctl.Prelude
import Options.Applicative
import Stackctl.AWS
import Stackctl.AWS.Scope
import Stackctl.DirectoryOption (HasDirectoryOption(..))
import Stackctl.Spec.Generate
data CaptureOptions = CaptureOptions
{ scoAccountName :: Maybe Text
, scoTemplatePath :: Maybe FilePath
, scoStackPath :: Maybe FilePath
, scoDepends :: Maybe [StackName]
, scoStackName :: StackName
}
-- brittany-disable-next-binding
runCaptureOptions :: Parser CaptureOptions
runCaptureOptions = CaptureOptions
<$> optional (strOption
( short 'n'
<> long "account-name"
<> metavar "NAME"
<> help "Account name to use in generated files"
))
<*> optional (strOption
( short 't'
<> long "template-path"
<> metavar "PATH"
<> help "Write Template to PATH. Default is based on STACK"
))
<*> optional (strOption
( short 'p'
<> long "path"
<> metavar "PATH"
<> help "Write specification to PATH. Default is based on STACK"
))
<*> optional (some (StackName <$> strOption
( long "depend"
<> metavar "STACK"
<> help "Add a dependency on STACK"
)))
<*> (StackName <$> argument str
( metavar "STACK"
<> help "Name of deployed Stack to capture"
))
runCapture
:: ( MonadMask m
, MonadUnliftIO m
, MonadResource m
, MonadLogger m
, MonadReader env m
, HasAwsScope env
, HasAwsEnv env
, HasDirectoryOption env
)
=> CaptureOptions
-> m ()
runCapture CaptureOptions {..} = do
dir <- view directoryOptionL
stack <- awsCloudFormationDescribeStack scoStackName
template <- awsCloudFormationGetTemplate scoStackName
let
setScopeName scope =
maybe scope (\name -> scope { awsAccountName = name }) scoAccountName
void $ local (awsScopeL %~ setScopeName) $ generate Generate
{ gOutputDirectory = dir
, gTemplatePath = scoTemplatePath
, gStackPath = scoStackPath
, gStackName = scoStackName
, gDepends = scoDepends
, gActions = Nothing
, gParameters = parameters stack
, gCapabilities = capabilities stack
, gTags = tags stack
, gTemplate = template
}