module Hack.Contrib.Press (renderToResponse, envToJS, defaultContext) where import Data.ByteString.Class import Data.Data import Hack import Text.JSON import Text.JSON.Generic (toJSON) import Text.Press.Run import qualified Hack -- converts a context and template name or body into a response renderToResponse :: Hack.Env -> String -> [JSValue] -> IO Response renderToResponse env filename context = runJSValuesWithPath sl filename >>= resultToResponse where sl = context ++ (defaultContext env) envToJS :: Hack.Env -> JSValue envToJS env = env' where env' = JSObject $ toJSObject [ ("requestMethod", toJSON . show $ requestMethod env), ("scriptName", toJSON $ scriptName env), ("queryString", toJSON $ queryString env), ("serverName", toJSON $ serverName env), ("serverPort", toJSON $ serverPort env), ("http", toJSON $ http env), ("hackVersion", toJSON $ hackVersion env), ("hackHeaders", toJSON $ hackHeaders env), ("hackUrlScheme", toJSON . show $ hackUrlScheme env) ] defaultContext :: Hack.Env -> [JSValue] defaultContext env = [JSObject $ toJSObject [("env", envToJS env)]] resultToResponse result = do case result of Left err -> error $ show err Right succ -> do return $ Hack.Response { status = 200, headers = [("Content-Type", "text/html")], body = toLazyByteString $ foldl (++) "" succ }