{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
#ifndef MIN_VERSION_comonad
#define MIN_VERSION_comonad(x,y,z) 1
#endif
module Snap.Snaplet.Internal.Types where
import Control.Applicative (Alternative)
import Control.Lens (ALens', makeLenses, set)
import Control.Monad (MonadPlus, liftM)
import Control.Monad.Base (MonadBase (..))
import Control.Monad.Fail (MonadFail)
import Control.Monad.Reader (MonadIO (..), MonadReader (ask, local))
import Control.Monad.State.Class (MonadState (get, put), gets)
import Control.Monad.Trans.Control (MonadBaseControl (..))
import Control.Monad.Trans.Writer (WriterT)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B (dropWhile, intercalate, null, reverse)
import Data.Configurator.Types (Config)
import Data.IORef (IORef)
import Data.Text (Text)
import Snap.Core (MonadSnap, Request (rqClientAddr), Snap, bracketSnap, getRequest, pass, writeText)
import qualified Snap.Snaplet.Internal.Lensed as L (Lensed (..), runLensed, with, withTop)
import qualified Snap.Snaplet.Internal.LensT as LT (LensT, getBase, with, withTop)
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative (Applicative)
import Data.Monoid (Monoid (mappend, mempty))
#endif
#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup (Semigroup(..))
#endif
data SnapletConfig = SnapletConfig
{ SnapletConfig -> [Text]
_scAncestry :: [Text]
, SnapletConfig -> FilePath
_scFilePath :: FilePath
, SnapletConfig -> Maybe Text
_scId :: Maybe Text
, SnapletConfig -> Text
_scDescription :: Text
, SnapletConfig -> Config
_scUserConfig :: Config
, SnapletConfig -> [ByteString]
_scRouteContext :: [ByteString]
, SnapletConfig -> Maybe ByteString
_scRoutePattern :: Maybe ByteString
, SnapletConfig -> IO (Either Text Text)
_reloader :: IO (Either Text Text)
}
makeLenses ''SnapletConfig
buildPath :: [ByteString] -> ByteString
buildPath :: [ByteString] -> ByteString
buildPath [ByteString]
ps = ByteString -> [ByteString] -> ByteString
B.intercalate ByteString
"/" forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Bool
B.null) forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
reverse [ByteString]
ps
getRootURL :: SnapletConfig -> ByteString
getRootURL :: SnapletConfig -> ByteString
getRootURL SnapletConfig
sc = [ByteString] -> ByteString
buildPath forall a b. (a -> b) -> a -> b
$ SnapletConfig -> [ByteString]
_scRouteContext SnapletConfig
sc
data Snaplet s = Snaplet
{ forall s. Snaplet s -> SnapletConfig
_snapletConfig :: SnapletConfig
, forall s. Snaplet s -> s -> IO ()
_snapletModifier :: s -> IO ()
, forall s. Snaplet s -> s
_snapletValue :: s
}
makeLenses ''Snaplet
type SnapletLens s a = ALens' s (Snaplet a)
subSnaplet :: SnapletLens a b
-> SnapletLens (Snaplet a) b
subSnaplet :: forall a b. SnapletLens a b -> SnapletLens (Snaplet a) b
subSnaplet SnapletLens a b
l = forall s. Lens' (Snaplet s) s
snapletValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletLens a b
l
class MonadSnaplet m where
with :: SnapletLens v v'
-> m b v' a
-> m b v a
with SnapletLens v v'
l = forall (m :: * -> * -> * -> *) v v' b a.
MonadSnaplet m =>
SnapletLens (Snaplet v) v' -> m b v' a -> m b v a
with' (forall a b. SnapletLens a b -> SnapletLens (Snaplet a) b
subSnaplet SnapletLens v v'
l)
withTop :: SnapletLens b v'
-> m b v' a
-> m b v a
withTop SnapletLens b v'
l = forall (m :: * -> * -> * -> *) b v' a v.
MonadSnaplet m =>
SnapletLens (Snaplet b) v' -> m b v' a -> m b v a
withTop' (forall a b. SnapletLens a b -> SnapletLens (Snaplet a) b
subSnaplet SnapletLens b v'
l)
with' :: SnapletLens (Snaplet v) v'
-> m b v' a -> m b v a
withTop' :: SnapletLens (Snaplet b) v'
-> m b v' a -> m b v a
getLens :: m b v (SnapletLens (Snaplet b) v)
getOpaqueConfig :: m b v SnapletConfig
getSnapletAncestry :: (Monad (m b v), MonadSnaplet m) => m b v [Text]
getSnapletAncestry :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v [Text]
getSnapletAncestry = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletConfig -> [Text]
_scAncestry forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
getSnapletFilePath :: (Monad (m b v), MonadSnaplet m) => m b v FilePath
getSnapletFilePath :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v FilePath
getSnapletFilePath = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletConfig -> FilePath
_scFilePath forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
getSnapletName :: (Monad (m b v), MonadSnaplet m) => m b v (Maybe Text)
getSnapletName :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v (Maybe Text)
getSnapletName = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletConfig -> Maybe Text
_scId forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
getSnapletDescription :: (Monad (m b v), MonadSnaplet m) => m b v Text
getSnapletDescription :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v Text
getSnapletDescription = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletConfig -> Text
_scDescription forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
getSnapletUserConfig :: (Monad (m b v), MonadSnaplet m) => m b v Config
getSnapletUserConfig :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v Config
getSnapletUserConfig = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnapletConfig -> Config
_scUserConfig forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
getSnapletRootURL :: (Monad (m b v), MonadSnaplet m) => m b v ByteString
getSnapletRootURL :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
m b v ByteString
getSnapletRootURL = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM SnapletConfig -> ByteString
getRootURL forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
snapletURL :: (Monad (m b v), MonadSnaplet m)
=> ByteString -> m b v ByteString
snapletURL :: forall (m :: * -> * -> * -> *) b v.
(Monad (m b v), MonadSnaplet m) =>
ByteString -> m b v ByteString
snapletURL ByteString
suffix = do
SnapletConfig
cfg <- forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [ByteString] -> ByteString
buildPath (ByteString
cleanSuffix forall a. a -> [a] -> [a]
: SnapletConfig -> [ByteString]
_scRouteContext SnapletConfig
cfg)
where
dropSlash :: ByteString -> ByteString
dropSlash = (Char -> Bool) -> ByteString -> ByteString
B.dropWhile (forall a. Eq a => a -> a -> Bool
==Char
'/')
cleanSuffix :: ByteString
cleanSuffix = ByteString -> ByteString
B.reverse forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
dropSlash forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
B.reverse forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
dropSlash ByteString
suffix
newtype Handler b v a =
Handler { forall b v a.
Handler b v a -> Lensed (Snaplet b) (Snaplet v) Snap a
_unHandler :: L.Lensed (Snaplet b) (Snaplet v) Snap a }
deriving ( forall a. a -> Handler b v a
forall {b} {v}. Applicative (Handler b v)
forall a b. Handler b v a -> Handler b v b -> Handler b v b
forall a b. Handler b v a -> (a -> Handler b v b) -> Handler b v b
forall b v a. a -> Handler b v a
forall b v a b. Handler b v a -> Handler b v b -> Handler b v b
forall b v a b.
Handler b v a -> (a -> Handler b v b) -> Handler b v b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> Handler b v a
$creturn :: forall b v a. a -> Handler b v a
>> :: forall a b. Handler b v a -> Handler b v b -> Handler b v b
$c>> :: forall b v a b. Handler b v a -> Handler b v b -> Handler b v b
>>= :: forall a b. Handler b v a -> (a -> Handler b v b) -> Handler b v b
$c>>= :: forall b v a b.
Handler b v a -> (a -> Handler b v b) -> Handler b v b
Monad
, forall a b. a -> Handler b v b -> Handler b v a
forall a b. (a -> b) -> Handler b v a -> Handler b v b
forall b v a b. a -> Handler b v b -> Handler b v a
forall b v a b. (a -> b) -> Handler b v a -> Handler b v b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Handler b v b -> Handler b v a
$c<$ :: forall b v a b. a -> Handler b v b -> Handler b v a
fmap :: forall a b. (a -> b) -> Handler b v a -> Handler b v b
$cfmap :: forall b v a b. (a -> b) -> Handler b v a -> Handler b v b
Functor
, forall a. a -> Handler b v a
forall b v. Functor (Handler b v)
forall a b. Handler b v a -> Handler b v b -> Handler b v a
forall a b. Handler b v a -> Handler b v b -> Handler b v b
forall a b. Handler b v (a -> b) -> Handler b v a -> Handler b v b
forall b v a. a -> Handler b v a
forall a b c.
(a -> b -> c) -> Handler b v a -> Handler b v b -> Handler b v c
forall b v a b. Handler b v a -> Handler b v b -> Handler b v a
forall b v a b. Handler b v a -> Handler b v b -> Handler b v b
forall b v a b.
Handler b v (a -> b) -> Handler b v a -> Handler b v b
forall b v a b c.
(a -> b -> c) -> Handler b v a -> Handler b v b -> Handler b v c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Handler b v a -> Handler b v b -> Handler b v a
$c<* :: forall b v a b. Handler b v a -> Handler b v b -> Handler b v a
*> :: forall a b. Handler b v a -> Handler b v b -> Handler b v b
$c*> :: forall b v a b. Handler b v a -> Handler b v b -> Handler b v b
liftA2 :: forall a b c.
(a -> b -> c) -> Handler b v a -> Handler b v b -> Handler b v c
$cliftA2 :: forall b v a b c.
(a -> b -> c) -> Handler b v a -> Handler b v b -> Handler b v c
<*> :: forall a b. Handler b v (a -> b) -> Handler b v a -> Handler b v b
$c<*> :: forall b v a b.
Handler b v (a -> b) -> Handler b v a -> Handler b v b
pure :: forall a. a -> Handler b v a
$cpure :: forall b v a. a -> Handler b v a
Applicative
, forall a. FilePath -> Handler b v a
forall b v. Monad (Handler b v)
forall b v a. FilePath -> Handler b v a
forall (m :: * -> *).
Monad m -> (forall a. FilePath -> m a) -> MonadFail m
fail :: forall a. FilePath -> Handler b v a
$cfail :: forall b v a. FilePath -> Handler b v a
MonadFail
, forall a. IO a -> Handler b v a
forall b v. Monad (Handler b v)
forall b v a. IO a -> Handler b v a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> Handler b v a
$cliftIO :: forall b v a. IO a -> Handler b v a
MonadIO
, forall a. Handler b v a
forall a. Handler b v a -> Handler b v a -> Handler b v a
forall b v. Monad (Handler b v)
forall {b} {v}. Alternative (Handler b v)
forall b v a. Handler b v a
forall b v a. Handler b v a -> Handler b v a -> Handler b v a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: forall a. Handler b v a -> Handler b v a -> Handler b v a
$cmplus :: forall b v a. Handler b v a -> Handler b v a -> Handler b v a
mzero :: forall a. Handler b v a
$cmzero :: forall b v a. Handler b v a
MonadPlus
, forall a. Handler b v a
forall a. Handler b v a -> Handler b v [a]
forall a. Handler b v a -> Handler b v a -> Handler b v a
forall {b} {v}. Applicative (Handler b v)
forall b v a. Handler b v a
forall b v a. Handler b v a -> Handler b v [a]
forall b v a. Handler b v a -> Handler b v a -> Handler b v a
forall (f :: * -> *).
Applicative f
-> (forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
many :: forall a. Handler b v a -> Handler b v [a]
$cmany :: forall b v a. Handler b v a -> Handler b v [a]
some :: forall a. Handler b v a -> Handler b v [a]
$csome :: forall b v a. Handler b v a -> Handler b v [a]
<|> :: forall a. Handler b v a -> Handler b v a -> Handler b v a
$c<|> :: forall b v a. Handler b v a -> Handler b v a -> Handler b v a
empty :: forall a. Handler b v a
$cempty :: forall b v a. Handler b v a
Alternative
, forall a. Snap a -> Handler b v a
forall b v. Monad (Handler b v)
forall b v. Functor (Handler b v)
forall {b} {v}. Applicative (Handler b v)
forall {b} {v}. Alternative (Handler b v)
forall b v. MonadPlus (Handler b v)
forall b v. MonadIO (Handler b v)
forall {b} {v}. MonadBaseControl IO (Handler b v)
forall b v a. Snap a -> Handler b v a
forall (m :: * -> *).
Monad m
-> MonadIO m
-> MonadBaseControl IO m
-> MonadPlus m
-> Functor m
-> Applicative m
-> Alternative m
-> (forall a. Snap a -> m a)
-> MonadSnap m
liftSnap :: forall a. Snap a -> Handler b v a
$cliftSnap :: forall b v a. Snap a -> Handler b v a
MonadSnap)
instance MonadBase IO (Handler b v) where
liftBase :: forall α. IO α -> Handler b v α
liftBase = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
newtype StMHandler b v a = StMHandler {
forall b v a.
StMHandler b v a -> StM (Lensed (Snaplet b) (Snaplet v) Snap) a
unStMHandler :: StM (L.Lensed (Snaplet b) (Snaplet v) Snap) a
}
instance MonadBaseControl IO (Handler b v) where
type StM (Handler b v) a = StMHandler b v a
liftBaseWith :: forall a. (RunInBase (Handler b v) IO -> IO a) -> Handler b v a
liftBaseWith RunInBase (Handler b v) IO -> IO a
f = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler
forall a b. (a -> b) -> a -> b
$ forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith
forall a b. (a -> b) -> a -> b
$ \RunInBase (Lensed (Snaplet b) (Snaplet v) Snap) IO
g' -> RunInBase (Handler b v) IO -> IO a
f
forall a b. (a -> b) -> a -> b
$ \Handler b v a
m -> forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM forall b v a.
StM (Lensed (Snaplet b) (Snaplet v) Snap) a -> StMHandler b v a
StMHandler
forall a b. (a -> b) -> a -> b
$ RunInBase (Lensed (Snaplet b) (Snaplet v) Snap) IO
g' forall a b. (a -> b) -> a -> b
$ forall b v a.
Handler b v a -> Lensed (Snaplet b) (Snaplet v) Snap a
_unHandler Handler b v a
m
restoreM :: forall a. StM (Handler b v) a -> Handler b v a
restoreM = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b v a.
StMHandler b v a -> StM (Lensed (Snaplet b) (Snaplet v) Snap) a
unStMHandler
getSnapletState :: Handler b v (Snaplet v)
getSnapletState :: forall b v. Handler b v (Snaplet v)
getSnapletState = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall s (m :: * -> *). MonadState s m => m s
get
putSnapletState :: Snaplet v -> Handler b v ()
putSnapletState :: forall v b. Snaplet v -> Handler b v ()
putSnapletState = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *). MonadState s m => s -> m ()
put
modifySnapletState :: (Snaplet v -> Snaplet v) -> Handler b v ()
modifySnapletState :: forall v b. (Snaplet v -> Snaplet v) -> Handler b v ()
modifySnapletState Snaplet v -> Snaplet v
f = do
Snaplet v
s <- forall b v. Handler b v (Snaplet v)
getSnapletState
forall v b. Snaplet v -> Handler b v ()
putSnapletState (Snaplet v -> Snaplet v
f Snaplet v
s)
getsSnapletState :: (Snaplet v -> b) -> Handler b1 v b
getsSnapletState :: forall v b b1. (Snaplet v -> b) -> Handler b1 v b
getsSnapletState Snaplet v -> b
f = do
Snaplet v
s <- forall b v. Handler b v (Snaplet v)
getSnapletState
forall (m :: * -> *) a. Monad m => a -> m a
return (Snaplet v -> b
f Snaplet v
s)
instance MonadState v (Handler b v) where
get :: Handler b v v
get = forall v b b1. (Snaplet v -> b) -> Handler b1 v b
getsSnapletState forall s. Snaplet s -> s
_snapletValue
put :: v -> Handler b v ()
put v
v = forall v b. (Snaplet v -> Snaplet v) -> Handler b v ()
modifySnapletState (forall s t a b. ASetter s t a b -> b -> s -> t
set forall s. Lens' (Snaplet s) s
snapletValue v
v)
instance MonadReader v (Handler b v) where
ask :: Handler b v v
ask = forall v b b1. (Snaplet v -> b) -> Handler b1 v b
getsSnapletState forall s. Snaplet s -> s
_snapletValue
local :: forall a. (v -> v) -> Handler b v a -> Handler b v a
local v -> v
f Handler b v a
m = do
v
cur <- forall r (m :: * -> *). MonadReader r m => m r
ask
forall s (m :: * -> *). MonadState s m => s -> m ()
put (v -> v
f v
cur)
a
res <- Handler b v a
m
forall s (m :: * -> *). MonadState s m => s -> m ()
put v
cur
forall (m :: * -> *) a. Monad m => a -> m a
return a
res
instance MonadSnaplet Handler where
getLens :: forall b v. Handler b v (SnapletLens (Snaplet b) v)
getLens = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall r (m :: * -> *). MonadReader r m => m r
ask
with' :: forall v v' b a.
SnapletLens (Snaplet v) v' -> Handler b v' a -> Handler b v a
with' !SnapletLens (Snaplet v) v'
l (Handler !Lensed (Snaplet b) (Snaplet v') Snap a
m) = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) v v' b a.
Monad m =>
ALens' v v' -> Lensed b v' m a -> Lensed b v m a
L.with SnapletLens (Snaplet v) v'
l Lensed (Snaplet b) (Snaplet v') Snap a
m
withTop' :: forall b v' a v.
SnapletLens (Snaplet b) v' -> Handler b v' a -> Handler b v a
withTop' !SnapletLens (Snaplet b) v'
l (Handler Lensed (Snaplet b) (Snaplet v') Snap a
m) = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b v' a v.
Monad m =>
ALens' b v' -> Lensed b v' m a -> Lensed b v m a
L.withTop SnapletLens (Snaplet b) v'
l Lensed (Snaplet b) (Snaplet v') Snap a
m
getOpaqueConfig :: forall b v. Handler b v SnapletConfig
getOpaqueConfig = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets forall s. Snaplet s -> SnapletConfig
_snapletConfig
runPureBase :: Handler b b a -> Snaplet b -> Snap a
runPureBase :: forall b a. Handler b b a -> Snaplet b -> Snap a
runPureBase (Handler Lensed (Snaplet b) (Snaplet b) Snap a
m) Snaplet b
b = do
(!a
a, Snaplet b
_) <- forall (m :: * -> *) t1 b t.
Monad m =>
Lensed t1 b m t -> ALens' t1 b -> t1 -> m (t, t1)
L.runLensed Lensed (Snaplet b) (Snaplet b) Snap a
m forall a. a -> a
id Snaplet b
b
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! a
a
getRoutePattern :: Handler b v (Maybe ByteString)
getRoutePattern :: forall b v. Handler b v (Maybe ByteString)
getRoutePattern =
forall (m :: * -> * -> * -> *) b v' a v.
MonadSnaplet m =>
SnapletLens (Snaplet b) v' -> m b v' a -> m b v a
withTop' forall a. a -> a
id forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM SnapletConfig -> Maybe ByteString
_scRoutePattern forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
setRoutePattern :: ByteString -> Handler b v ()
setRoutePattern :: forall b v. ByteString -> Handler b v ()
setRoutePattern ByteString
p = forall (m :: * -> * -> * -> *) b v' a v.
MonadSnaplet m =>
SnapletLens (Snaplet b) v' -> m b v' a -> m b v a
withTop' forall a. a -> a
id forall a b. (a -> b) -> a -> b
$
forall v b. (Snaplet v -> Snaplet v) -> Handler b v ()
modifySnapletState (forall s t a b. ASetter s t a b -> b -> s -> t
set (forall s. Lens' (Snaplet s) SnapletConfig
snapletConfig forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens' SnapletConfig (Maybe ByteString)
scRoutePattern) (forall a. a -> Maybe a
Just ByteString
p))
isLocalhost :: MonadSnap m => m Bool
isLocalhost :: forall (m :: * -> *). MonadSnap m => m Bool
isLocalhost = do
ByteString
rip <- forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Request -> ByteString
rqClientAddr forall (m :: * -> *). MonadSnap m => m Request
getRequest
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ByteString
rip [ ByteString
"127.0.0.1"
, ByteString
"localhost"
, ByteString
"::1" ]
failIfNotLocal :: MonadSnap m => m b -> m b
failIfNotLocal :: forall (m :: * -> *) b. MonadSnap m => m b -> m b
failIfNotLocal m b
m = do
Bool
isLocal <- forall (m :: * -> *). MonadSnap m => m Bool
isLocalhost
if Bool
isLocal then m b
m else forall (m :: * -> *) a. MonadSnap m => m a
pass
reloadSite :: Handler b v ()
reloadSite :: forall b v. Handler b v ()
reloadSite = forall (m :: * -> *) b. MonadSnap m => m b -> m b
failIfNotLocal forall a b. (a -> b) -> a -> b
$ do
SnapletConfig
cfg <- forall (m :: * -> * -> * -> *) b v.
MonadSnaplet m =>
m b v SnapletConfig
getOpaqueConfig
!Either Text Text
res <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ SnapletConfig -> IO (Either Text Text)
_reloader SnapletConfig
cfg
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall {m :: * -> *}. MonadSnap m => Text -> m ()
bad forall {m :: * -> *}. MonadSnap m => Text -> m ()
good Either Text Text
res
where
bad :: Text -> m ()
bad Text
msg = do
forall {m :: * -> *}. MonadSnap m => Text -> m ()
writeText forall a b. (a -> b) -> a -> b
$ Text
"Error reloading site!\n\n"
forall {m :: * -> *}. MonadSnap m => Text -> m ()
writeText Text
msg
good :: Text -> m ()
good Text
msg = do
forall {m :: * -> *}. MonadSnap m => Text -> m ()
writeText Text
msg
forall {m :: * -> *}. MonadSnap m => Text -> m ()
writeText forall a b. (a -> b) -> a -> b
$ Text
"Site successfully reloaded.\n"
bracketHandler :: IO a -> (a -> IO x) -> (a -> Handler b v c) -> Handler b v c
bracketHandler :: forall a x b v c.
IO a -> (a -> IO x) -> (a -> Handler b v c) -> Handler b v c
bracketHandler IO a
begin a -> IO x
end a -> Handler b v c
f = forall b v a.
Lensed (Snaplet b) (Snaplet v) Snap a -> Handler b v a
Handler forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b v (m :: * -> *) a.
(ALens' b v -> v -> b -> m (a, v, b)) -> Lensed b v m a
L.Lensed forall a b. (a -> b) -> a -> b
$ \ALens' (Snaplet b) (Snaplet v)
l Snaplet v
v Snaplet b
b -> do
forall a b c. IO a -> (a -> IO b) -> (a -> Snap c) -> Snap c
bracketSnap IO a
begin a -> IO x
end forall a b. (a -> b) -> a -> b
$ \a
a -> case a -> Handler b v c
f a
a of Handler Lensed (Snaplet b) (Snaplet v) Snap c
m -> forall b v (m :: * -> *) a.
Lensed b v m a -> ALens' b v -> v -> b -> m (a, v, b)
L.unlensed Lensed (Snaplet b) (Snaplet v) Snap c
m ALens' (Snaplet b) (Snaplet v)
l Snaplet v
v Snaplet b
b
data InitializerState b = InitializerState
{ forall b. InitializerState b -> Bool
_isTopLevel :: Bool
, forall b. InitializerState b -> IORef (IO ())
_cleanup :: IORef (IO ())
, forall b. InitializerState b -> [(ByteString, Handler b b ())]
_handlers :: [(ByteString, Handler b b ())]
, forall b. InitializerState b -> Handler b b () -> Handler b b ()
_hFilter :: Handler b b () -> Handler b b ()
, forall b. InitializerState b -> SnapletConfig
_curConfig :: SnapletConfig
, forall b. InitializerState b -> IORef Text
_initMessages :: IORef Text
, forall b. InitializerState b -> FilePath
_environment :: String
, forall b. InitializerState b -> (Snaplet b -> Snaplet b) -> IO ()
masterReloader :: (Snaplet b -> Snaplet b) -> IO ()
}
newtype Hook a = Hook (Snaplet a -> IO (Either Text (Snaplet a)))
instance Semigroup (Hook a) where
Hook Snaplet a -> IO (Either Text (Snaplet a))
a <> :: Hook a -> Hook a -> Hook a
<> Hook Snaplet a -> IO (Either Text (Snaplet a))
b = forall a. (Snaplet a -> IO (Either Text (Snaplet a))) -> Hook a
Hook forall a b. (a -> b) -> a -> b
$ \Snaplet a
s -> do
Either Text (Snaplet a)
ea <- Snaplet a -> IO (Either Text (Snaplet a))
a Snaplet a
s
case Either Text (Snaplet a)
ea of
Left Text
e -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Text
e
Right Snaplet a
ares -> do
Either Text (Snaplet a)
eb <- Snaplet a -> IO (Either Text (Snaplet a))
b Snaplet a
ares
case Either Text (Snaplet a)
eb of
Left Text
e -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Text
e
Right Snaplet a
bres -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Snaplet a
bres
instance Monoid (Hook a) where
mempty :: Hook a
mempty = forall a. (Snaplet a -> IO (Either Text (Snaplet a))) -> Hook a
Hook (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. b -> Either a b
Right)
#if !MIN_VERSION_base(4,11,0)
mappend = (<>)
#endif
newtype Initializer b v a =
Initializer (LT.LensT (Snaplet b)
(Snaplet v)
(InitializerState b)
(WriterT (Hook b) IO)
a)
deriving (forall a. a -> Initializer b v a
forall {b} {v}. Functor (Initializer b v)
forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v a
forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
forall a b.
Initializer b v (a -> b) -> Initializer b v a -> Initializer b v b
forall b v a. a -> Initializer b v a
forall a b c.
(a -> b -> c)
-> Initializer b v a -> Initializer b v b -> Initializer b v c
forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v a
forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
forall b v a b.
Initializer b v (a -> b) -> Initializer b v a -> Initializer b v b
forall b v a b c.
(a -> b -> c)
-> Initializer b v a -> Initializer b v b -> Initializer b v c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v a
$c<* :: forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v a
*> :: forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
$c*> :: forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
liftA2 :: forall a b c.
(a -> b -> c)
-> Initializer b v a -> Initializer b v b -> Initializer b v c
$cliftA2 :: forall b v a b c.
(a -> b -> c)
-> Initializer b v a -> Initializer b v b -> Initializer b v c
<*> :: forall a b.
Initializer b v (a -> b) -> Initializer b v a -> Initializer b v b
$c<*> :: forall b v a b.
Initializer b v (a -> b) -> Initializer b v a -> Initializer b v b
pure :: forall a. a -> Initializer b v a
$cpure :: forall b v a. a -> Initializer b v a
Applicative, forall a b. a -> Initializer b v b -> Initializer b v a
forall a b. (a -> b) -> Initializer b v a -> Initializer b v b
forall b v a b. a -> Initializer b v b -> Initializer b v a
forall b v a b. (a -> b) -> Initializer b v a -> Initializer b v b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Initializer b v b -> Initializer b v a
$c<$ :: forall b v a b. a -> Initializer b v b -> Initializer b v a
fmap :: forall a b. (a -> b) -> Initializer b v a -> Initializer b v b
$cfmap :: forall b v a b. (a -> b) -> Initializer b v a -> Initializer b v b
Functor, forall a. a -> Initializer b v a
forall b v. Applicative (Initializer b v)
forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
forall a b.
Initializer b v a -> (a -> Initializer b v b) -> Initializer b v b
forall b v a. a -> Initializer b v a
forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
forall b v a b.
Initializer b v a -> (a -> Initializer b v b) -> Initializer b v b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> Initializer b v a
$creturn :: forall b v a. a -> Initializer b v a
>> :: forall a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
$c>> :: forall b v a b.
Initializer b v a -> Initializer b v b -> Initializer b v b
>>= :: forall a b.
Initializer b v a -> (a -> Initializer b v b) -> Initializer b v b
$c>>= :: forall b v a b.
Initializer b v a -> (a -> Initializer b v b) -> Initializer b v b
Monad, forall a. IO a -> Initializer b v a
forall b v. Monad (Initializer b v)
forall b v a. IO a -> Initializer b v a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> Initializer b v a
$cliftIO :: forall b v a. IO a -> Initializer b v a
MonadIO)
makeLenses ''InitializerState
instance MonadSnaplet Initializer where
getLens :: forall b v. Initializer b v (SnapletLens (Snaplet b) v)
getLens = forall b v a.
LensT
(Snaplet b)
(Snaplet v)
(InitializerState b)
(WriterT (Hook b) IO)
a
-> Initializer b v a
Initializer forall r (m :: * -> *). MonadReader r m => m r
ask
with' :: forall v v' b a.
SnapletLens (Snaplet v) v'
-> Initializer b v' a -> Initializer b v a
with' !SnapletLens (Snaplet v) v'
l (Initializer !LensT
(Snaplet b)
(Snaplet v')
(InitializerState b)
(WriterT (Hook b) IO)
a
m) = forall b v a.
LensT
(Snaplet b)
(Snaplet v)
(InitializerState b)
(WriterT (Hook b) IO)
a
-> Initializer b v a
Initializer forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) v v' b s a.
Monad m =>
ALens' v v' -> LensT b v' s m a -> LensT b v s m a
LT.with SnapletLens (Snaplet v) v'
l LensT
(Snaplet b)
(Snaplet v')
(InitializerState b)
(WriterT (Hook b) IO)
a
m
withTop' :: forall b v' a v.
SnapletLens (Snaplet b) v'
-> Initializer b v' a -> Initializer b v a
withTop' !SnapletLens (Snaplet b) v'
l (Initializer LensT
(Snaplet b)
(Snaplet v')
(InitializerState b)
(WriterT (Hook b) IO)
a
m) = forall b v a.
LensT
(Snaplet b)
(Snaplet v)
(InitializerState b)
(WriterT (Hook b) IO)
a
-> Initializer b v a
Initializer forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b v' s a v.
Monad m =>
ALens' b v' -> LensT b v' s m a -> LensT b v s m a
LT.withTop SnapletLens (Snaplet b) v'
l LensT
(Snaplet b)
(Snaplet v')
(InitializerState b)
(WriterT (Hook b) IO)
a
m
getOpaqueConfig :: forall b v. Initializer b v SnapletConfig
getOpaqueConfig = forall b v a.
LensT
(Snaplet b)
(Snaplet v)
(InitializerState b)
(WriterT (Hook b) IO)
a
-> Initializer b v a
Initializer forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM forall b. InitializerState b -> SnapletConfig
_curConfig forall (m :: * -> *) b v s. Monad m => LensT b v s m s
LT.getBase
newtype SnapletInit b v = SnapletInit (Initializer b v (Snaplet v))