moved YesodSubRoute to Yesod.Handler; added runSubHandler, addSubWidget
This commit is contained in:
parent
ae69262ab3
commit
5e4c0d0170
@ -24,6 +24,7 @@
|
|||||||
module Yesod.Handler
|
module Yesod.Handler
|
||||||
( -- * Type families
|
( -- * Type families
|
||||||
Route
|
Route
|
||||||
|
, YesodSubRoute (..)
|
||||||
-- * Handler monad
|
-- * Handler monad
|
||||||
, GHandler
|
, GHandler
|
||||||
-- ** Read information from handler
|
-- ** Read information from handler
|
||||||
@ -47,6 +48,8 @@ module Yesod.Handler
|
|||||||
-- ** Short-circuit responses.
|
-- ** Short-circuit responses.
|
||||||
, sendFile
|
, sendFile
|
||||||
, sendResponse
|
, sendResponse
|
||||||
|
-- ** Calling foreign subsite handlers
|
||||||
|
, runSubHandler
|
||||||
-- * Setting headers
|
-- * Setting headers
|
||||||
, setCookie
|
, setCookie
|
||||||
, deleteCookie
|
, deleteCookie
|
||||||
@ -122,6 +125,9 @@ import Yesod.Content
|
|||||||
-- | The type-safe URLs associated with a site argument.
|
-- | The type-safe URLs associated with a site argument.
|
||||||
type family Route a
|
type family Route a
|
||||||
|
|
||||||
|
class YesodSubRoute s y where
|
||||||
|
fromSubRoute :: s -> y -> Route s -> Route y
|
||||||
|
|
||||||
data HandlerData sub master = HandlerData
|
data HandlerData sub master = HandlerData
|
||||||
{ handlerRequest :: Request
|
{ handlerRequest :: Request
|
||||||
, handlerSub :: sub
|
, handlerSub :: sub
|
||||||
@ -211,6 +217,28 @@ instance RequestReader (GHandler sub master) where
|
|||||||
getYesodSub :: GHandler sub master sub
|
getYesodSub :: GHandler sub master sub
|
||||||
getYesodSub = handlerSub <$> GHandler ask
|
getYesodSub = handlerSub <$> GHandler ask
|
||||||
|
|
||||||
|
-- | Set the subsite in HandlerData
|
||||||
|
setHandlerSub :: YesodSubRoute sub' master => sub' -> HandlerData sub master -> HandlerData sub' master
|
||||||
|
setHandlerSub s (HandlerData r _ m _ rn _) = HandlerData r s m Nothing rn $ fromSubRoute s m
|
||||||
|
|
||||||
|
-- | Run a handler from another subsite
|
||||||
|
runSubHandler :: YesodSubRoute sub' master => sub' -> GHandler sub' master a -> GHandler sub master a
|
||||||
|
runSubHandler sub handler = do
|
||||||
|
hd <- setHandlerSub sub <$> GHandler ask
|
||||||
|
session <- getSession
|
||||||
|
GHandler $ do
|
||||||
|
let toErrorHandler =
|
||||||
|
InternalError
|
||||||
|
. (show :: Control.Exception.SomeException -> String)
|
||||||
|
((contents, headers), finalSession) <- liftIO $ flip runStateT session
|
||||||
|
$ runWriterT
|
||||||
|
$ runMEitherT
|
||||||
|
$ flip runReaderT hd
|
||||||
|
$ unGHandler handler
|
||||||
|
lift $ lift $ lift $ put finalSession
|
||||||
|
lift $ MEitherT $ return contents
|
||||||
|
|
||||||
|
|
||||||
-- | Get the master site appliation argument.
|
-- | Get the master site appliation argument.
|
||||||
getYesod :: GHandler sub master master
|
getYesod :: GHandler sub master master
|
||||||
getYesod = handlerMaster <$> GHandler ask
|
getYesod = handlerMaster <$> GHandler ask
|
||||||
|
|||||||
@ -18,6 +18,7 @@ module Yesod.Widget
|
|||||||
, addHamlet
|
, addHamlet
|
||||||
, addHtml
|
, addHtml
|
||||||
, addWidget
|
, addWidget
|
||||||
|
, addSubWidget
|
||||||
-- ** CSS
|
-- ** CSS
|
||||||
, addCassius
|
, addCassius
|
||||||
, addStylesheet
|
, addStylesheet
|
||||||
@ -39,7 +40,7 @@ import Control.Monad.Trans.State
|
|||||||
import Text.Hamlet
|
import Text.Hamlet
|
||||||
import Text.Cassius
|
import Text.Cassius
|
||||||
import Text.Julius
|
import Text.Julius
|
||||||
import Yesod.Handler (Route, GHandler, HandlerData)
|
import Yesod.Handler (Route, GHandler, HandlerData, YesodSubRoute, runSubHandler)
|
||||||
import Control.Applicative (Applicative)
|
import Control.Applicative (Applicative)
|
||||||
import Control.Monad.IO.Class (MonadIO)
|
import Control.Monad.IO.Class (MonadIO)
|
||||||
import Control.Monad.Trans.Class (lift)
|
import Control.Monad.Trans.Class (lift)
|
||||||
@ -96,6 +97,34 @@ instance Monad (HamletMonad (GWidget s m ())) where
|
|||||||
liftHandler :: GHandler sub master a -> GWidget sub master a
|
liftHandler :: GHandler sub master a -> GWidget sub master a
|
||||||
liftHandler = GWidget . lift . lift . lift . lift . lift . lift . lift . lift
|
liftHandler = GWidget . lift . lift . lift . lift . lift . lift . lift . lift
|
||||||
|
|
||||||
|
addSubWidget :: (YesodSubRoute sub master) => sub -> GWidget sub master a -> GWidget sub' master a
|
||||||
|
addSubWidget sub w = do
|
||||||
|
i <- GWidget $ lift $ lift $ lift $ lift $ lift $ lift $ lift get
|
||||||
|
w' <- liftHandler $ runSubHandler sub $ flip runStateT i
|
||||||
|
$ runWriterT $ runWriterT $ runWriterT $ runWriterT
|
||||||
|
$ runWriterT $ runWriterT $ runWriterT
|
||||||
|
$ unGWidget w
|
||||||
|
let ((((((((a,
|
||||||
|
body),
|
||||||
|
title),
|
||||||
|
scripts),
|
||||||
|
stylesheets),
|
||||||
|
style),
|
||||||
|
jscript),
|
||||||
|
h),
|
||||||
|
i') = w'
|
||||||
|
GWidget $ do
|
||||||
|
tell body
|
||||||
|
lift $ tell title
|
||||||
|
lift $ lift $ tell scripts
|
||||||
|
lift $ lift $ lift $ tell stylesheets
|
||||||
|
lift $ lift $ lift $ lift $ tell style
|
||||||
|
lift $ lift $ lift $ lift $ lift $ tell jscript
|
||||||
|
lift $ lift $ lift $ lift $ lift $ lift $ tell h
|
||||||
|
lift $ lift $ lift $ lift $ lift $ lift $ lift $ put i'
|
||||||
|
return a
|
||||||
|
|
||||||
|
|
||||||
-- | Set the page title. Calling 'setTitle' multiple times overrides previously
|
-- | Set the page title. Calling 'setTitle' multiple times overrides previously
|
||||||
-- set values.
|
-- set values.
|
||||||
setTitle :: Html -> GWidget sub master ()
|
setTitle :: Html -> GWidget sub master ()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user