content: {-# language NamedFieldPuns #-}
  module Web.Firefly.Types where
  
  import Control.Monad.Reader
  import Control.Monad.Except
  import qualified Network.Wai as W
  import qualified Data.Text as T
  import qualified Data.Map as M
  import qualified Data.CaseInsensitive as CI
  
  -- | The main application definition monad, sequence your
  -- route handlers and/or middleware in this monad
  type App a = ReaderT ReqContext (ExceptT W.Response IO) a
  
  -- | Handler is an alias for 'App', currently provided for semantic reasons,
  -- but the two may diverge in the future.
  type Handler a = ReaderT ReqContext IO  a
  
  -- | Runs a handler within an App WITHOUT rendering the response
  runHandler :: Handler r -> App r
  runHandler handler = ask >>= liftIO . runReaderT handler
  
  -- | A regex pattern for route matching.
  type Pattern = T.Text
  
  -- | A route as Text
  type Route = T.Text
  
  -- | A map of case insensitive header names to all provided values for that
  -- header.
  type HeaderMap = M.Map (CI.CI T.Text) [T.Text]
  
  -- | A map of query parameter names to all values provided for that parameter
  type MultiQueryMap = M.Map T.Text [T.Text]
  
  -- | A map of query parameter names to the last-provided value for that
  -- parameter
  type QueryMap = M.Map T.Text T.Text
  
  -- | A request or response's Content-Type value
  type ContentType = T.Text
  
  -- | Context provided when handling any request
  data ReqContext = ReqContext
    { requestBody :: T.Text
    , request :: W.Request
    }
  