-- | Some utilities for common uses of Template Haskell.
module Canteven.Template (
    readFileAsStrLiteral,
    readFileAsMarkdown
    ) where

import Data.Default (def)
import Data.Functor ((<$>))
import Language.Haskell.TH (Exp, Q, runIO, stringE)
import Language.Haskell.TH.Syntax (qAddDependentFile)
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Markdown (markdown)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TLE

-- | Read a file from disk at compile time and provide it as a string literal.
readFileAsStrLiteral
    :: FilePath
       -- ^ The compile-time location of the file to read.
    -> Q Exp
readFileAsStrLiteral path = do
    qAddDependentFile path
    contents <- runIO $ readFile path
    stringE contents

-- | Read a Markdown file from disk at compile time and render it as HTML.  The
-- resulting `Q Exp` is a string literal containing the HTML output.
readFileAsMarkdown
    :: FilePath
       -- ^ The compile-time location of the file to read.
    -> Q Exp
readFileAsMarkdown filename = do
    qAddDependentFile filename
    fileContent <- runIO $ TLE.decodeUtf8 <$> LBS.readFile filename
    stringE $ renderMarkdown fileContent
  where
    renderMarkdown :: TL.Text -> String
    renderMarkdown = renderHtml . markdown def