-- | Read templates in the hamlet format
--
{-# LANGUAGE MultiParamTypeClasses #-}
module Hakyll.Web.Template.Read.Hamlet
    ( readHamletTemplate
    , readHamletTemplateWith
    ) where

import Text.Hamlet (HamletSettings (..), defaultHamletSettings)
import Text.Hamlet.RT

import Hakyll.Web.Template.Internal

-- | Read a hamlet template using the default settings
--
readHamletTemplate :: String -> Template
readHamletTemplate = readHamletTemplateWith defaultHamletSettings

-- | Read a hamlet template using the specified settings
--
readHamletTemplateWith :: HamletSettings -> String -> Template
readHamletTemplateWith settings string =
    let result = parseHamletRT settings string
    in case result of
        Just hamlet -> fromHamletRT hamlet
        Nothing     -> error
            "Hakyll.Web.Template.Read.Hamlet.readHamletTemplateWith: \
            \Could not parse Hamlet file"

-- | Convert a 'HamletRT' to a 'Template'
--
fromHamletRT :: HamletRT  -- ^ Hamlet runtime template
             -> Template  -- ^ Hakyll template
fromHamletRT (HamletRT sd) = Template $ map fromSimpleDoc sd
  where
    fromSimpleDoc :: SimpleDoc -> TemplateElement
    fromSimpleDoc (SDRaw chunk) = Chunk chunk
    fromSimpleDoc (SDVar [var]) = Key var
    fromSimpleDoc (SDVar _) = error
        "Hakyll.Web.Template.Read.Hamlet.fromHamletRT: \
        \Hakyll does not support '.' in identifier names when using \
        \hamlet templates."
    fromSimpleDoc _ = error
        "Hakyll.Web.Template.Read.Hamlet.fromHamletRT: \
        \Only simple $key$ identifiers are allowed when using hamlet \
        \templates."