Moved newIdent from Widget to Handler
This commit is contained in:
parent
8596bbc10e
commit
75687a6b7c
@ -78,6 +78,8 @@ module Yesod.Handler
|
|||||||
-- ** Messages
|
-- ** Messages
|
||||||
, setMessage
|
, setMessage
|
||||||
, getMessage
|
, getMessage
|
||||||
|
-- ** Misc
|
||||||
|
, newIdent
|
||||||
-- * Internal Yesod
|
-- * Internal Yesod
|
||||||
, runHandler
|
, runHandler
|
||||||
, YesodApp (..)
|
, YesodApp (..)
|
||||||
@ -138,7 +140,7 @@ import Data.Maybe (fromMaybe)
|
|||||||
import Web.Cookie (SetCookie (..), renderSetCookie)
|
import Web.Cookie (SetCookie (..), renderSetCookie)
|
||||||
import Blaze.ByteString.Builder (toByteString)
|
import Blaze.ByteString.Builder (toByteString)
|
||||||
import Data.Enumerator (run_, ($$))
|
import Data.Enumerator (run_, ($$))
|
||||||
import Control.Arrow (first, (***))
|
import Control.Arrow (second, (***))
|
||||||
import qualified Network.Wai.Parse as NWP
|
import qualified Network.Wai.Parse as NWP
|
||||||
|
|
||||||
-- | The type-safe URLs associated with a site argument.
|
-- | The type-safe URLs associated with a site argument.
|
||||||
@ -231,11 +233,17 @@ instance MonadTrans (GGHandler s m) where
|
|||||||
|
|
||||||
type GHandler sub master = GGHandler sub master (Iteratee ByteString IO)
|
type GHandler sub master = GGHandler sub master (Iteratee ByteString IO)
|
||||||
|
|
||||||
|
data GHState = GHState
|
||||||
|
{ ghsSession :: SessionMap
|
||||||
|
, ghsRBC :: Maybe RequestBodyContents
|
||||||
|
, ghsIdent :: Int
|
||||||
|
}
|
||||||
|
|
||||||
type GHInner s m monad =
|
type GHInner s m monad =
|
||||||
ReaderT (HandlerData s m) (
|
ReaderT (HandlerData s m) (
|
||||||
ErrorT HandlerContents (
|
ErrorT HandlerContents (
|
||||||
WriterT (Endo [Header]) (
|
WriterT (Endo [Header]) (
|
||||||
StateT (SessionMap, Maybe RequestBodyContents) (
|
StateT GHState (
|
||||||
monad
|
monad
|
||||||
))))
|
))))
|
||||||
|
|
||||||
@ -275,13 +283,13 @@ instance Monad monad => Failure ErrorResponse (GGHandler sub master monad) where
|
|||||||
instance RequestReader (GHandler sub master) where
|
instance RequestReader (GHandler sub master) where
|
||||||
getRequest = handlerRequest <$> GHandler ask
|
getRequest = handlerRequest <$> GHandler ask
|
||||||
runRequestBody = do
|
runRequestBody = do
|
||||||
(sm, mrbc) <- GHandler $ lift $ lift $ lift get
|
x <- GHandler $ lift $ lift $ lift get
|
||||||
case mrbc of
|
case ghsRBC x of
|
||||||
Just rbc -> return rbc
|
Just rbc -> return rbc
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
rr <- waiRequest
|
rr <- waiRequest
|
||||||
rbc <- lift $ rbHelper rr
|
rbc <- lift $ rbHelper rr
|
||||||
GHandler $ lift $ lift $ lift $ put (sm, Just rbc)
|
GHandler $ lift $ lift $ lift $ put x { ghsRBC = Just rbc }
|
||||||
return rbc
|
return rbc
|
||||||
|
|
||||||
rbHelper :: W.Request -> Iteratee ByteString IO RequestBodyContents
|
rbHelper :: W.Request -> Iteratee ByteString IO RequestBodyContents
|
||||||
@ -346,14 +354,15 @@ runHandler handler mrender sroute tomr ma tosa =
|
|||||||
, handlerRender = mrender
|
, handlerRender = mrender
|
||||||
, handlerToMaster = tomr
|
, handlerToMaster = tomr
|
||||||
}
|
}
|
||||||
let initSession' = (initSession, Nothing)
|
let initSession' = GHState initSession Nothing 1
|
||||||
((contents', headers), (finalSession, _)) <- catchIter (
|
((contents', headers), finalSession) <- catchIter (
|
||||||
flip runStateT initSession'
|
fmap (second ghsSession)
|
||||||
|
$ flip runStateT initSession'
|
||||||
$ runWriterT
|
$ runWriterT
|
||||||
$ runErrorT
|
$ runErrorT
|
||||||
$ flip runReaderT hd
|
$ flip runReaderT hd
|
||||||
$ unGHandler handler
|
$ unGHandler handler
|
||||||
) (\e -> return ((Left $ HCError $ toErrorHandler e, id), initSession'))
|
) (\e -> return ((Left $ HCError $ toErrorHandler e, id), initSession))
|
||||||
let contents = either id (HCContent W.status200 . chooseRep) contents'
|
let contents = either id (HCContent W.status200 . chooseRep) contents'
|
||||||
let handleError e = do
|
let handleError e = do
|
||||||
yar <- unYesodApp (eh e) safeEh rr cts finalSession
|
yar <- unYesodApp (eh e) safeEh rr cts finalSession
|
||||||
@ -584,11 +593,14 @@ expiresAt = setHeader "Expires" . S8.pack . formatRFC1123
|
|||||||
setSession :: String -- ^ key
|
setSession :: String -- ^ key
|
||||||
-> String -- ^ value
|
-> String -- ^ value
|
||||||
-> GHandler sub master ()
|
-> GHandler sub master ()
|
||||||
setSession k = GHandler . lift . lift . lift . modify . first . Map.insert k
|
setSession k = GHandler . lift . lift . lift . modify . modSession . Map.insert k
|
||||||
|
|
||||||
-- | Unsets a session variable. See 'setSession'.
|
-- | Unsets a session variable. See 'setSession'.
|
||||||
deleteSession :: String -> GHandler sub master ()
|
deleteSession :: String -> GHandler sub master ()
|
||||||
deleteSession = GHandler . lift . lift . lift . modify . first . Map.delete
|
deleteSession = GHandler . lift . lift . lift . modify . modSession . Map.delete
|
||||||
|
|
||||||
|
modSession :: (SessionMap -> SessionMap) -> GHState -> GHState
|
||||||
|
modSession f x = x { ghsSession = f $ ghsSession x }
|
||||||
|
|
||||||
-- | Internal use only, not to be confused with 'setHeader'.
|
-- | Internal use only, not to be confused with 'setHeader'.
|
||||||
addHeader :: Header -> GHandler sub master ()
|
addHeader :: Header -> GHandler sub master ()
|
||||||
@ -619,12 +631,12 @@ localNoCurrent =
|
|||||||
-- | Lookup for session data.
|
-- | Lookup for session data.
|
||||||
lookupSession :: ParamName -> GHandler s m (Maybe ParamValue)
|
lookupSession :: ParamName -> GHandler s m (Maybe ParamValue)
|
||||||
lookupSession n = GHandler $ do
|
lookupSession n = GHandler $ do
|
||||||
m <- fmap fst $ lift $ lift $ lift get
|
m <- fmap ghsSession $ lift $ lift $ lift get
|
||||||
return $ Map.lookup n m
|
return $ Map.lookup n m
|
||||||
|
|
||||||
-- | Get all session variables.
|
-- | Get all session variables.
|
||||||
getSession :: GHandler s m SessionMap
|
getSession :: GHandler s m SessionMap
|
||||||
getSession = fmap fst $ GHandler $ lift $ lift $ lift get
|
getSession = fmap ghsSession $ GHandler $ lift $ lift $ lift get
|
||||||
|
|
||||||
#if TEST
|
#if TEST
|
||||||
|
|
||||||
@ -714,3 +726,11 @@ headerToPair _ (DeleteCookie key) =
|
|||||||
, key `S.append` "=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"
|
, key `S.append` "=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"
|
||||||
)
|
)
|
||||||
headerToPair _ (Header key value) = (key, value)
|
headerToPair _ (Header key value) = (key, value)
|
||||||
|
|
||||||
|
-- | Get a unique identifier.
|
||||||
|
newIdent :: Monad mo => GGHandler sub master mo String
|
||||||
|
newIdent = GHandler $ lift $ lift $ lift $ do
|
||||||
|
x <- get
|
||||||
|
let i' = ghsIdent x + 1
|
||||||
|
put x { ghsIdent = i' }
|
||||||
|
return $ "h" ++ show i'
|
||||||
|
|||||||
@ -33,7 +33,6 @@ module Yesod.Widget
|
|||||||
, addScriptEither
|
, addScriptEither
|
||||||
-- * Utilities
|
-- * Utilities
|
||||||
, extractBody
|
, extractBody
|
||||||
, newIdent -- FIXME this should be a function on Handler, not Widget
|
|
||||||
-- * Helpers for specific content
|
-- * Helpers for specific content
|
||||||
-- ** Hamlet
|
-- ** Hamlet
|
||||||
, hamletToContent
|
, hamletToContent
|
||||||
@ -156,14 +155,6 @@ addHtml = GWidget . tell . Body . const
|
|||||||
addWidget :: Monad mo => GGWidget s m mo () -> GGWidget s m mo ()
|
addWidget :: Monad mo => GGWidget s m mo () -> GGWidget s m mo ()
|
||||||
addWidget = id
|
addWidget = id
|
||||||
|
|
||||||
-- | Get a unique identifier.
|
|
||||||
newIdent :: Monad mo => GGWidget sub master mo String
|
|
||||||
newIdent = GWidget $ lift $ lift $ lift $ lift $ lift $ lift $ lift $ do
|
|
||||||
i <- get
|
|
||||||
let i' = i + 1
|
|
||||||
put i'
|
|
||||||
return $ "w" ++ show i'
|
|
||||||
|
|
||||||
-- | Add some raw CSS to the style tag.
|
-- | Add some raw CSS to the style tag.
|
||||||
addCassius :: Monad m => Cassius (Route master) -> GGWidget sub master m ()
|
addCassius :: Monad m => Cassius (Route master) -> GGWidget sub master m ()
|
||||||
addCassius = GWidget . lift . lift . lift . lift . tell . Just
|
addCassius = GWidget . lift . lift . lift . lift . tell . Just
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user