{-# LANGUAGE FlexibleContexts, RankNTypes, TypeFamilies #-}
{-# OPTIONS_GHC -F -pgmFtrhsx #-}
module Main where
import Control.Applicative
import Control.Concurrent (forkIO, killThread)
import Control.Monad (msum)
import Data.Acid
import qualified Data.Text as Text
import Happstack.Server
import Happstack.Server.HSP.HTML
import Happstack.State (waitForTermination)
import qualified HSX.XMLGenerator as HSX
import HSP
import Survey.Types
import Survey.State
import Survey.Routing
import Survey.URL (SurveyURL)
import qualified Survey.URL as URL
import Web.Routes
import Web.Routes.Happstack
import Web.Routes.XMLGenT
-- TODO: test that jquery and jquery-ui are installed
main :: IO ()
main =
do acid <- openAcidState initialSurveyState
tid <- forkIO $ simpleHTTP nullConf $ do decodeBody (defaultBodyPolicy "/tmp/" 0 1024 1024)
msum [ dir "reset" $ do survey <- update' acid NewSurvey
mapM (\(q, c) -> update' acid (NewItemToSurvey (surveyId survey) q c)) defaultSurveys
seeOther "/" (toResponse ())
, dir "jquery" $ serveDirectory DisableBrowsing [] "/usr/share/javascript/jquery/"
, dir "jquery-ui" $ serveDirectory DisableBrowsing [] "/usr/share/javascript/jquery-ui/"
, implSite "http://localhost:8000/" "web/" (site acid)
]
putStrLn "started.."
waitForTermination
killThread tid
closeAcidState acid
template ::
forall headers body. ( EmbedAsChild (RouteT SurveyURL (ServerPartT IO)) headers
, EmbedAsChild (RouteT SurveyURL (ServerPartT IO)) body
) =>
String -> headers -> body -> RouteT SurveyURL (ServerPartT IO) Response
template t h b =
do hXml <- unXMLGenT $ asChild h
eXml <- unXMLGenT $ asChild extraHeaders
xml <- defaultTemplate t (hXml ++ eXml) b
return $ toResponse xml
where
extraHeaders :: [XMLGenT (RouteT SurveyURL (ServerPartT IO)) XML]
extraHeaders =
[
,
]
site :: (AcidState SurveyState) -> Site SurveyURL (ServerPartT IO Response)
site acid =
Site { handleSite = handleSurveyURL acid
, formatPathSegments = \u -> (toPathSegments u, [])
, parsePathSegments = parseSegments fromPathSegments
}
handleSurveyURL :: (AcidState SurveyState)
-> (SurveyURL -> [(String, String)] -> String)
-> SurveyURL
-> ServerPartT IO Response
handleSurveyURL acid showFn url =
unRouteT (route template acid url) showFn
defaultSurveys :: [(Question, Choices)]
defaultSurveys =
[ (QuestionText (Text.pack "You a rar?")
, ChoiceTrueFalse
)
]