project-forge-0.2.0.0: src/ProjectForge/Actions.hs
{-|
Functions for creating project initialization applications
-}
module ProjectForge.Actions (
createProjectTemplateAction
, defaultTemplateActionOpts
, TemplateLocation(..)
, TemplateActionOpts(..)
) where
import Blammo.Logging.Simple (MonadLogger)
import Control.Monad.IO.Class (MonadIO)
import Data.Aeson (ToJSON (toJSON))
import ProjectForge.Get (getProjectTemplateFromDir,
getProjectTemplateFromGit)
import ProjectForge.Get.Git (GitURL)
import ProjectForge.Render
-- | Location of template directory
data TemplateLocation =
Local FilePath
| Git GitURL
deriving (Eq, Show)
{-|
Options for compiling, rendering and writing a a @'ProjectTemplate'@.
-}
newtype TemplateActionOpts = MkTemplateActionOpts {
-- | The @'RenderTemplateOpts'@ for the action
renderOpts :: RenderTemplateOpts
}
-- | Default options
defaultTemplateActionOpts :: TemplateActionOpts
defaultTemplateActionOpts = MkTemplateActionOpts { renderOpts = defaultRenderTemplateOpts}
{-|
Create an @IO@ action that compiles, renders, and writes a @'ProjectTemplate'@.
-}
createProjectTemplateAction :: (MonadLogger m, MonadIO m, ToJSON a) =>
TemplateActionOpts
-> TemplateLocation
-> a -- ^ type which when converted via @'Data.Aeson.toJSON'@ contains values
-- to interpolate into the @'ProjectTemplate'@.
-> m ()
createProjectTemplateAction opts loc settings = do
let template = case loc of
Local dir -> getProjectTemplateFromDir dir
Git url -> getProjectTemplateFromGit Nothing url Nothing
values = toJSON settings
results <- (\x -> renderProjectTemplate (renderOpts opts) x values) =<< template
writeTemplateResult results