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
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
}