new SubsiteGetter class to support either pure (master -> sub) or impure (GHandler master master sub) versions of sub site lookup functions
This commit is contained in:
parent
c8bf6d5215
commit
6e90c6188e
@ -208,18 +208,32 @@ thResourceFromResource master (Resource n ps atts@[stype, toSubArg])
|
|||||||
let render = render' `AppE` gss'
|
let render = render' `AppE` gss'
|
||||||
dispatch' <- [|flip handleSite (error "Cannot use subsite render function")|]
|
dispatch' <- [|flip handleSite (error "Cannot use subsite render function")|]
|
||||||
let dispatch = dispatch' `AppE` gss'
|
let dispatch = dispatch' `AppE` gss'
|
||||||
|
tmg <- mkToMasterArg ps toSubArg
|
||||||
return (n, SubSite
|
return (n, SubSite
|
||||||
{ ssType = ConT ''Route `AppT` stype'
|
{ ssType = ConT ''Route `AppT` stype'
|
||||||
, ssParse = parse
|
, ssParse = parse
|
||||||
, ssRender = render
|
, ssRender = render
|
||||||
, ssDispatch = dispatch
|
, ssDispatch = dispatch
|
||||||
, ssToMasterArg = VarE $ mkName toSubArg
|
, ssToMasterArg = tmg
|
||||||
, ssPieces = ps
|
, ssPieces = ps
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
thResourceFromResource _ (Resource n _ _) =
|
thResourceFromResource _ (Resource n _ _) =
|
||||||
error $ "Invalid attributes for resource: " ++ n
|
error $ "Invalid attributes for resource: " ++ n
|
||||||
|
|
||||||
|
mkToMasterArg :: [Piece] -> String -> Q Exp
|
||||||
|
mkToMasterArg ps fname = do
|
||||||
|
let nargs = length $ filter (not.isStatic) ps
|
||||||
|
f = VarE $ mkName fname
|
||||||
|
args <- sequence $ take nargs $ repeat $ newName "x"
|
||||||
|
rsg <- [| runSubsiteGetter|]
|
||||||
|
let xps = map VarP args
|
||||||
|
xes = map VarE args
|
||||||
|
e' = foldl (\x y -> x `AppE` y) f xes
|
||||||
|
e = rsg `AppE` e'
|
||||||
|
return $ LamE xps e
|
||||||
|
|
||||||
sessionName :: String
|
sessionName :: String
|
||||||
sessionName = "_SESSION"
|
sessionName = "_SESSION"
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
{-# LANGUAGE Rank2Types #-}
|
{-# LANGUAGE Rank2Types #-}
|
||||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||||
{-# LANGUAGE CPP #-}
|
{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE FunctionalDependencies #-}
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
--
|
--
|
||||||
-- Module : Yesod.Handler
|
-- Module : Yesod.Handler
|
||||||
@ -76,6 +77,7 @@ module Yesod.Handler
|
|||||||
-- * Internal Yesod
|
-- * Internal Yesod
|
||||||
, runHandler
|
, runHandler
|
||||||
, YesodApp (..)
|
, YesodApp (..)
|
||||||
|
, SubsiteGetter(..)
|
||||||
, toMasterHandler
|
, toMasterHandler
|
||||||
, toMasterHandlerDyn
|
, toMasterHandlerDyn
|
||||||
, toMasterHandlerMaybe
|
, toMasterHandlerMaybe
|
||||||
@ -176,6 +178,20 @@ toMasterHandlerDyn tm getSub route (GHandler h) = do
|
|||||||
sub <- getSub
|
sub <- getSub
|
||||||
GHandler $ withReaderT (handlerSubData tm (const sub) route) h
|
GHandler $ withReaderT (handlerSubData tm (const sub) route) h
|
||||||
|
|
||||||
|
class SubsiteGetter g m s | g -> s where
|
||||||
|
runSubsiteGetter :: g -> m s
|
||||||
|
|
||||||
|
instance (master ~ master'
|
||||||
|
) => SubsiteGetter (master -> sub) (GHandler anySub master') sub where
|
||||||
|
runSubsiteGetter get = do
|
||||||
|
y <- getYesod
|
||||||
|
return $ get y
|
||||||
|
|
||||||
|
instance (anySub ~ anySub'
|
||||||
|
,master ~ master'
|
||||||
|
) => SubsiteGetter (GHandler anySub master sub) (GHandler anySub' master') sub where
|
||||||
|
runSubsiteGetter = id
|
||||||
|
|
||||||
toMasterHandlerMaybe :: (Route sub -> Route master)
|
toMasterHandlerMaybe :: (Route sub -> Route master)
|
||||||
-> (master -> sub)
|
-> (master -> sub)
|
||||||
-> Maybe (Route sub)
|
-> Maybe (Route sub)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user