Match refactorings in web-routes-quasi

This commit is contained in:
Michael Snoyman 2010-04-23 06:03:03 -07:00
parent d0c9386d64
commit 3265d7a717
3 changed files with 9 additions and 26 deletions

View File

@ -58,38 +58,21 @@ explodeHandler a b c d e f _ _ = runHandler a b (Just c) d e f
mkYesodGeneral :: String -> [Name] -> Bool -> [Resource] -> Q [Dec] mkYesodGeneral :: String -> [Name] -> Bool -> [Resource] -> Q [Dec]
mkYesodGeneral name clazzes isSub res = do mkYesodGeneral name clazzes isSub res = do
let name' = mkName name let name' = mkName name
let tySyn = TySynInstD ''Routes [ConT name'] (ConT $ mkName $ name ++ "Routes")
let site = mkName $ "site" ++ name let site = mkName $ "site" ++ name
let gsbod = NormalB $ VarE site let gsbod = NormalB $ VarE site
let yes' = FunD (mkName "getSite") [Clause [] gsbod []] let yes' = FunD (mkName "getSite") [Clause [] gsbod []]
let yes = InstanceD [] (ConT ''YesodSite `AppT` ConT name') [yes'] let yes = InstanceD [] (ConT ''YesodSite `AppT` ConT name') [yes']
explode <- [|explodeHandler|] explode <- [|explodeHandler|]
CreateRoutesResult x _ z <- createRoutes CreateRoutesSettings QuasiSiteDecs w x y z <- createQuasiSite QuasiSiteSettings
{ crRoutes = mkName $ name ++ "Routes" { crRoutes = mkName $ name ++ "Routes"
, crApplication = ConT ''YesodApp , crApplication = ConT ''YesodApp
, crArgument = ConT $ mkName name , crArgument = ConT $ mkName name
, crExplode = explode , crExplode = explode
, crResources = res , crResources = res
, crSite = site , crSite = site
, crMaster = if isSub then Right clazzes else Left (ConT name')
} }
let master = if isSub return $ (if isSub then id else (:) yes) [w, x, y, z]
then VarT (mkName "master")
else ConT (mkName name)
murl = ConT ''Routes `AppT` master
sub = ConT $ mkName name
surl = ConT ''Routes `AppT` sub
let yType = ConT ''QuasiSite
`AppT` ConT ''YesodApp
`AppT` surl
`AppT` sub
`AppT` murl
`AppT` master
let ctx = if isSub
then map (flip ClassP [master]) clazzes
else []
tvs = [PlainTV $ mkName "master" | isSub]
let y' = SigD site $ ForallT tvs ctx yType
return $ (if isSub then id else (:) yes) [y', z, tySyn, x]
toWaiApp :: Yesod y => y -> IO W.Application toWaiApp :: Yesod y => y -> IO W.Application
toWaiApp a = do toWaiApp a = do
@ -120,13 +103,13 @@ toWaiApp' y resource session env = do
onRequest y rr onRequest y rr
print pathSegments -- FIXME remove print pathSegments -- FIXME remove
let ya = case eurl of let ya = case eurl of
Nothing -> runHandler (errorHandler y NotFound) Left _ -> runHandler (errorHandler y NotFound)
render render
Nothing Nothing
id id
y y
id id
Just url -> quasiDispatch site Right url -> quasiDispatch site
render render
url url
id id
@ -134,7 +117,8 @@ toWaiApp' y resource session env = do
id id
(badMethodApp method) (badMethodApp method)
method method
let eh er = runHandler (errorHandler y er) render eurl id y id let eurl' = either (const Nothing) Just eurl
let eh er = runHandler (errorHandler y er) render eurl' id y id
unYesodApp ya eh rr types >>= responseToWaiResponse unYesodApp ya eh rr types >>= responseToWaiResponse
cleanupSegments :: [B.ByteString] -> [String] cleanupSegments :: [B.ByteString] -> [String]

View File

@ -49,6 +49,7 @@ module Yesod.Handler
import Yesod.Request import Yesod.Request
import Yesod.Response import Yesod.Response
import Web.Mime import Web.Mime
import Web.Routes.Quasi (Routes)
import Control.Exception hiding (Handler) import Control.Exception hiding (Handler)
import Control.Applicative import Control.Applicative
@ -63,8 +64,6 @@ import qualified Network.Wai as W
import Data.Convertible.Text (cs) import Data.Convertible.Text (cs)
type family Routes y
data HandlerData sub master = HandlerData data HandlerData sub master = HandlerData
{ handlerRequest :: Request { handlerRequest :: Request
, handlerSub :: sub , handlerSub :: sub

View File

@ -22,7 +22,7 @@ import Yesod.Json
import Web.Routes.Quasi (QuasiSite (..)) import Web.Routes.Quasi (QuasiSite (..))
class YesodSite y where class YesodSite y where
getSite :: QuasiSite YesodApp (Routes y) y (Routes y) y getSite :: QuasiSite YesodApp y y
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.