module SitePipe.Templating
( renderTemplate
) where
import qualified Text.Mustache as M
import qualified Data.Text as T
import Data.Text.Lens
import Control.Lens
import Data.Aeson.Lens
import Data.Aeson.Types
import SitePipe.Types
import Control.Monad.Writer
import Control.Monad.Reader
import qualified Text.Mustache.Types as MT
renderTemplate :: (ToJSON env) => M.Template -> env -> SiteM String
renderTemplate template (toJSON -> env) = do
gContext <- asks globalContext
let fullContext = addContext gContext (MT.toMustache env)
case M.checkedSubstitute template fullContext of
([], result) -> return (T.unpack result)
(errs, r) -> do
tell $ ["*** Warnings rendering " ++ path ++ "***"] ++ (fmap show errs) ++ ["------"]
return (T.unpack r)
where
path = env ^. key "filepath" . _String . unpacked
addContext (MT.Object context) (MT.Object e) = MT.Object (context <> e)
addContext _ e = e