{-# LANGUAGE OverloadedStrings #-} {-| When starting a Snap app, the @-e@ command line flag indicates what runtime environment to run in. The default is @devel@ which will load all the @devel.cfg@ Snaplet config files. The 'Environment' module adds a splice to conditionally render a node list depending on the string passed to @-e@ on the command line. Here's an example: > initApp :: SnapletInit App App > initApp = makeSnaplet "app" "An snaplet example application." Nothing $ do > h <- nestSnaplet "heist" heist $ heistInit "templates" > addEnvironmentSplices h > return $ App h Then, in the Heist templates: > > > > > > > > The @\@ block will only render if the command line was passed @-e prod@. -} module Snap.Utils.Environment ( addEnvironmentSplices ) where import Control.Applicative ((<$>)) import Data.Maybe (fromMaybe) import Data.Monoid (mempty) import Data.Text (Text) import qualified Data.Text as T import Heist (HeistConfig (..), getParamNode) import Heist.Compiled (codeGen, runChildren, yieldRuntime) import Heist.SpliceAPI (( #! )) import Snap.Snaplet (Initializer, Snaplet, getEnvironment) import Snap.Snaplet.Heist (HasHeist, Heist, SnapletCSplice, SnapletISplice, addConfig) import Text.XmlHtml (Node (..), childNodes) -- | Add @\@ splices to Heist state. addEnvironmentSplices :: HasHeist b => Snaplet (Heist b) -> Initializer b v () addEnvironmentSplices h = do env <- T.pack <$> getEnvironment addConfig h $ mempty { hcCompiledSplices = "ifEnvironment" #! envCSplice env , hcInterpretedSplices = "ifEnvironment" #! envISplice env } envISplice :: Text -> SnapletISplice b envISplice env = do node <- getParamNode let env' = getAttribute node "name" return $ if env' == env then childNodes node else [] envCSplice :: Text -> SnapletCSplice b envCSplice env = do node <- getParamNode let env' = getAttribute node "name" children <- runChildren return . yieldRuntime $ if env' == env then codeGen children else mempty getAttribute :: Node -> Text -> Text getAttribute node attr = case node of Element _ as _ -> fromMaybe (error $ show node ++ ": missing " ++ T.unpack attr) $ lookup attr as _ -> error "Wrong type of node!"