firefly-0.2.0.0: src/Web/Firefly/Handler.hs
{-# language OverloadedStrings #-}
{-# language FlexibleContexts #-}
{-# language RankNTypes #-}
{-# language ViewPatterns #-}
module Web.Firefly.Handler
( route
) where
import Web.Firefly.Types
import Web.Firefly.Request
import Web.Firefly.Response
import Control.Monad
-- | Run a handler on a matching route.
-- The handler may return any type which implements 'ToResponse'
--
-- If a route matches any actions following it in the App monad will not be run.
--
-- Route patterns support pcre regex but do not yet support url parameters.
--
-- In the following example if we call @helloHarry@ then the @helloHandler@
-- will run, but NOT the helloHarryHandler since a matching route
-- ceases further execution.
-- For this reason the order you define your routes in matters.
--
-- > app :: App ()
-- > app = do
-- > route "/" indexHandler
-- > route "/hello.*" helloHandler
-- > route "/helloHarry" helloHarryHandler
route :: ToResponse r => Pattern -> Handler r -> App ()
route routePath handler = do
doesPathMatch <- pathMatches routePath
when doesPathMatch $ respondWith handler