packages feed

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