module Happstack.Server.Heist
( templateReloader
, templateServe
, render
) where
import Blaze.ByteString.Builder (toLazyByteString)
import Control.Monad (MonadPlus(mzero), msum)
import Control.Monad.Trans (MonadIO)
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy as L
import Happstack.Server (Response, ServerMonad, askRq, nullDir, rqPaths, toResponseBS)
import System.FilePath (joinPath)
import Text.Templating.Heist (renderTemplate)
import Text.Templating.Heist.TemplateDirectory (TemplateDirectory, getDirectoryTS, reloadTemplateDirectory)
templateServe :: (ServerMonad m, MonadPlus m, MonadIO m) =>
TemplateDirectory m
-> m Response
templateServe td =
msum [ nullDir >> render td (B.pack "index")
, do rq <- askRq
let safepath = joinPath $ filter (\x->not (null x) && x /= ".." && x /= ".") (rqPaths rq)
render td (B.pack safepath)
]
templateReloader :: (MonadIO m, MonadIO n) =>
TemplateDirectory m
-> n Response
templateReloader td = do
e <- reloadTemplateDirectory td
return $ toResponseBS (B.pack "text/plain; charset=utf-8") $
L.fromChunks [either B.pack (const $ B.pack "Templates loaded successfully.") e]
render:: (MonadPlus m, MonadIO m) =>
TemplateDirectory m
-> ByteString
-> m Response
render td template = do
ts <- getDirectoryTS td
t <- renderTemplate ts template
flip (maybe mzero) t $ \(builder, mimeType) -> do
return (toResponseBS mimeType (toLazyByteString builder))