module HAppS.Template.HSP ( WebState(..) , Web , runWeb , runWebXML , globalQuery , globalRead , simpleRequest , localQuery , localRead ) where import Text.RJson import Control.Monad.Reader import Control.Monad.Writer import Data.Monoid import qualified Data.Map as Map import qualified Data.ByteString.Lazy as Lazy import HAppS.Server.SimpleHTTP (Request(..),Method(..),Input,Cookie,RqBody(..)) import HAppS.Server.MessageWrap import HAppS.Server.SURI import Network.URI (parseRelativeReference,uriQuery) import HSP hiding (Request) nullRequest :: Request nullRequest = Request { rqMethod = GET , rqPaths = [] , rqQuery = "/" , rqInputs = [] , rqCookies = [] , rqVersion = error "version not set" , rqHeaders = error "headers not set" , rqBody = Body Lazy.empty , rqPeer = ("localhost", 0) } simpleRequest :: String -> Request simpleRequest query = case parseRelativeReference query of Nothing -> nullRequest Just uri -> nullRequest{rqQuery = uriQuery uri ,rqPaths = pathEls (path $ SURI uri) ,rqInputs = queryInput (SURI uri)} data WebState = WebState { queryGlobal :: Request -> IO JsonData , queryLocal :: Map.Map String JsonData } type Web = HSPT (WriterT (Endo XML) (ReaderT WebState IO)) runWeb :: WebState -> Web a -> HSP a runWeb st web = do env <- getEnv (xml,Endo w) <- liftIO $ runReaderT (runWriterT $ runHSPT web env) st return $ xml runWebXML :: WebState -> Web XML -> HSP XML runWebXML st web = do env <- getEnv (xml,Endo w) <- liftIO $ runReaderT (runWriterT $ runHSPT web env) st return $ w xml globalQuery :: Request -> Web JsonData globalQuery key = do fn <- lift $ lift $ asks queryGlobal liftIO $ fn key localQuery :: String -> Web JsonData localQuery key = do m <- lift $ lift $ asks queryLocal return $ Map.findWithDefault (JDString $ "Lookup failed: " ++ key) key m globalRead :: FromJson a => Request -> Web a globalRead key = do json <- globalQuery key case fromJson undefined json of Left err -> error err Right val -> return val localRead :: FromJson a => String -> Web a localRead key = do json <- localQuery key case fromJson undefined json of Left err -> error err Right val -> return val