-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | The frictionless WAI Framework -- @package Wheb @version 0.2.0.0 module Web.Wheb.Types -- | WhebT g s m -- --
-- (\"blog\" '</>' ('grabInt' \"pk\") '</>' \"edit\" '</>' ('grabText' \"verb\"))
--
(>) :: UrlPat -> UrlPat -> UrlPat
-- | Parses URL parameter and matches on Int
grabInt :: Text -> UrlPat
-- | Parses URL parameter and matches on Text
grabText :: Text -> UrlPat
-- | Constructors to use w/o OverloadedStrings
pT :: Text -> UrlPat
pS :: String -> UrlPat
-- | Build a Route from a UrlPat
patRoute :: (Maybe Text) -> StdMethod -> UrlPat -> WhebHandlerT g s m -> Route g s m
-- | Convert a UrlPat to a UrlParser
compilePat :: UrlPat -> UrlParser
-- | Represents root path /
rootPat :: UrlPat
-- | Lookup and cast a URL parameter to its expected type if it exists.
getParam :: Typeable a => Text -> RouteParamList -> Maybe a
-- | Convert URL chunks (split on /)
matchUrl :: [Text] -> UrlParser -> Maybe RouteParamList
-- | Runs a UrlParser with RouteParamList to a URL path
generateUrl :: UrlParser -> RouteParamList -> Either UrlBuildError Text
-- | Sort through a list of routes to find a Handler and
-- RouteParamList
findUrlMatch :: StdMethod -> [Text] -> [Route g s m] -> Maybe (WhebHandlerT g s m, RouteParamList)
-- | Sort through socket routes to find a match
findSocketMatch :: [Text] -> [SocketRoute g s m] -> Maybe (WhebSocket g s m, RouteParamList)
findSiteMatch :: [PackedSite g s m] -> [Text] -> Maybe (WhebHandlerT g s m)
-- | Test a parser to make sure it can match what it produces and vice
-- versa
testUrlParser :: UrlParser -> RouteParamList -> Bool
module Web.Wheb.InitM
addGET :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m ()
addPOST :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m ()
addPUT :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m ()
addDELETE :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m ()
addSite :: Text -> Site url (WhebHandlerT g s m) -> InitM g s m ()
addRoute :: Route g s m -> InitM g s m ()
addRoutes :: [Route g s m] -> InitM g s m ()
-- | Catch all requests regardless of method or path
catchAll :: WhebHandlerT g s m -> InitM g s m ()
addWhebSocket :: UrlPat -> WhebSocket g s m -> InitM g s m ()
-- | Add generic WAI middleware
addWAIMiddleware :: Middleware -> InitM g s m ()
-- | Add Wheb specific middleware
addWhebMiddleware :: WhebMiddleware g s m -> InitM g s m ()
-- | Wrapped addSetting' to help prevent monomorphism errors for
-- simple settings.
addSetting :: Text -> Text -> InitM g s m ()
-- | Adds a setting value, replacing it if its key already exists.
addSetting' :: Typeable a => Text -> a -> InitM g s m ()
addSettings :: CSettings -> InitM g s m ()
-- | Reads a file line by line and splits keys and values by ":". Uses
-- default Text.Read to try to match Int, Bool or
-- Float and will add specific typed settings for those.
readSettingsFile :: FilePath -> InitM g s m ()
-- | IO Actions to run after server has been stopped.
addCleanupHook :: IO () -> InitM g s m ()
-- | Generate WhebOptions from InitM in IO
generateOptions :: MonadIO m => InitM g s m (g, s) -> IO (WhebOptions g s m)
-- | Generate options for an application without a context or state
genMinOpts :: InitM () () IO () -> IO MinOpts
module Web.Wheb.Internal
-- | Convert WhebOptions to Application
optsToApplication :: WhebOptions g s m -> (forall a. m a -> IO a) -> Application
-- | Run all inner wheb monads to the top level.
runWhebHandler :: Monad m => WhebOptions g s m -> WhebHandlerT g s m -> InternalState s -> HandlerData g s m -> m EResponse
-- | Same as above but returns arbitrary type for debugging.
runDebugHandler :: Monad m => WhebOptions g s m -> WhebT g s m a -> HandlerData g s m -> m (Either WhebError a)
-- | Runs middlewares in order, stopping if one returns a response
runMiddlewares :: Monad m => WhebOptions g s m -> [WhebMiddleware g s m] -> HandlerData g s m -> m (Maybe Response, InternalState s)
runWhebMiddleware :: Monad m => WhebOptions g s m -> InternalState s -> HandlerData g s m -> WhebMiddleware g s m -> m (Maybe Response, InternalState s)
module Web.Wheb.WhebT
-- | Get the g in WhebT g s m g. This is a read-only
-- state so only thread-safe resources such as DB connections should go
-- in here.
getApp :: Monad m => WhebT g s m g
getWithApp :: Monad m => (g -> a) -> WhebT g s m a
-- | Get the s in WhebT g s m g. This is a read and
-- writable state so you can get and put information in your state. Each
-- request gets its own fresh state duplicated from our options
-- startingState
getHandlerState :: Monad m => WhebT g s m s
putHandlerState :: Monad m => s -> WhebT g s m ()
modifyHandlerState :: Monad m => (s -> s) -> WhebT g s m s
modifyHandlerState' :: Monad m => (s -> s) -> WhebT g s m ()
-- | Set a header for the response
setHeader :: Monad m => Text -> Text -> WhebT g s m ()
-- | Set a Strict ByteString header for the response
setRawHeader :: Monad m => Header -> WhebT g s m ()
-- | Return simple HTML from Text
html :: Monad m => Text -> WhebHandlerT g s m
-- | Return simple Text
text :: Monad m => Text -> WhebHandlerT g s m
-- | Give filepath and content type to serve a file from disk.
file :: Monad m => Text -> Text -> WhebHandlerT g s m
-- | Give content type and Blaze Builder
builder :: Monad m => Text -> Builder -> WhebHandlerT g s m
-- | Redirect to a given URL
redirect :: Monad m => Text -> WhebHandlerT g s m
-- | Help prevent monomorphism errors for simple settings.
getSetting :: Monad m => Text -> WhebT g s m (Maybe Text)
-- | Open up underlying support for polymorphic global settings
getSetting' :: (Monad m, Typeable a) => Text -> WhebT g s m (Maybe a)
-- | Get a setting or a default
getSetting'' :: (Monad m, Typeable a) => Text -> a -> WhebT g s m a
-- | Get all settings.
getSettings :: Monad m => WhebT g s m CSettings
-- | Get all route params.
getRouteParams :: Monad m => WhebT g s m RouteParamList
-- | Cast a route param into its type.
getRouteParam :: (Typeable a, Monad m) => Text -> WhebT g s m a
-- | Convert Either from getRoute' into an error in the Monad
getRoute :: Monad m => Text -> RouteParamList -> WhebT g s m Text
-- | Generate a route from a name and param list.
getRoute' :: Monad m => Text -> RouteParamList -> WhebT g s m (Either UrlBuildError Text)
-- | Generate the raw route
getRawRoute :: Monad m => Text -> RouteParamList -> WhebT g s m (Maybe (Route g s m))
-- | Access the request
getRequest :: Monad m => WhebT g s m Request
-- | Get a request header
getRequestHeader :: Monad m => Text -> WhebT g s m (Maybe Text)
getWithRequest :: Monad m => (Request -> a) -> WhebT g s m a
-- | Get params from URL (e.g. from '/foo/?q=4')
getQueryParams :: Monad m => WhebT g s m Query
-- | Maybe get one param if it exists.
getPOSTParam :: MonadIO m => Text -> WhebT g s m (Maybe Text)
-- | Get POST params as Text
getPOSTParams :: MonadIO m => WhebT g s m [(Text, Text)]
-- | Get the raw parsed POST data including files.
getRawPOST :: MonadIO m => WhebT g s m ([Param], [File ByteString])
-- | Convenience wrapper for runWhebServerT function in IO
runWhebServer :: (WhebOptions g s IO) -> IO ()
-- | Run a server with a function to run your inner Transformer to IO and
-- generated options
runWhebServerT :: (forall a. m a -> IO a) -> WhebOptions g s m -> IO ()
-- | Convenience wrapper for runRawHandlerT function in IO
runRawHandler :: WhebOptions g s IO -> WhebT g s IO a -> IO (Either WhebError a)
-- | Running a Handler with a custom Transformer
runRawHandlerT :: WhebOptions g s m -> (m (Either WhebError a) -> IO (Either WhebError a)) -> Request -> WhebT g s m a -> IO (Either WhebError a)
module Web.Wheb.Cookie
setCookie :: Monad m => Text -> Text -> WhebT g s m ()
setCookie' :: Monad m => Text -> Text -> SetCookie -> WhebT g s m ()
getCookie :: Monad m => Text -> WhebT g s m (Maybe Text)
getCookies :: Monad m => WhebT g s m CookiesText
removeCookie :: Monad m => Text -> WhebT g s m ()
-- | This module reexports Wheb modules. It should be the only thing you
-- need to import to get started.
--
-- -- import Web.Wheb -- import Data.Text.Lazy (pack) -- -- main :: IO () -- main = do -- opts <- generateOptions $ addGET (pack ".") rootPat $ (text (pack "Hi!")) -- runWhebServer opts --module Web.Wheb -- | Get the g in WhebT g s m g. This is a read-only -- state so only thread-safe resources such as DB connections should go -- in here. getApp :: Monad m => WhebT g s m g getWithApp :: Monad m => (g -> a) -> WhebT g s m a -- | Get the s in WhebT g s m g. This is a read and -- writable state so you can get and put information in your state. Each -- request gets its own fresh state duplicated from our options -- startingState getHandlerState :: Monad m => WhebT g s m s putHandlerState :: Monad m => s -> WhebT g s m () modifyHandlerState :: Monad m => (s -> s) -> WhebT g s m s modifyHandlerState' :: Monad m => (s -> s) -> WhebT g s m () -- | Return simple HTML from Text html :: Monad m => Text -> WhebHandlerT g s m -- | Return simple Text text :: Monad m => Text -> WhebHandlerT g s m -- | Give filepath and content type to serve a file from disk. file :: Monad m => Text -> Text -> WhebHandlerT g s m -- | Give content type and Blaze Builder builder :: Monad m => Text -> Builder -> WhebHandlerT g s m -- | Redirect to a given URL redirect :: Monad m => Text -> WhebHandlerT g s m -- | Set a header for the response setHeader :: Monad m => Text -> Text -> WhebT g s m () -- | Set a Strict ByteString header for the response setRawHeader :: Monad m => Header -> WhebT g s m () -- | Help prevent monomorphism errors for simple settings. getSetting :: Monad m => Text -> WhebT g s m (Maybe Text) -- | Open up underlying support for polymorphic global settings getSetting' :: (Monad m, Typeable a) => Text -> WhebT g s m (Maybe a) -- | Get a setting or a default getSetting'' :: (Monad m, Typeable a) => Text -> a -> WhebT g s m a -- | Get all settings. getSettings :: Monad m => WhebT g s m CSettings -- | Get all route params. getRouteParams :: Monad m => WhebT g s m RouteParamList -- | Cast a route param into its type. getRouteParam :: (Typeable a, Monad m) => Text -> WhebT g s m a -- | Convert Either from getRoute' into an error in the Monad getRoute :: Monad m => Text -> RouteParamList -> WhebT g s m Text -- | Generate a route from a name and param list. getRoute' :: Monad m => Text -> RouteParamList -> WhebT g s m (Either UrlBuildError Text) -- | Access the request getRequest :: Monad m => WhebT g s m Request -- | Get a request header getRequestHeader :: Monad m => Text -> WhebT g s m (Maybe Text) getWithRequest :: Monad m => (Request -> a) -> WhebT g s m a -- | Get params from URL (e.g. from '/foo/?q=4') getQueryParams :: Monad m => WhebT g s m Query -- | Maybe get one param if it exists. getPOSTParam :: MonadIO m => Text -> WhebT g s m (Maybe Text) -- | Get POST params as Text getPOSTParams :: MonadIO m => WhebT g s m [(Text, Text)] -- | Get the raw parsed POST data including files. getRawPOST :: MonadIO m => WhebT g s m ([Param], [File ByteString]) -- | Convenience wrapper for runWhebServerT function in IO runWhebServer :: (WhebOptions g s IO) -> IO () -- | Run a server with a function to run your inner Transformer to IO and -- generated options runWhebServerT :: (forall a. m a -> IO a) -> WhebOptions g s m -> IO () -- | Convenience wrapper for runRawHandlerT function in IO runRawHandler :: WhebOptions g s IO -> WhebT g s IO a -> IO (Either WhebError a) -- | Running a Handler with a custom Transformer runRawHandlerT :: WhebOptions g s m -> (m (Either WhebError a) -> IO (Either WhebError a)) -> Request -> WhebT g s m a -> IO (Either WhebError a) addGET :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m () addPOST :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m () addPUT :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m () addDELETE :: Text -> UrlPat -> WhebHandlerT g s m -> InitM g s m () addRoute :: Route g s m -> InitM g s m () addRoutes :: [Route g s m] -> InitM g s m () -- | Catch all requests regardless of method or path catchAll :: WhebHandlerT g s m -> InitM g s m () addWhebSocket :: UrlPat -> WhebSocket g s m -> InitM g s m () addSite :: Text -> Site url (WhebHandlerT g s m) -> InitM g s m () -- | Add generic WAI middleware addWAIMiddleware :: Middleware -> InitM g s m () -- | Add Wheb specific middleware addWhebMiddleware :: WhebMiddleware g s m -> InitM g s m () -- | Wrapped addSetting' to help prevent monomorphism errors for -- simple settings. addSetting :: Text -> Text -> InitM g s m () -- | Adds a setting value, replacing it if its key already exists. addSetting' :: Typeable a => Text -> a -> InitM g s m () addSettings :: CSettings -> InitM g s m () -- | Reads a file line by line and splits keys and values by ":". Uses -- default Text.Read to try to match Int, Bool or -- Float and will add specific typed settings for those. readSettingsFile :: FilePath -> InitM g s m () -- | IO Actions to run after server has been stopped. addCleanupHook :: IO () -> InitM g s m () -- | Generate WhebOptions from InitM in IO generateOptions :: MonadIO m => InitM g s m (g, s) -> IO (WhebOptions g s m) -- | Generate options for an application without a context or state genMinOpts :: InitM () () IO () -> IO MinOpts -- | Convert a UrlPat to a UrlParser compilePat :: UrlPat -> UrlParser -- | Represents root path / rootPat :: UrlPat -- | Allows for easier building of URL patterns This should be the primary -- URL constructor. -- --
-- (\"blog\" '</>' ('grabInt' \"pk\") '</>' \"edit\" '</>' ('grabText' \"verb\"))
--
(>) :: UrlPat -> UrlPat -> UrlPat
-- | Parses URL parameter and matches on Int
grabInt :: Text -> UrlPat
-- | Parses URL parameter and matches on Text
grabText :: Text -> UrlPat
-- | Constructors to use w/o OverloadedStrings
pT :: Text -> UrlPat
pS :: String -> UrlPat
-- | Show and pack into Text
spack :: Show a => a -> Text
-- | Monads in which IO computations may be embedded. Any monad
-- built by applying a sequence of monad transformers to the IO
-- monad will be an instance of this class.
--
-- Instances should satisfy the following laws, which state that
-- liftIO is a transformer of monads:
--
--
class Monad m => MonadIO (m :: * -> *)
liftIO :: MonadIO m => IO a -> m a
module Web.Wheb.Plugins.Session
data SessionContainer
SessionContainer :: r -> SessionContainer
class SessionApp a
getSessionContainer :: SessionApp a => a -> SessionContainer
class SessionBackend c
backendSessionPut :: (SessionBackend c, SessionApp a, MonadIO m) => Text -> Text -> Text -> c -> WhebT a b m ()
backendSessionGet :: (SessionBackend c, SessionApp a, MonadIO m) => Text -> Text -> c -> WhebT a b m (Maybe Text)
backendSessionDelete :: (SessionBackend c, SessionApp a, MonadIO m) => Text -> Text -> c -> WhebT a b m ()
backendSessionClear :: (SessionBackend c, SessionApp a, MonadIO m) => Text -> c -> WhebT a b m ()
setSessionValue :: (SessionApp a, MonadIO m) => Text -> Text -> WhebT a b m ()
getSessionValue :: (SessionApp a, MonadIO m) => Text -> WhebT a b m (Maybe Text)
getSessionValue' :: (SessionApp a, MonadIO m) => Text -> Text -> WhebT a b m Text
deleteSessionValue :: (SessionApp a, MonadIO m) => Text -> WhebT a b m ()
generateSessionKey :: (SessionApp a, MonadIO m) => WhebT a b m Text
getCurrentSessionKey :: (SessionApp a, MonadIO m) => WhebT a b m Text
clearSessionKey :: (SessionApp a, MonadIO m) => WhebT a b m Text
module Web.Wheb.Plugins.Auth
-- | Log a user in
login :: (AuthApp a, AuthState b, MonadIO m) => UserKey -> Password -> WhebT a b m (Either AuthError AuthUser)
-- | Log a user out
logout :: (AuthApp a, AuthState b, MonadIO m) => WhebT a b m ()
-- | Register a user
register :: (AuthApp a, MonadIO m) => AuthUser -> Password -> WhebT a b m (Either AuthError AuthUser)
-- | Get the current user from the handler state (Needs to be populated
-- first with authMiddleware)
getCurrentUser :: (AuthState b, MonadIO m) => WhebT a b m (Maybe AuthUser)
-- | Explicitly query a user with the backend. Since this is an IO hit, it
-- is better to use the middleware and getCurrentUser
queryCurrentUser :: (AuthApp a, MonadIO m) => WhebT a b m (Maybe AuthUser)
-- | Checks if a user is logged in with getCurrentUser and throws a
-- 500 if they aren't.
loginRequired :: (AuthState b, MonadIO m) => WhebHandlerT a b m -> WhebHandlerT a b m
-- | Auto-populates the handler state with the current user.
authMiddleware :: (AuthApp a, AuthState b, MonadIO m) => WhebMiddleware a b m
data AuthUser
AuthUser :: UserKey -> AuthUser
uniqueUserKey :: AuthUser -> UserKey
data AuthContainer
AuthContainer :: r -> AuthContainer
-- | Interface for creating Auth backends
class SessionApp a => AuthApp a
getAuthContainer :: AuthApp a => a -> AuthContainer
-- | Minimal implementation for a
class AuthState a
getAuthUser :: AuthState a => a -> PossibleUser
modifyAuthUser :: AuthState a => (PossibleUser -> PossibleUser) -> a -> a
-- | Interface for creating Auth backends
class AuthBackend c where backendLogout _ = getUserSessionKey >>= deleteSessionValue
backendLogin :: (AuthBackend c, AuthApp a, MonadIO m) => SessionApp a => UserKey -> Password -> c -> WhebT a b m (Either AuthError AuthUser)
backendRegister :: (AuthBackend c, AuthApp a, MonadIO m) => AuthUser -> Password -> c -> WhebT a b m (Either AuthError AuthUser)
backendGetUser :: (AuthBackend c, AuthApp a, MonadIO m) => UserKey -> c -> WhebT a b m (Maybe AuthUser)
backendLogout :: (AuthBackend c, AuthApp a, MonadIO m) => c -> WhebT a b m ()
data AuthError
DuplicateUsername :: AuthError
UserDoesNotExist :: AuthError
InvalidPassword :: AuthError
type UserKey = Text
type Password = Text
type PwHash = Text
makePwHash :: MonadIO m => Password -> WhebT a b m PwHash
verifyPw :: Text -> Text -> Bool
getUserSessionKey :: (AuthApp a, MonadIO m) => WhebT a b m Text
instance Show AuthError
instance Show AuthUser
module Web.Wheb.Plugins.Debug.MemoryBackend
data SessionData
SessionData :: TVar (Map Text (Map Text Text)) -> SessionData
sessionMemory :: SessionData -> TVar (Map Text (Map Text Text))
data UserData
UserData :: TVar (Map UserKey PwHash) -> UserData
userStorage :: UserData -> TVar (Map UserKey PwHash)
-- | In memory session backend. Session values will not persist after
-- server restart.
-- | In memory auth backend. User values will not persist after server
-- restart.
initSessionMemory :: InitM g s m SessionContainer
initAuthMemory :: InitM g s m AuthContainer
instance AuthBackend UserData
instance SessionBackend SessionData