module Snap.Snaplet.CustomAuth.Heist where
import Control.Lens
import Control.Monad.Trans
import qualified Text.XmlHtml as X
import Heist
import qualified Heist.Interpreted as I
import qualified Heist.Compiled as C
import Snap.Snaplet
import Snap.Snaplet.Heist
import Snap.Snaplet.CustomAuth.Handlers
import Snap.Snaplet.CustomAuth.Types
import Snap.Snaplet.CustomAuth.AuthManager
import Data.Map.Syntax
import Snap.Snaplet.CustomAuth.User (currentUser)
addAuthSplices
:: UserData u
=> Snaplet (Heist b)
-> SnapletLens b (AuthManager u e b)
-> Initializer b v ()
addAuthSplices h auth = addConfig h sc
where
sc = mempty & scInterpretedSplices .~ is
& scCompiledSplices .~ cs
is = do
"ifLoggedIn" ## ifLoggedIn auth
"ifLoggedOut" ## ifLoggedOut auth
"loggedInUser" ## loggedInUser auth
cs = compiledAuthSplices auth
compiledAuthSplices
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> Splices (SnapletCSplice b)
compiledAuthSplices auth = do
"ifLoggedIn" ## cIfLoggedIn auth
"ifLoggedOut" ## cIfLoggedOut auth
"loggedInUser" ## cLoggedInUser auth
ifLoggedIn
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletISplice b
ifLoggedIn auth = do
chk <- lift $ withTop auth isLoggedIn
case chk of
True -> getParamNode >>= return . X.childNodes
False -> return []
cIfLoggedIn
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletCSplice b
cIfLoggedIn auth = do
cs <- C.runChildren
return $ C.yieldRuntime $ do
chk <- lift $ withTop auth isLoggedIn
case chk of
True -> C.codeGen cs
False -> mempty
ifLoggedOut
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletISplice b
ifLoggedOut auth = do
chk <- lift $ withTop auth isLoggedIn
case chk of
False -> getParamNode >>= return . X.childNodes
True -> return []
cIfLoggedOut
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletCSplice b
cIfLoggedOut auth = do
cs <- C.runChildren
return $ C.yieldRuntime $ do
chk <- lift $ withTop auth isLoggedIn
case chk of
False -> C.codeGen cs
True -> mempty
loggedInUser
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletISplice b
loggedInUser auth = do
u <- lift $ withTop auth currentUser
maybe (return []) (I.textSplice . name . extractUser) $ u
cLoggedInUser
:: UserData u
=> SnapletLens b (AuthManager u e b)
-> SnapletCSplice b
cLoggedInUser auth =
return $ C.yieldRuntimeText $ do
u <- lift $ withTop auth currentUser
return $ maybe "" (name . extractUser) u