{- |
Module      :  Wai.Routes
Copyright   :  (c) Anupam Jain 2013
License     :  MIT (see the file LICENSE)

Maintainer  :  ajnsit@gmail.com
Stability   :  experimental
Portability :  non-portable (uses ghc extensions)

This package provides typesafe URLs for Wai applications.
-}
module Wai.Routes
    ( -- * Declaring Routes using Template Haskell
      parseRoutes
    , parseRoutesFile        -- | Parse routes declared in a file
    , parseRoutesNoCheck
    , parseRoutesFileNoCheck -- | Same as parseRoutesFile, but performs no overlap checking.

    , mkRoute
    , mkRouteSub

    -- * Dispatch
    , routeDispatch

    -- * URL rendering and parsing
    , showRoute
    , showRouteQuery
    , readRoute
    , showRouteMaster
    , showRouteQueryMaster
    , readRouteMaster
    , showRouteSub
    , showRouteQuerySub
    , readRouteSub

    -- * Application Handlers
    , Handler
    , HandlerS

    -- * Generated Datatypes
    , Routable(..)           -- | Used internally. However needs to be exported for TH to work.
    , RenderRoute(..)        -- | A `RenderRoute` instance for your site datatype is automatically generated by `mkRoute`
    , ParseRoute(..)         -- | A `ParseRoute` instance for your site datatype is automatically generated by `mkRoute`
    , RouteAttrs(..)         -- | A `RouteAttrs` instance for your site datatype is automatically generated by `mkRoute`

    -- * Accessing Raw Request Data
    , RequestData            -- | An abstract representation of the request data. You can get the wai request object by using `waiReq`
    , waiReq                 -- | Extract the wai `Request` object from `RequestData`
    , nextApp                -- | Extract the next Application in the stack
    , runNext                -- | Run the next application in the stack

    -- * Route Monad makes it easy to compose routes together
    , RouteM
    , DefaultMaster(..)
    , Route(DefaultRoute)
    , handler                -- | Add a wai-routes handler
    , catchall               -- | Catch all routes with the supplied application
    , defaultAction          -- | A synonym for `catchall`, kept for backwards compatibility
    , middleware             -- | Add another middleware to the app
    , route                  -- | Add another routed middleware to the app
    , waiApp                 -- | Convert a RouteM to a wai Application
    , toWaiApp               -- | Similar to waiApp, but result is wrapped in a monad. Kept for backwards compatibility

    -- * HandlerM Monad makes it easy to build a handler
    , HandlerM()
    , runHandlerM            -- | Run a HandlerM to get a Handler
    , mountedAppHandler      -- | Convert a full wai application to a HandlerS
    , request                -- | Access the request data
    , isWebsocket            -- | Is this a websocket request
    , reqHeader              -- | Get a particular request header (case insensitive)
    , reqHeaders             -- | Get all request headers (case insensitive)
    , maybeRootRoute         -- | Access the current route for root route
    , maybeRoute             -- | Access the current route
    , routeAttrSet           -- | Access the current route attributes as a set
    , rootRouteAttrSet       -- | Access the current root route attributes as a set
    , master                 -- | Access the master datatype
    , sub                    -- | Access the sub datatype
    , rawBody                -- | Consume and return the request body as ByteString
    , textBody               -- | Consume and return the request body as Text
    , jsonBody               -- | Consume and return the request body as JSON
    , header                 -- | Add a header to the response
    , status                 -- | Set the response status
    , file                   -- | Send a file as response
    , filepart               -- | Send a part of a file as response
    , stream                 -- | Stream a response
    , raw                    -- | Set the raw response body
    , rawBuilder             -- | Set the raw response body as a ByteString Builder
    , json                   -- | Set the json response body
    , plain                  -- | Set the plain text response body
    , html                   -- | Set the html response body
    , css                    -- | Set the css response body
    , javascript             -- | Set the javascript response body
    , asContent              -- | Set the contentType and a 'Text' body
    , next                   -- | Run the next application in the stack
    , getParams              -- | Get all params (query or post, not file)
    , getParam               -- | Get a particular param (query or post, not file)
    , getQueryParams         -- | Get all query params
    , getQueryParam          -- | Get a particular query param
    , getPostParams          -- | Get all post params
    , getPostParam           -- | Get a particular post param
    , getFileParams          -- | Get all file params
    , getFileParam           -- | Get a particular file param
    , setCookie              -- | Add a cookie to the response
    , getCookie              -- | Get a cookie from the request
    , getCookies             -- | Get all cookies from the request
    , reqVault               -- | Access the vault from the request
    , lookupVault            -- | Lookup a key in the request vault
    , updateVault            -- | Update the request vault

    -- * Bare Handlers
    , Env(..)
    , currentRoute           -- | Extract the current `Route` from `RequestData`

    , module Network.HTTP.Types.Status
    , module Network.Wai.Middleware.RequestLogger
  )
  where

import Routes.Routes
import Routes.Monad
import Routes.Handler
import Network.HTTP.Types.Status
import Network.Wai.Middleware.RequestLogger