Initial port to QuasiSite, rather rough

This commit is contained in:
Michael Snoyman 2010-04-20 08:52:19 -07:00
parent 99c0eb060b
commit c875c949fe
3 changed files with 24 additions and 14 deletions

View File

@ -147,11 +147,15 @@ getRouteMaster = do
runHandlerSub' :: HasReps c runHandlerSub' :: HasReps c
=> GHandler sub master c => GHandler sub master c
-> (master, master -> sub, Routes sub -> Routes master, Routes master -> String) -> (Routes master -> String)
-> Routes sub -> Routes sub
-> (Routes sub -> String) -> (Routes sub -> Routes master)
-> master
-> (master -> sub)
-> String
-> YesodApp -> YesodApp
runHandlerSub' handler arg route render = runHandlerSub handler arg (Just route) render runHandlerSub' handler mrender surl tomurl marg tosarg _method =
runHandlerSub handler (marg, tosarg, tomurl, mrender) (Just surl) (mrender . tomurl)
runHandlerSub :: HasReps c runHandlerSub :: HasReps c
=> GHandler sub master c => GHandler sub master c

View File

@ -27,7 +27,7 @@ mkYesod name res = do
, crResources = res , crResources = res
, crSite = site , crSite = site
} }
return [tySyn, yes, x, y, z] return [tySyn, yes, x, {-y, -}z]
mkYesodSub :: String -> [Name] -> [Resource] -> Q [Dec] mkYesodSub :: String -> [Name] -> [Resource] -> Q [Dec]
mkYesodSub name ctxs res = do mkYesodSub name ctxs res = do
@ -55,4 +55,4 @@ mkYesodSub name ctxs res = do
let helper claz = ClassP claz [VarT man] let helper claz = ClassP claz [VarT man]
let ctxs' = map helper ctxs let ctxs' = map helper ctxs
let y' = ForallT [PlainTV man] ctxs' y let y' = ForallT [PlainTV man] ctxs' y
return [tySyn, x, SigD yname y', z] return [tySyn, x, {-SigD yname y',-} z]

View File

@ -23,6 +23,7 @@ import Data.Maybe (fromMaybe)
import Web.Mime import Web.Mime
import Web.Encodings (parseHttpAccept) import Web.Encodings (parseHttpAccept)
import Web.Routes (Site (..), encodePathInfo, decodePathInfo) import Web.Routes (Site (..), encodePathInfo, decodePathInfo)
import Web.Routes.Quasi (QuasiSite (..))
import Data.List (intercalate) import Data.List (intercalate)
import qualified Network.Wai as W import qualified Network.Wai as W
@ -37,7 +38,7 @@ import qualified Network.Wai.Handler.CGI as CGI
import System.Environment (getEnvironment) import System.Environment (getEnvironment)
class YesodSite y where class YesodSite y where
getSite :: Site (Routes y) (String -> YesodApp -> y -> YesodApp) getSite :: QuasiSite YesodApp (Routes y) y (Routes master) master
class YesodSite a => Yesod a where class YesodSite a => Yesod a where
-- | The encryption key to be used for encrypting client sessions. -- | The encryption key to be used for encrypting client sessions.
@ -156,18 +157,23 @@ toWaiApp' y resource session env = do
method = B8.unpack $ W.methodToBS $ W.requestMethod env method = B8.unpack $ W.methodToBS $ W.requestMethod env
types = httpAccept env types = httpAccept env
pathSegments = filter (not . null) $ cleanupSegments resource pathSegments = filter (not . null) $ cleanupSegments resource
eurl = parsePathSegments site pathSegments eurl = quasiParse site pathSegments
render u = approot y ++ '/' render u = approot y ++ '/'
: encodePathInfo (fixSegs $ formatPathSegments site u) : encodePathInfo (fixSegs $ quasiRender site u)
rr <- parseWaiRequest env session rr <- parseWaiRequest env session
onRequest y rr onRequest y rr
print pathSegments print pathSegments -- FIXME remove
let ya = case eurl of let ya = case eurl of
Left _ -> runHandler (errorHandler y NotFound) y Nothing render Nothing -> runHandler (errorHandler y NotFound) y Nothing render
Right url -> handleSite site render url method Just url -> quasiDispatch site
(badMethod method) y render
let url' = either (const Nothing) Just eurl url
let eh er = runHandler (errorHandler y er) y url' render id
y
id
(badMethod method)
method
let eh er = runHandler (errorHandler y er) y eurl render
unYesodApp ya eh rr types >>= responseToWaiResponse unYesodApp ya eh rr types >>= responseToWaiResponse
cleanupSegments :: [B.ByteString] -> [String] cleanupSegments :: [B.ByteString] -> [String]