{-| 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