packages feed

wai-route-1.0.0: examples/compose.hs

{-# LANGUAGE
    TypeApplications
  , DataKinds
  , GADTs
  , OverloadedStrings
#-}

module Examples.Wildcard where

import Data.Binary.Builder (toLazyByteString)
import Data.Text (Text)
import Data.Text.Lazy (fromStrict)
import Data.Text.Lazy.Encoding (encodeUtf8)
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Internal
import Network.Wai.Route
import Prelude

import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Lazy.Char8 as LC8
import qualified Data.Text as Text

-- $setup
-- >>> :set -XOverloadedStrings

-- Routes

prefixRoutes :: [Route IO]
prefixRoutes = [ defRoute (str "files" ./ end) filesHandler ]

otherRoutes :: [Route IO]
otherRoutes = [ defRoute (str "echo" ./ some @Text ./ end) echoHandler ]

filesHandler :: Params '[] -> App IO
filesHandler Nil rq send =
    let path = Text.intercalate "/" (pathInfo rq)
    in send (response200 (encodeUtf8 (fromStrict path)))

echoHandler :: Params '[Some Text] -> App IO
echoHandler (t ::: Nil) _rq send =
    send (response200 (encodeUtf8 (fromStrict t)))

response200 :: LC8.ByteString -> Response
response200 = responseLBS status200 []

-- Fake requests

filesReq :: Request
filesReq = defaultRequest { pathInfo = ["files","foo","bar","baz.jpg"] }

echoReq :: Request
echoReq = defaultRequest { pathInfo = ["echo","Hello"] }

bogusReq :: Request
bogusReq = defaultRequest { pathInfo = ["bogus"] }

-- Fake response sending

printResponse :: Response -> IO ResponseReceived
printResponse rs = do
    case rs of
        ResponseBuilder s _ b -> do
            putStr (show (statusCode s))
            putStr " "
            putStr (C8.unpack (statusMessage s))
            putStr ": "
            putStrLn (LC8.unpack (toLazyByteString b))
        _ -> return ()
    return ResponseReceived

-- Application

app :: App IO
app = routePrefix (compileRoutes prefixRoutes)
    $ route (compileRoutes otherRoutes)
    $ app404

-- $examples
--
-- >>> app filesReq printResponse
-- 200 OK: foo/bar/baz.jpg
--
-- >>> app echoReq printResponse
-- 200 OK: Hello
--
-- >>> app bogusReq printResponse
-- 404 Not Found: