    module Heist.Splices.Bind where

    ------------------------------------------------------------------------------
    import           Data.Text (Text)
    import qualified Data.Text as T
    import qualified Text.XmlHtml as X

    ------------------------------------------------------------------------------
    import           Heist.Common
    import           Heist.Interpreted.Internal
    import           Heist.Splices.Apply
    import           Heist.Internal.Types.HeistState

    -- | Default name for the bind splice.
    bindTag :: Text
    bindTag = "bind"

    ------------------------------------------------------------------------------
    -- | Default attribute name for the bind tag.
    bindAttr :: Text
    bindAttr = "tag"

    ------------------------------------------------------------------------------
    -- | Implementation of the bind splice.
    bindImpl :: Monad n => Splice n
    bindImpl = do
        node <- getParamNode
        let err = "must supply \"" ++ T.unpack bindAttr ++
                  "\" attribute in <" ++ T.unpack (X.elementTag node) ++ ">"
        maybe (return () `orError` err)
              (add node)
              (X.getAttribute bindAttr node)
        return []
      where
        add node nm = modifyHS $ bindSplice nm $ do
            caller <- getParamNode
            ctx <- getContext
            rawApply "bind-content" (X.childNodes node)
                     Nothing ctx (X.childNodes caller)