-- | Module containing the template data structure.
--
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Text.Hakyll.Internal.Template.Template
    ( Template (..)
    , TemplateElement (..)
    ) where

import Control.Applicative ((<$>))

import Data.Binary (Binary, get, getWord8, put, putWord8)

-- | Datatype used for template substitutions.
--
newtype Template = Template { unTemplate :: [TemplateElement] }
                 deriving (Show, Eq, Binary)

-- | Elements of a template.
--
data TemplateElement = Chunk String
                     | Identifier String
                     | EscapeCharacter
                     deriving (Show, Eq)

instance Binary TemplateElement where
    put (Chunk string)    = putWord8 0 >> put string
    put (Identifier key)  = putWord8 1 >> put key
    put (EscapeCharacter) = putWord8 2

    get = getWord8 >>= \tag ->
         case tag of 0 -> Chunk <$> get
                     1 -> Identifier <$> get
                     2 -> return EscapeCharacter
                     _ -> error "Error reading cached template"