packages feed

charade-0.1.1.1: src/Charade.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}
module Main where

-------------------------------------------------------------------------------
import           Control.Lens hiding (elements)
import qualified Data.Configurator as C
import           Data.Maybe
import           Data.Monoid
import           Heist
import           Heist.Charade
import           Snap
import           Snap.Extras.SpliceUtils.Interpreted
import           Snap.Extras.Tabs
import           Snap.Util.FileServe
import           Snap.Snaplet.Heist
import           System.FilePath
------------------------------------------------------------------------------


data App = App
    { _heist :: Snaplet (Heist App)
    }

makeLenses ''App

instance HasHeist App where
    heistLens = subSnaplet heist

------------------------------------------------------------------------------
-- The web app
------------------------------------------------------------------------------

charadeAppInit :: SnapletInit App App
charadeAppInit = makeSnaplet "charade" "A heist charade" Nothing $ do
    rootDir <- getSnapletFilePath
    cfg <- getSnapletUserConfig
    tdir <- liftM (fromMaybe (error "Must specify tdir in charade.cfg")) $
              liftIO $ C.lookup cfg "tdir"
    staticRoute <- liftIO $ C.lookupDefault
      (error "charade: Must specify staticRoute in charade.cfg")
      cfg "staticRoute"
    staticDir <- liftIO $ C.lookupDefault
      (error "charade: Must specify staticDir in charade.cfg")
      cfg "staticDir"

    -- I didn't use the "templates" directory like we usually use.  This
    -- probably needs to be a configurable parameter.
    h <- nestSnaplet "heist" heist $
           heistInit' "" $ mempty { hcLoadTimeSplices = defaultLoadTimeSplices
                                  , hcInterpretedSplices =
                                      "staticscripts" ## scriptsSplice "static/js" "/"
                                  }
    addRoutes [ ("",          heistServe)
              , ("heist/heistReload", with heist $ failIfNotLocal heistReloader)
              , (staticRoute, serveDirectory staticDir)
              ]

    initTabs h
    addTemplatesAt h "" (rootDir </> tdir)

    charadeInit h cfg
    return $ App h

main :: IO ()
main = do
  (_,s,_) <- runSnaplet (Just "charade") charadeAppInit
  quickHttpServe s