packages feed

headroom-0.1.3.0: src/Headroom/Template.hs

{-|
Module      : Headroom.Template
Description : Generic support for license header templates
Copyright   : (c) 2019-2020 Vaclav Svejcar
License     : BSD-3
Maintainer  : vaclav.svejcar@gmail.com
Stability   : experimental
Portability : POSIX

Provides generic support for the license header templates, represented by the
'Template' type class. Various implementations can be plugged in by creating
custom instance of this type class.
-}
{-# LANGUAGE NoImplicitPrelude #-}
module Headroom.Template
  ( Template(..)
  , loadTemplate
  )
where

import           Headroom.FileSystem            ( loadFile )
import           RIO
import qualified RIO.Text                      as T


-- | Type class representing generic license header template support.
class Template t where
  -- | Returns list of supported file extensions for this template type.
  templateExtensions :: proxy t        -- ^ phantom parameter, not used
                     -> NonEmpty Text  -- ^ list of supported file extensions

  -- | Parses template from given raw text.
  parseTemplate :: MonadThrow m
                => Maybe Text -- ^ name of the template (optional)
                -> Text       -- ^ raw template text
                -> m t        -- ^ parsed template

  -- | Renders parsed template and replaces all variables.
  renderTemplate :: MonadThrow m
                => HashMap Text Text    -- ^ variables to replace
                -> t                    -- ^ parsed template to render
                -> m Text               -- ^ rendered template text

-- | Loads and parses template from file.
loadTemplate :: (MonadIO m, Template t)
             => FilePath -- ^ path to template file
             -> m t      -- ^ loaded and parsed template
loadTemplate path = do
  raw <- loadFile path
  liftIO $ parseTemplate (Just $ T.pack path) raw